我可以跳过 AWS CodePipeline 构建吗?

Can I skip an AWS CodePipeline build?

我目前正在 master 上开发个人项目。每次我推送到 origin master 时,都会在 CodePipeline 上触发构建。因为我是这个项目中唯一的开发人员并且不想在这个阶段打扰分支,所以跳过不必要的构建会很好。我不介意推到另一个分支,但这是一个小烦恼。

CodeShip 允许您通过在提交消息中包含 --skip-ciskip 构建。 CodePipeline 可以实现这样的功能吗?

None 我的 Google 搜索结果。 CodePipeline 文档也没有提及此类功能。

  • 这不是 CodePipeline 目前提供的功能。
  • 我很想知道为什么您认为某些构建是不必要的。您是否推送了一系列提交并且只想针对最后一次提交进行构建?这可能更适用于团队环境,但我倾向于为每次提交都构建一个,这样我就不会发现自己在我第一次推送代码并拿起并构建其他人的损坏代码的情况下建造.

我建议在构建管道之前在管道中进行人工审查。然后你就可以在准备构建时批准它了。

不想构建特定提交的一个正当理由是当您使用 CodeBuild 为您生成提交时。例如,我在 master 分支上有一些代码通过了所有测试。然后我想更新变更日志,package.json 版本并在新提交上创建一个 git 标记并将其推回 CodeCommit 存储库。

如果我在 Codebuild 上执行此操作,版本提交会触发另一个构建!鉴于提交的内容不会实质性地改变代码的行为,因此无需构建和测试此提交。

除此之外,亚马逊还应关注市场中的功能并尝试提供至少 功能对等。将 "skip-ci" 的 RegEx 检查添加到 CodeBuild 触发器代码最多需要几个小时才能实现。

默认情况下,codepipeline 创建一个 cloudwatch 事件,该事件会在特定分支的所有更改上触发您的管道。

您可以做的是设置此 cloudwatch 事件以触发 lambda 函数。此函数可以检查是否需要构建此提交并启动您的 CodePipeline。

以下是如何实现此目的的示例: https://aws.amazon.com/blogs/devops/adding-custom-logic-to-aws-codepipeline-with-aws-lambda-and-amazon-cloudwatch-events/

这是 lambda 函数的一个简单示例。它检查最后一次提交的消息中是否没有 [skip-CI] ,然后执行管道。 请记住,如果您的更改是一系列提交,则此代码仅检查最后一次提交您可能想要检查 oldCommitIdcommitId 之间的所有内容。

const AWS = require('aws-sdk');
const codecommit = new AWS.CodeCommit();
const codepipeline = new AWS.CodePipeline();

exports.handler = async (event) => {
    const { detail: { repositoryName, commitId, oldCommitId } } = event
    const { commit } = await codecommit.getCommit({
      commitId,
      repositoryName
    }).promise()

    if(commit.message.search(/\[skip-CI\]/) === -1) {
        const { pipelineExecutionId } = await codepipeline.startPipelineExecution({
            name: 'your-pipeline-name'
        }).promise()
        console.log(`Pipeline have started. Execution id: ${pipelineExecutionId}!`)        
    } else {
        console.log('Pipeline execution is not required')
    }
    return;
};