AWS CodePipeline 构建缺少 Git 历史记录

AWS CodePipeline build lacks Git history

上下文:

我设置了一个 CodePipeline,它使用 CodeCommit 和 CodeBuild 作为其源和构建阶段。

我的构建包含一个插件 (com.zoltu.git-versioning),它使用 Git 提交历史动态创建构建版本号。

问题:

这在 AWS 管道上失败,因为它无法在用于执行构建的源中找到任何 Git 信息。

很明显,用于检出源的操作使用了省略 Git 元数据和历史记录的导出。

问题:

如何配置 CodeCommit 或 CodePipeline 以执行正确的 git clone?我查看了这两个组件(以及 CodeBuild)的设置,但找不到任何配置来设置结帐操作使用的命令。

有人使用包含完整 Git 元数据的结帐构建 CodePipeline 吗?

CodePipeline 中的 CodeCommit 操作目前无法做到这一点。

https://forums.aws.amazon.com/thread.jspa?threadID=248267

尽管 CodePipeline 本身不支持此功能,但您可以通过在 CodeBuild 中克隆存储库来获取信息。

为此,您需要正确设置权限,然后仔细克隆存储库。

权限

要授予克隆存储库的权限,您需要:

  1. 使用您的 CodeCommit 存储库的资源 ARN 为您的 CodeBuild 角色授予 codecommit:GitPull 权限
  2. git-credential-helper: yes 放入构建规范文件的 env 部分

克隆存储库

要克隆存储库,您需要:

  1. 知道克隆 URL 和分支(CodeBuild 不知道这些信息)

  2. git reset 回到 CodeBuild 的提交 构建(否则您将在提交和构建之间出现竞争条件)。

    git reset "$CODEBUILD_RESOLVED_SOURCE_VERSION"
    

如果你想要示例,我已经制作了 detailed writeup of the process, and published an example CodePipeline stack showing it in action

截至 10 月,CodePipeline 支持 git 完整克隆: https://aws.amazon.com/about-aws/whats-new/2020/09/aws-codepipeline-now-supports-git-clone-for-source-actions/

在您的控制台中,转到源代码阶段并进行编辑。 您将有一个新选项来完全克隆您的 git 历史记录。 full clone option

在 Terraform 中,您必须将其添加到源操作的配置中:

      configuration = {
           RepositoryName       = var.repository_name
           BranchName           = "master"
           OutputArtifactFormat = "CODEBUILD_CLONE_REF"
         }

更多信息:

https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-codecommit-gitclone.html

是的,CodePipeline 现在支持 Git 完整克隆。 您只需要执行一些额外的步骤:https://docs.aws.amazon.com/codepipeline/latest/userguide/troubleshooting.html#codebuild-role-connections

但是,CodePipeline 目前不支持动态分支、Pull Requests。参见 Dynamically change branches on AWS CodePipeline

因此,如果您需要扩展 Pull Requests 的管道,我推荐上面 Timothy Jones 发布的方法。

还有一件事值得一提。 CodeBuild 也有完整克隆选项。

只要您不使用本地源缓存选项,Git 历史就在那里。

当我尝试使用上述缓存选项时,我注意到 .git 不是目录。这是一个包含一行文本的文件,例如:

gitdir: /codebuild/local-cache/workspace/9475b907226283405f08daf5401aba99ec6111f966ae2b921e23aa256f52f0aa/.git

我不知道为什么它目前是这样实现的,但它令人困惑(至少对我而言)并且我认为这不是预期的行为。