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 操作目前无法做到这一点。
尽管 CodePipeline 本身不支持此功能,但您可以通过在 CodeBuild 中克隆存储库来获取信息。
为此,您需要正确设置权限,然后仔细克隆存储库。
权限
要授予克隆存储库的权限,您需要:
- 使用您的 CodeCommit 存储库的资源 ARN 为您的 CodeBuild 角色授予
codecommit:GitPull
权限
- 将
git-credential-helper: yes
放入构建规范文件的 env
部分
克隆存储库
要克隆存储库,您需要:
知道克隆 URL 和分支(CodeBuild 不知道这些信息)
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
我不知道为什么它目前是这样实现的,但它令人困惑(至少对我而言)并且我认为这不是预期的行为。
上下文:
我设置了一个 CodePipeline,它使用 CodeCommit 和 CodeBuild 作为其源和构建阶段。
我的构建包含一个插件 (com.zoltu.git-versioning
),它使用 Git 提交历史动态创建构建版本号。
问题:
这在 AWS 管道上失败,因为它无法在用于执行构建的源中找到任何 Git 信息。
很明显,用于检出源的操作使用了省略 Git 元数据和历史记录的导出。
问题:
如何配置 CodeCommit 或 CodePipeline 以执行正确的 git clone
?我查看了这两个组件(以及 CodeBuild)的设置,但找不到任何配置来设置结帐操作使用的命令。
有人使用包含完整 Git 元数据的结帐构建 CodePipeline 吗?
CodePipeline 中的 CodeCommit 操作目前无法做到这一点。
尽管 CodePipeline 本身不支持此功能,但您可以通过在 CodeBuild 中克隆存储库来获取信息。
为此,您需要正确设置权限,然后仔细克隆存储库。
权限
要授予克隆存储库的权限,您需要:
- 使用您的 CodeCommit 存储库的资源 ARN 为您的 CodeBuild 角色授予
codecommit:GitPull
权限 - 将
git-credential-helper: yes
放入构建规范文件的env
部分
克隆存储库
要克隆存储库,您需要:
知道克隆 URL 和分支(CodeBuild 不知道这些信息)
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 完整克隆。
但是,CodePipeline 目前不支持动态分支、Pull Requests。参见 Dynamically change branches on AWS CodePipeline
因此,如果您需要扩展 Pull Requests 的管道,我推荐上面 Timothy Jones 发布的方法。
还有一件事值得一提。 CodeBuild 也有完整克隆选项。
只要您不使用本地源缓存选项,Git 历史就在那里。
当我尝试使用上述缓存选项时,我注意到 .git
不是目录。这是一个包含一行文本的文件,例如:
gitdir: /codebuild/local-cache/workspace/9475b907226283405f08daf5401aba99ec6111f966ae2b921e23aa256f52f0aa/.git
我不知道为什么它目前是这样实现的,但它令人困惑(至少对我而言)并且我认为这不是预期的行为。