Amazon web services CommitID作为贯穿整个代码管道的变量-AWS

Amazon web services CommitID作为贯穿整个代码管道的变量-AWS,amazon-web-services,docker,aws-codepipeline,aws-codebuild,Amazon Web Services,Docker,Aws Codepipeline,Aws Codebuild,我有一个创建docker图像并将其推送到ECR的管道。因为我想使用AWS提供的构建环境,所以我使用了两个构建阶段 管道共有3个阶段 从GitHub获取源代码:source 安装依赖项并创建.war文件:Build:aws/codebuild/java:openjdk-9 构建docker映像并将其推送到ECR:Build:aws/codebuild/docker:17.09.0 我想用提交ID标记docker图像,提交ID通常是CODEBUILD\u RESOLVED\u SOURCE\u版本。

我有一个创建docker图像并将其推送到ECR的管道。因为我想使用AWS提供的构建环境,所以我使用了两个构建阶段

管道共有3个阶段

  • 从GitHub获取源代码:source
  • 安装依赖项并创建.war文件:Build:aws/codebuild/java:openjdk-9
  • 构建docker映像并将其推送到ECR:Build:aws/codebuild/docker:17.09.0
  • 我想用提交ID标记docker图像,提交ID通常是CODEBUILD\u RESOLVED\u SOURCE\u版本。然而,我注意到这个变量只在我的第二个阶段中可用,它紧跟在源代码之后

    我发现最糟糕的情况是在第二阶段将这个变量写入一个文件,并将该文件包含在工件中,这是第三阶段的输入


    在我的第三阶段或整个管道中,有没有更好的方法使用它?

    我使用的是codepipeline+jq的组合。这不是最好的方法,但这是我迄今为止最好的方法

    commit=$(aws codepipeline get-pipeline-state --name PIPELINE_NAME | jq '.stageStates[0].actionStates[0].currentRevision.revisionId' | tr -d '"'))
    
    然后用新标签推送docker图像。您需要首先安装jq,如果您不喜欢jq,您可以自己解析响应


    这“可能”是

    的副本。您可以将提交ID写入代码管道工件中WAR文件旁边的文件吗

    还有一些相关的想法:

    • CodeBuild可以在CodePipeline中配置为具有多个输入 工件,所以我假设
      CODEBUILD\u RESOLVED\u SOURCE\u VERSION
      指 主要的人工制品。我不知道怎样才能概括得出结论 将ID提交到第三个操作(发布到ECR),因为扇入 (具有不同提交id的多个源)可以同时发生在 代码构建操作
    • 按提交ID进行标记意味着多个管道执行可能会生成具有相同标记的图像。理想情况下,我希望每个管道执行都是隔离的,这样我就不必担心标签被并发管道执行更改,或者以后使用不同的依赖项闭包

    我已经设法用jq和海绵做了一些事情,如本文件所示


    每次提交时,我都会修改config.json文件,并将其传递到下一个阶段

    你在这方面有什么进展吗?我也有同样的问题,我能想到的唯一一件事就是你提到的文件路由。一个警告:如果你从不同的阶段(即非
    stageStates[0]
    )执行此代码,如果触发新的管道执行并进入第一阶段,你可能会发现错误的提交id(或者根本没有)。