在 GitHub Actions 中切换环境变量

8

我使用Github Actions进行集成测试。

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

但是,它可以在配置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"

你能展示一个需要这个的工作流例子吗?这可能可以通过使用矩阵或条件步骤来解决。 - smac89
@smac89 我已经编辑过了。 - dan1st
你的测试在两个独立实例上并行运行时失败的原因是什么?另外,confToSwitch 包含什么样的值,它如何帮助测试? - smac89
它将使用令牌登录到一个服务,并向该服务发送消息。它会测试是否有来自自己用户的这些消息,并且如果同时使用相同的令牌多次登录,则会出现问题。 - dan1st
你考虑过使用矩阵配置吗?你可以将tokens作为矩阵的一部分,并且当任务运行时,所有的tokens都将在不同的任务中使用。 - smac89
我对矩阵配置一无所知,但我可以尝试。 - dan1st
1个回答

15
您可以尝试使用矩阵配置,示例如下:
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 }}的工作将解析为当前工作中列表中的一个令牌。
我认为还可以将您的令牌存储为secrets并设置矩阵,如下所示:
strategy:
  matrix:
    token: ["${{secrets.token1}}", "${{secrets.token2}}", etc...]

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

编辑

我找到了一个让密钥令牌起作用的技巧:

  1. 创建你的密钥并分别命名为token1token2等。
  2. 使用密钥名称(即密钥的名称)创建你的矩阵配置:
strategy:
  matrix:
    token: [token1, token2]

在您的工作环境中,创建以下环境变量:
env:
  token: ${{secrets[matrix.token]}}
  1. 现在每个构建矩阵的令牌实际值存储在环境变量${{env.token}}中(在表达式上下文中操作时),或者$token(在bash中)。

环境变量仍然保持机密,所以您不会失去任何东西。


这是否也可以使用秘密变量实现? - dan1st
@dan1st,我刚才评论了那个。我会进行测试并回复你的。 - smac89
@dan1st,看起来不可能。我得到了一个错误:无法识别的命名值:'secrets' - smac89
谢谢,但我有一个问题:现在这个任务被执行了两次。是否可能只执行一次? - dan1st
我会尝试解释我的问题:工作流在推送事件上执行。如果有连续两次推送,它将导致工作流并行运行。 - dan1st
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接