问题描述
在设置使用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
)失败,整个命令将返回成功的退出码,这可能会掩盖实际的问题。因此,建议使用条件判断语句来处理这种情况。