在 github 操作中切换环境变量

dan*_*1st 8 concurrency continuous-integration github github-actions

我使用 github 操作进行集成测试。

问题是,测试不应该在具有相同配置的多个实例上并行运行(测试会失败)。

但是,它可以在配置 1 下运行一次,在配置 2 下并行运行一次。

正如这篇博文所述,无法确保工作流不会并行运行。

有没有办法切换配置,配置1和配置2交替?

在这种情况下,具有相同配置的工作流工作流不太可能并行运行(如果需要,我可以添加更多配置)。

例如,这可以通过全局和可写的(对于工作流)变量变量交替为 1 或 2,并且工作流选择该配置。

示例工作流程(confToSwitch应该切换秘密):

name: test
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: "load configuration"
      run: echo "configuration=$conf" >> ./conf
      env:
        conf: ${{ secrets.confToSwitch }}
    - name: "integration tests"
      run: "mvn -B integration-test"
Run Code Online (Sandbox Code Playgroud)

sma*_*c89 10

您可以尝试使用以下matrix配置:

name: test
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        token: [token1, token2, etc...]
    steps:
    - uses: actions/checkout@v1
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: "load configuration"
      run: echo "configuration=$conf" >> ./conf
      env:
        conf: ${{ matrix.token }}
    - name: "integration tests"
      run: "mvn -B integration-test"
Run Code Online (Sandbox Code Playgroud)

这将创建N作业,其中N是列表中的令牌数量,并且每个作业conf: ${{ matrix.token }}将解析为当前作业的列表中的令牌。


我认为也可以将您的令牌存储为机密并设置矩阵,如:

strategy:
  matrix:
    token: ["${{secrets.token1}}", "${{secrets.token2}}", etc...]
Run Code Online (Sandbox Code Playgroud)

不过,我还没有测试过这个。

编辑

我发现了一个使秘密令牌起作用的技巧:

  1. 创建你的秘密,并给他们打电话token1token2
  2. 使用令牌(即机密的名称)创建矩阵配置:
strategy:
  matrix:
    token: [token1, token2]
Run Code Online (Sandbox Code Playgroud)
  1. 在您作业的 env 中,创建以下环境变量:
env:
  token: ${{secrets[matrix.token]}}
Run Code Online (Sandbox Code Playgroud)
  1. 现在,每个构建矩阵的令牌的实际值存储在环境变量中${{env.token}}(在表达式上下文中操作时)或$token(在 bash 中)。

环境变量仍然是一个秘密,所以你不会丢失任何东西。