如何执行Shell脚本?

5
├── .github
│   └── workflows
│       ├── cd.yml
│       └── ci.yml
├── scripts
│   ├── createDevEBAppVersion.sh
│   └── createProdEBAppVersion.sh
├── src

Github Actions 抛出以下错误:

/home/runner/work/_temp/9c99fa0d-20da-49ed-a0af-322f274c13ac.sh: 第1行:[refs/heads/develop: 没有那个文件或目录

/home/runner/work/_temp/9c99fa0d-20da-49ed-a0af-322f274c13ac.sh: 第5行:[[refs/heads/develop: 没有那个文件或目录

name: CD

env:
  PACKAGE_NAME          : "app_${GITHUB_SHA::8}.zip"
  ARTIFACT_ROOT         : "${GITHUB_REF#refs/*/}"
  APPLICATION_NAME      : "example-app-name"
  AWS_ACCESS_KEY_ID     : ${{ secrets.AWS_ACCESS_KEY }}
  AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_KEY }}
  AWS_REGION            : ${{ secrets.AWS_REGION }}
  AWS_BUCKET            : ${{ secrets.AWS_S3_BUCKET_NAME }}

on:
  push:
    branches:
      - develop
    paths-ignore:
      - '**.json'
      - '**.md'
  release:
    tags:
      - 'v*'

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Create ZIP package artifact
      run: git archive --format=zip HEAD -o ${{ env.PACKAGE_NAME }}

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    - name: Copy package artifact to S3 bucket
      run: |
        aws s3 cp ${{ env.PACKAGE_NAME }} s3://${{ env.AWS_BUCKET }}/${{ env.APPLICATION_NAME }}/
        echo "✔ Artifact uploaded successfully to s3://${{ env.AWS_BUCKET }}/${{ env.APPLICATION_NAME }}/${{ env.PACKAGE_NAME }}"

    - name: Create new ElasticBeanstalk Application Version
      working-directory: scripts
      run : |
        if ["${{ github.ref }}" == "refs/heads/develop"]; then
          chmod +x ./createDevEBAppVersion.sh
          ./createDevEBAppVersion.sh
        fi
        if [["${{ github.ref }}" == *"refs/tags/v"*]]; then
          chmod +x ./createProdEBAppVersion.sh
          ./createProdEBAppVersion.sh
        fi

    ...

我曾尝试过没有working-directory,但它并没有起作用。

#!/usr/bin/env bash

aws elasticbeanstalk create-application-version \
--application-name ${{ env.APPLICATION_NAME }} \
--source-bundle S3Bucket="${{ env.AWS_BUCKET }}",S3Key="${{ env.APPLICATION_NAME }}/${{ env.PACKAGE_NAME }}" \
--version-label "${{ env.PACKAGE_NAME }}" \
--description "Application version created from https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID"
echo "✔ Deployment triggered successfully."

看起来 CI 在寻找文件时出了问题。我如何执行 createDevEBAppVersion.sh

1个回答

7
你的错误信息是:
/home/runner/work/_temp/9c99fa0d-20da-49ed-a0af-322f274c13ac.sh: line 1: [refs/heads/develop: No such file or directory

它试图执行 [refs/heads/develop 却失败了。根本原因是方括号和测试之间缺少一个空格。您应该使用:

if [ "${{ github.ref }}" == "refs/heads/develop" ]; then

(第5行同理。)
这是因为在 Bourne Shell 中,if 实际上会运行一个命令进行评估。虽然它看起来像是评估一个表达式,但实际上它是将一个表达式传递给名为[的命令。
% ls -Flas /bin/\[
 8 -rwxr-xr-x  1 root  wheel  22704 May  4  2019 /bin/[*

这通常是一个符号链接 (或硬链接),指向/bin/test,并且在某些 shell 中,比如 bash 和 zsh,[ 实际上就是一个内置的命令:

% which '['
[: shell built-in command

但它仍然像一个命令一样运作,并且从语法上看,它需要这个空格。因为:
if [ true ]; then ...

运行 [ 命令(或 shell-builtin)来评估 /bin/true 命令。

if [true ]; then ...

尝试运行不存在的[true命令。

非常感谢。我不知道括号之间的空格是必需的。 - JeffMinsungKim
我还需要定义 working-directory: scripts 吗? - JeffMinsungKim
2
是的,如果您将它们称为 ./createProdEBAppVersion.sh。 您也可以运行 scripts/createProdEBAppVersion.sh 并省略 working-directory - Edward Thomson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接