【问题标题】:switch environment variable in github actions在 github 操作中切换环境变量
【发布时间】:2021-06-24 23:46:40
【问题描述】:

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

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

但是,它可以与配置 1 一起运行一次,然后与配置 2 并行运行一次。

正如this blog post 所述,无法确保工作流不会并行运行。

有什么办法可以切换配置,即配置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"

【问题讨论】:

  • 你能展示一个需要这个的示例工作流吗?这可能可以通过使用矩阵或条件步骤来解决
  • @smac89 我已经编辑过了。
  • 在两个单独的实例上并行运行时导致它失败的测试的性质是什么?还有confToSwitch 包含什么样的值,它对测试有什么帮助?
  • 它将使用令牌登录到服务并向该服务发送消息。它测试是否有自用户发送的那些消息,如果它使用相同的令牌并行登录多次则有问题。
  • 您是否考虑过使用矩阵配置?您可以使用 tokens 作为矩阵的一部分,当作业运行时,所有令牌将用于不同的作业。

标签: github concurrency continuous-integration github-actions


【解决方案1】:

您可以尝试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"

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


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

strategy:
  matrix:
    token: ["${{secrets.token1}}", "${{secrets.token2}}", etc...]

但是,我没有对此进行测试。

编辑

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

  1. 创建您的秘密并将其命名为 token1token2
  2. 使用令牌(即秘密名称)创建矩阵配置:
strategy:
  matrix:
    token: [token1, token2]
  1. 在您的作业环境中,创建以下环境变量:
env:
  token: ${{secrets[matrix.token]}}
  1. 现在,每个构建矩阵的令牌的实际值都存储在环境变量 ${{env.token}}(在表达式上下文中操作时)或 $token(在 bash 中)中。

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

【讨论】:

  • 秘密变量也可以吗?
  • @dan1st,我刚刚评论过。我会测试并回复你
  • @dan1st,看起来不可能。我收到一个错误:Unrecognized named-value: 'secrets'
  • @dan1st。我找到了让它工作的方法。查看新的编辑
  • 谢谢,但我有一个问题:现在作业执行了 2 次。是否可以只执行一次?
猜你喜欢
  • 2022-11-10
  • 2021-03-01
  • 2021-10-10
  • 2021-01-07
  • 1970-01-01
  • 2022-06-16
  • 2021-01-25
  • 2021-02-16
  • 2021-11-19
相关资源
最近更新 更多