解码base64的Github Secrets

114次阅读
没有评论

问题描述

在设置使用GitHub Actions/Workflows运行Cypress自动化测试的流水线时,遇到了一个问题。他想根据不同的分支生成动态的.env文件,以便根据分支不同设置不同的变量。为了实现这一目标,他创建了一个base64字符串,将其保存为GitHub Secrets,并在代码中访问这个Secrets。然而,在尝试解码时,他遇到了问题。以下是他的代码和问题的详细描述。

用户的流水线配置文件如下:

name: Nuxt CI Pipeline
on:
  push:
    branches: [ Cypress-reconfigure ]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 14.x ]
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - name: Generating .env files
      env:
        STAGING_ENV_FILE: ${{ secrets.STAGING_ENV_FILE }}
        PRODUCTION_ENV_FILE: ${{ secrets.PRODUCTION_ENV_FILE }}
      run: |
        [ "$GITHUB_REF_NAME" = Cypress-reconfigure ] && echo $STAGING_ENV_FILE | base64 --decode > .env
        [ "$GITHUB_REF_NAME" = staging ] && echo $PRODUCTION_ENV_FILE | base64 --decode > .env
    - run: cat .env
    - run: npm ci
    - run: npm run cy:ci

用户遇到的问题是,虽然他按照Stack Overflow上一个回答的方法设置了解码,但在运行时却遇到了错误。他不确定自己做错了什么,希望能够得到帮助。

解决方案

问题分析

用户在流水线配置中使用了以下代码来解码base64的Secrets:

[ "$GITHUB_REF_NAME" = Cypress-reconfigure ] && echo $STAGING_ENV_FILE | base64 --decode > .env
[ "$GITHUB_REF_NAME" = staging ] && echo $PRODUCTION_ENV_FILE | base64 --decode > .env

这里的问题在于,根据变量$GITHUB_REF_NAME的不同取值,只会有一个解码行被执行,而另一个解码行会返回一个非零的退出码。而GitHub Actions会在遇到非零退出码时中止执行。

解决方案

为了解决这个问题,可以使用条件判断语句来分别执行解码操作。以下是修改后的解决方案:

name: Nuxt CI Pipeline
on:
  push:
    branches: [ Cypress-reconfigure ]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 14.x ]
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - name: Generating .env files
      env:
        STAGING_ENV_FILE: ${{ secrets.STAGING_ENV_FILE }}
        PRODUCTION_ENV_FILE: ${{ secrets.PRODUCTION_ENV_FILE }}
      run: |
        if [ "$GITHUB_REF_NAME" = Cypress-reconfigure ]; then
          echo $STAGING_ENV_FILE | base64 --decode > .env
        fi
        if [ "$GITHUB_REF_NAME" = staging ]; then
          echo $PRODUCTION_ENV_FILE | base64 --decode > .env
        fi
    - run: cat .env
    - run: npm ci
    - run: npm run cy:ci

上述解决方案使用了if条件判断来分别判断$GITHUB_REF_NAME的值,从而确定是否执行相应的解码操作。这样,无论$GITHUB_REF_NAME的取值如何,都会有一个对应的解码操作被执行,避免了错误退出码导致流水线中止的问题。

请注意,上述解决方案中使用的是YAML的语法来描述GitHub Actions的流水线配置,以及在流水线中执行的步骤。通过以上修改,你应该能够成功解码base64的GitHub Secrets,并在不同分支下生成正确的.env文件。

【回复者注】如果你希望在shell命令中忽略错误并继续执行,可以使用 || true,但要注意这可能会导致错误的结果,因为如果命令(如 base64 --decode)失败,整个命令将返回成功的退出码,这可能会掩盖实际的问题。因此,建议使用条件判断语句来处理这种情况。

正文完