continuous-integration - 带有 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
解决方案
日志已经引出了一个很好的资源:https : //www.pulumi.com/docs/troubleshooting/#conflict 其实是app.pulumi.com提供的Pulumi状态管理的一个特性:
pulumi.com 提供的服务之一是并发控制。该服务一次最多允许一个用户更新一个特定的堆栈。
因此,只使用一个堆栈,如dev
app.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 工作流程文件设计可以通过以下步骤进行描述:
- 标准 Pulumi GitHub Action 管道:定义所需的变量,检查 repo,设置 nodejs 环境,包括。安装 npm 依赖项 - 最后使用action-install-pulumi-cli Action 配置 Pulumi CLI。
- 在 app.pulumi.com 上使用创建 Pulumi 堆栈,
pulumi stack init github-${{ github.run_id }}
类似于GitHub Action 默认上下文变量。此变量表示“存储库中每次运行的唯一编号”。github.run_id
- 在版本中利用(或多个)pulumi/actions@v2 Action
v2
(因为仅从v2 开始,我们有stack-name
配置选项)并配置 Pulumi app.pulumi.com 堆栈名称stack-name: github-${{ github.run_id }}
- 使用 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 概览也如下所示:
推荐阅读
- java - H2 的休眠多租户问题:错误的架构
- php - PHP 在没有 SSH/Console 的情况下在虚拟主机上调度任务
- excel - 如果找到匹配错误,我如何计算
- sequelize.js - 如何在 sequelize 查询中使用 LIKE 运算符?
- swift - 从 ViewController 访问 AppDelegate 中的对象
- python - Python 中的基本 if 语句如何工作?
- c - 检查项目是否在C中的数组中
- java - 如何将键入的查询转换为条件构建器对象?
- dax - 有没有办法在 DAX 中定义“列总数的百分比”度量,它可以动态地用于任何维度?
- java - 在netbeans中用分号自动格式化一行