首页 > 解决方案 > 带有 GitHub Actions 的 Pulumi 使并行工作流崩溃并出现错误:[409] 冲突:当前正在进行另一个更新。(例如翻新)

问题描述

由于提供了良好的 Actions,将 GitHub Actions 与 Pulumi 一起使用是一种很棒的体验。但我往往会遇到问题,即多个 GitHub Action 工作流并行运行(例如,当配置了renovate并尝试更新存储库依赖项时)。因此,要么第一个工作流程获胜并且可以完成工作 - 而其他工作流程则失败。或者每个工作流程都失败了(这也取决于 GitHub Action 工作流程设计)。然后我收到这样的错误(请参阅此处的完整日志):

#### :tropical_drink: `pulumi --non-interactive up`
Previewing update (dev)

View Live: https://app.pulumi.com/jonashackt/scmbreakoutpulumi/dev/previews/fbf45825-5d8f-45bc-ad3e-c55b7576313e


    pulumi:pulumi:Stack scmbreakoutpulumi-dev running 
    azure:core:ResourceGroup scm-breakout-rg-pulumi  
    azure:storage:Account scmbreakresources  
    azure:appservice:Plan asp-scmbreakoutrg  
    azure:storage:Container rawimages  
    azure:storage:Queue thumbnails  
    azure:storage:Container thumbnails  
 +  azure:appservice:AppService scmContactsApi create 
 +  azure:appservice:AppService scmResourceApi create 
 +  azure:appservice:FunctionApp scmFunctionApp create 
 +  azure:appservice:Slot scmResourceApiStg create 
    pulumi:pulumi:Stack scmbreakoutpulumi-dev  
 
Resources:
    + 4 to create
    7 unchanged

Updating (dev)

error: [409] Conflict: Another update is currently in progress.
To learn more about possible reasons and resolution, visit https://www.pulumi.com/docs/troubleshooting/#conflict

标签: continuous-integrationgithub-actionspulumi

解决方案


日志已经引出了一个很好的资源:https : //www.pulumi.com/docs/troubleshooting/#conflict 其实是app.pulumi.com提供的Pulumi状态管理的一个特性:

pulumi.com 提供的服务之一是并发控制。该服务一次最多允许一个用户更新一个特定的堆栈。

因此,只使用一个堆栈,如devapp.pulumi.com 上的默认堆栈,它看起来像这样:

在此处输入图像描述

使用 GitHub Actions 或其他 CI/CD 平台,这将成为一个障碍。我在这里看到了 2 个选项:我们可以切换到另一个 Pulumi 状态管理后端(例如Local Filesystem Backend,它不会在 app.pulumi.com 上创建堆栈,而是在本地创建 CI)。或者我们可以在 app.pulumi.com 上创建一个 GitHub Action 作业特定堆栈,其中堆栈以特定作业 ID 或其他名称命名。

因为我不介意在此处使用 app.pulumi.com - 并且还使用附加日志,如果确实出现问题 - 我想为第二个选项提供解决方案。GitHub Action 工作流程文件设计可以通过以下步骤进行描述:

  1. 标准 Pulumi GitHub Action 管道:定义所需的变量,检查 repo,设置 nodejs 环境,包括。安装 npm 依赖项 - 最后使用action-install-pulumi-cli Action 配置 Pulumi CLI。
  2. 在 app.pulumi.com 上使用创建 Pulumi 堆栈pulumi stack init github-${{ github.run_id }}类似于GitHub Action 默认上下文变量。此变量表示“存储库中每次运行的唯一编号”。github.run_id
  3. 在版本中利用(或多个)pulumi/actions@v2 Action v2(因为仅从v2 开始,我们有stack-name配置选项)并配置 Pulumi app.pulumi.com 堆栈名称stack-name: github-${{ github.run_id }}
  4. 使用 final 删除 Pulumi app.pulumi.com 堆栈pulumi stack rm github-${{ github.run_id }} -y

完整的 GitHub Action 工作流程如下所示:

name: pulumi-preview-up

on: [push]

env:
  ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
  ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
  ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
  ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
  PULUMI_ACCESS_TOKEN: ${{ secrets.PULUMI_ACCESS_TOKEN }}

jobs:
  preview-up-destroy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: In order to use the Pulumi v2 action, we need to setup the Pulumi project specific language environment
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: After setting up the Pulumi project specific language environment, we need to install the dependencies also (see https://github.com/pulumi/actions#example-workflows)
        run: npm install

      - name: Install Pulumi CLI so that we can create a GHA pipeline specific Pulumi Stack
        uses: pulumi/action-install-pulumi-cli@v1.0.1

      - name: Create GHA pipeline specific Pulumi Stack incl. Azure location
        run: |
          pulumi stack init github-${{ github.run_id }}
          pulumi config set azure:location WestEurope

      - uses: pulumi/actions@v2
        with:
          command: preview
          stack-name: github-${{ github.run_id }}

      - uses: pulumi/actions@v2
        with:
          command: up
          stack-name: github-${{ github.run_id }}

      - uses: pulumi/actions@v2
        with:
          command: destroy
          stack-name: github-${{ github.run_id }}

      - name: Remove the GHA pipeline specific Pulumi Stack
        run: |
          pulumi stack rm github-${{ github.run_id }} -y

现在,当并行运行多个 GitHub Actions 工作流时,app.pulumi.com 概览也如下所示:

在此处输入图像描述


推荐阅读