避免 cdk 引导程序中的竞争条件 - 测试和部署管道的并发运行

Mit*_*aff 7 aws-cdk

我有一个生产升级测试管道,在每个 PR 上运行,它将部署生产副本到测试帐户,然后使用功能分支上的内容进行升级。这样做是为了确保生产升级始终成功。步骤是:

\n
    \n
  1. 引导并将主分支部署到预生产 AWS 帐户
  2. \n
\n
    \n
  • git checkout master
  • \n
  • cdk bootstrap --force aws://unknown-account/ap-southeast-2
  • \n
  • cdk deploy --all --require-approval never --change-set-name "ci-${GITHUB_RUN_ID}"
  • \n
\n
    \n
  1. 引导并将功能分支部署到同一帐户
  2. \n
\n
    \n
  • git checkout feature
  • \n
  • cdk bootstrap aws://unknown-account/ap-southeast-2
  • \n
  • cdk deploy --all --require-approval never --change-set-name "ci-${GITHUB_RUN_ID}"
  • \n
\n

昨天,我们在将 aws-cdk 升级到 1.108.0 时遇到了问题。上述第二步部署失败,但该步骤仍成功将 AWS 账户引导至版本 6。(5 -> 6)

\n

当第二次重新运行作业时,我们在管道中运行第一步时收到如下问题:

\n
 \xe2\x9d\x8c   Environment aws://unknown-account/ap-southeast-2 failed bootstrapping: Error: Not downgrading existing bootstrap stack from version \'6\' to version \'5\'. Use --force to force.\n
Run Code Online (Sandbox Code Playgroud)\n

我们通过--force在管道第一步引导时使用该标志来解决此错误,以便在我们的测试帐户中完全重新创建生产环境。

\n

但现在因为我们正在使用--force,我们每次运行管道时都会引导帐户,这无意中在我们的测试帐户中的所有并发 PR 和引导堆栈之间创建了竞争条件,每当 2 个测试作业时都会收到如下错误同时运行。

\n
 \xe2\x9d\x8c  Environment aws://unknown-account/ap-southeast-2 failed bootstrapping: InvalidChangeSetStatus: Cannot delete ChangeSet in status CREATE_IN_PROGRESS\n
Run Code Online (Sandbox Code Playgroud)\n

最好的方法是什么

\n
    \n
  1. 特别允许在 cdk bootstrap 中降级而不使用--force标志
  2. \n
  3. 如果做不到这一点,避免这种竞争条件?
  4. \n
\n

我们已经研究过也许使用--qualifiercdk bootstrap 上的标志为每个测试运行创建一个引导程序,但认为由于未实现https://github.com/aws/aws-cdk/issues/986这可能不会真是个好主意。

\n

小智 1

我们通过向|| true脚本添加 a 来解决这个问题,这样即使脚本返回错误,该步骤也会成功。

如果新帐户中的新设置确实发生了真正的错误,那么接下来的cdk deploy步骤无论如何都会失败,因为引导的上一步已经失败,这确实允许我们从日志中调查问题。