如何执行shell脚本?

Jef*_*Kim 4 bash github-actions

??? .github
?   ??? workflows
?       ??? cd.yml
?       ??? ci.yml
??? scripts
?   ??? createDevEBAppVersion.sh
?   ??? createProdEBAppVersion.sh
??? src
Run Code Online (Sandbox Code Playgroud)

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: line 5: [[refs/heads/develop: No such file or directory

??? .github
?   ??? workflows
?       ??? cd.yml
?       ??? ci.yml
??? scripts
?   ??? createDevEBAppVersion.sh
?   ??? createProdEBAppVersion.sh
??? src
Run Code Online (Sandbox Code Playgroud)

我试过没有working-directory,但没有奏效。

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

    ...
Run Code Online (Sandbox Code Playgroud)

似乎 CI 在查找文件时遇到了问题。我该如何执行createDevEBAppVersion.sh

Edw*_*son 7

你的错误信息是:

/home/runner/work/_temp/9c99fa0d-20da-49ed-a0af-322f274c13ac.sh: line 1: [refs/heads/develop: No such file or directory
Run Code Online (Sandbox Code Playgroud)

它正在尝试执行但[refs/heads/develop失败了。根本原因是您在括号和测试之间缺少空格。你要:

if [ "${{ github.ref }}" == "refs/heads/develop" ]; then
Run Code Online (Sandbox Code Playgroud)

(第 5 行也是如此。)

那是因为if在 bourne shell 中实际上运行了一个它评估的命令。尽管它看起来像是在评估一个表达式,但它实际上是将一个表达式传递给名为[.

% ls -Flas /bin/\[
 8 -rwxr-xr-x  1 root  wheel  22704 May  4  2019 /bin/[*
Run Code Online (Sandbox Code Playgroud)

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

% which '['
[: shell built-in command
Run Code Online (Sandbox Code Playgroud)

但它仍然表现得像一个命令,并且在语法上,它需要空间。因为:

if [ true ]; then ...
Run Code Online (Sandbox Code Playgroud)

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

if [true ]; then ...
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,如果您将它们称为“./createProdEBAppVersion.sh”。您还可以运行“scripts/createProdEBAppVersion.sh”并省略“工作目录” (2认同)