使用AWS CodeStar和JFrog Artifactory的云原生CI/CD管道

想要为云上的新项目简化DevOps工具链吗?想要管理、存储、共享和版本化二进制工件吗?现在是探索由AWS CodeStar和JFrog Artifactory提供的复合解决方案的时候了。

当决定启动一个新项目时,技术公司和企业解决方案提供商在设置他们的DevOps组件时经常会遇到障碍。过多的工具,每个工具都有复杂的配置,需要集成到协同管道中,这减慢了进度,增加了成本。

让我们看看通过AWS CodeStar实现的CI/CD,以及在实现DevOps工具链时可能面临的几个挑战。

AWS CodeStar允许团队在AWS上快速开发、构建和部署应用程序和微服务。然而,缺少通用二进制存储库带来了挑战。在这样的实现中,单个项目连接到多个二进制存储库和存储源,如Docker Hub、ECR、Maven Central、npmjs、RubyGems、S3等。

让我们看看一个实时解决方案,其中一个AWS CodeStar项目构建并部署了一个Java web应用程序。实现该解决方案需要使用以下工具:

  • CodeCommit作为一个版本控制服务
  • CodeBuild来构建应用程序
  • CodeDeploy将应用程序部署到生产环境
  • CodePipeline通过连接上述工具来构建CI/CD管道

这个简单项目的依赖关系来自多个源,比如ECR、S3、Maven Central和npmjs(用于npm)。图1说明了该解决方案的工作流程。

图1所示。使用AWS CodeStar实现CI/CD管道

如图1所示,管道中有多个二进制提供程序,这带来了几个挑战:

  • 管理多个配置和提供商的维护成本更高
  • 缺乏找出二进制文件的来源(CI作业/源代码修订)的可追溯性
  • 缺乏元数据形式的上下文
  • 政策执行困难

通常,对于多个二进制提供程序,最棘手的问题是确保使用的是任何类型的二进制文件的正确版本。例如,测试或扫描的二进制文件与快照或易受攻击的二进制文件版本。

想象一个有多个CodeStar项目和跨项目依赖关系的场景。在微服务的世界里,挑战被放大了,因为我们有多个专注于微的应用程序在努力解决一个更大的挑战。该解决方案涉及多个AWS CodeStar项目(即每个微服务一个)和跨项目依赖关系。图2演示了一个由几个CodeStar项目和依赖项组成的工作解决方案。

带有依赖的多个CodeStar项目

图2。多个CodeStar项目和依赖项

由于团队结构、体系结构或工作方式不同,可能会产生跨项目的依赖关系CI / CD管道是如何实现的。例如,图2中的项目1负责构建web应用程序,而项目2(由DevOps团队拥有)负责将其容器化并最终将解决方案部署到生产环境中。在这种情况下,管理来自多个存储库的多种类型的跨项目二进制文件会增加总体的复杂性。缺乏单一的事实来源或通用二进制存储库使得策略执行的实现变得困难。

解决这些挑战的解决方案是使用通用二进制存储库,它将作为所有二进制文件的单一事实来源。这是在一个地方管理不同类型的多个二进制文件及其相关元数据的最实用的方法。这就是JFrog Artifactory提供解决方案的地方!好消息是AWS CodeStar集成了JFrog Artifactory。这种集成允许Artifactory作为跨多个AWS服务(如CodeBuild和CodeDeploy)的所有类型二进制文件的单一事实来源。更有趣的是,相同的Artifactory实例还充当跨项目(AWS CodeStar项目)依赖关系的单一事实来源,并提供额外的好处,例如详尽的构建信息(BuildInfo)、推广、可追溯性,以及对所有主要的开发技术.图3演示了AWS CodeStar和JFrog Artifactory的复合解决方案。

图3。AWS CodeStar和JFrog Artifactory的复合解决方案

集成JFrog Artifactory与AWS CodeStar

下面的步骤将引导您完成Artifactory与CodeStar的集成过程。有关使用CodeStar和Artifactory在AWS上构建和部署应用程序的详细信息,请转到AWS CodeStar主页.另外,得到一个免费的试用许可证(如有需要)。为了帮助你,我们创建了这个aGitHub项目它包括用于构建和部署容器化Java web应用程序的脚本和配置文件,这与本文中使用的示例类似。

首先在AWS CodeStar中创建两个Java项目(AWS CodeStar ->创建一个新项目)。在“应用程序类别”下选择“Web应用程序”,在“编程语言”下选择“Java”,在“AWS服务”下选择“Amazon EC2”。例如,我们将这两个项目命名为“demo-java-app”和“demo-docker-framework”。包括构建和部署文件在内的项目文件将在默认情况下创建,可以通过AWS CodeCommit查看。

更新“demo-java-app”项目buildspec.yml使用以下3步方法集成JFrog Artifactory:

  1. 创建一个SecureString参数ParameterStore来存储Artifactory凭据。建议不要使用环境变量来存储凭据。

创建SecureString参数

a.指定新创建的SecureStringARTIFACTORY_CREDENTIALS作为buildspec.yml的一部分。

env: parameter-store: ARTIFACTORY_API_KEY: "ARTIFACTORY_CREDENTIALS"

b.必须在CodeBuild服务角色下创建角色策略,以允许访问ParameterStore2022世界杯阿根廷预选赛赛程资源。浏览到角色并找到代码构建项目的现有角色名称。添加内联策略,如下所示:

{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": ["ssm: descripbeparameters "], "Resource": "*"}, {"Effect": "Allow", "Action": ["ssm:GetParameters"], "Resource": ["arn:aws:ssm:us-west-2:1xxxxxxxxxxx:parameter/ARTIFACTORY_CREDENTIALS", "arn:aws:ssm:us-west-2:1xxxxxxxxxxx:parameter/M2C_RT_API_KEY"]}]}

控件中了解有关控制对系统管理器参数的访问的更多信息Amazon EC2系统管理器用户指南

2.编辑CodeBuild项目,在高级设置下添加以下环境变量:

环境变量 描述
ARTIFACTORY_URL Artifactory URL。例如,https://my-artifactory/artifactory
ARTIFACTORY_USER 具有读写权限的人工用户名。
ARTIFACTORY_MVN_REPO 人工Maven存储库URL。建议使用a虚拟存储库URL。例如,
https://my-artifactory/artifactory/libs-release

3.更新后的buildspec.yml文件执行如下操作:

  • 下载必要的包
  • 配置Maven指向Artifactory
  • 构建Maven项目
  • 将包含元数据的二进制文件发布到Artifactory

a.下载必要的软件包,包括JFrog CLI。

install:命令:—echo进入安装阶段…- wget https://jcenter.bintray.com/org/apache/maven/apache-maven/3.3.9/ apache maven - 3.3.9-bin.tar.gz - tar XZVF apache-maven-3.3.9-bin.tar.gz - c /opt/ - export PATH=/opt/apache-maven-3.3.9/bin:$PATH - wget https://dl.bintray.com/jfrog/jfrog-cli——去/ 1.12.1/ jfrog -cli-linux-amd64/jfrog - chmod +x jfrog

b.配置Mavensettings.xml指向Artifactory。完整的文件可以下载JFrog在GitHub上的AWS CodeStar示例

pre_build:命令:—echo进入pre_build阶段…- ./jfrog rt config——url $ARTIFACTORY_URL——user $ARTIFACTORY_USER——apikey $ARTIFACTORY_API_KEY - sed -i -e 's|ARTIFACTORY_USER|${ARTIFACTORY_USER}|g' settings.xml && sed -i -e 's|ARTIFACTORY_PASSWORD|${ARTIFACTORY_API_KEY}|g' settings.xml && sed -i -e 's|ARTIFACTORY_MVN_REPO|${ARTIFACTORY_MVN_REPO}|g' settings.xml

c.构建Maven项目。

build: command: - echo进入构建阶段…mvn -s settings.xml -f pom.xml编译- mvn -s settings.xml -f pom.xml包

d.向Artifactory发布二进制文件和构建信息。

post_build:命令:—echo进入post_build阶段…- echo Build completed on ' date ' i - ./jfrog rt u "*。- ./jfrog rt bce codestar-demo-java-app $CODEBUILD_BUILD_ID - ./jfrog rt bp codestar-demo-java-app $CODEBUILD_BUILD_ID ./jfrog rt bp codestar-demo-java-app $CODEBUILD_BUILD_ID ./jfrog rbp code -release-local——build-name=codestar-demo-java-app——build-number=$CODEBUILD_BUILD_ID

执行上述步骤将创建并发布Java web应用程序以及元数据。

下一步是使用“demo-docker-framework”项目将web应用程序容器化。

更新“demo-docker-framework”项目的buildspec.ymlappspec.yml还有其他帮手脚本使用以下四步方法将构建和部署过程与Artifactory集成:

1.在“demo-docker-framework”项目的EC2实例上安装Docker。项目使用的EC2实例可以在“项目资源”部分(AWS CodeStar->$ project -> project)下找到。2022世界杯阿根廷预选赛赛程

2.创建或使用现有的SecureString参数(ParameterStore资源)来存储Artifactory凭据。确保更新“demo-docker-framework”项目的CodeBuild服务角色的角色策略,以允许访问ParameterStore2022世界杯阿根廷预选赛赛程资源。

3.更新CodeBuild项目(AWSCodeStar->$ project ->CodeBuild->Edit project)

  • 将当前映像(构建器代理)设置为指向码头工人:17.06.0-ce-dind
  • 选择“特权”标志。这一步允许创建docker镜像。
  • 添加环境变量(在高级设置下)
环境变量 描述
ARTIFACTORY_URL Artifactory URL。例子:https://my-artifactory/artifactory
ARTIFACTORY_USER 人工用户名。该用户应该具有读/写权限。
ARTIFACTORY_MVN_REPO Artifactory Maven存储库,包含需要容器化的Maven工件(在本例中是java web应用程序)。例子:libs-release-local
WEB_APPLICATION_PATH 存储库中包含maven工件(在本例中是java web应用程序)的子文件夹(如果有的话)。例子:目标/
WEB_APPLICATION_NAME web应用程序的名称。例子:ROOT-1.0.war
ARTIFACTORY_DOCKER_REPO 人工Docker注册表.例子:rt-docker.jfrog.io
IMAGE_TAG 动态版本,它将是作为构建的一部分创建的docker映像的标签之一。例如:latest, latest1等。注意,除了动态标记之外,还有一个反映CodeBuild ID的静态标记。

4.更新后的buildspec.yml文件配置dind来构建docker映像,安装所需的包,利用访问令牌与Artifactory进行身份验证,构建docker映像并将docker映像与构建信息(元数据)一起发布到Artifactory,并更新部署脚本。

a.配置dind(构建docker镜像)并安装所需的软件包

安装:命令:- echo进入安装阶段……- nohup /usr/当地的/箱子/ dockerd——主机= unix: / / / var /运行/码头工人。Sock——host=tcp://0.0.0.0:2375——storage-driver=vfs&-超时-t 15 sh -c "until docker info;做回声。睡眠1;完成”- apk添加——no-cache——更新openssl curl jq

b.创建访问令牌在Artifactory。建议使用访问令牌,因为它在可配置的时间后过期,也可以被撤销。

pre_build:命令:—echo进入pre_build阶段…- export RESPONSE=$(curl - h "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" - xpost "$ARTIFACTORY_URL/api/security/token" -d "username=$ARTIFACTORY_USER" -d "scope=member-of-groups:writers" -d "expires_in=600") - export ACCESS_TOKEN=$(echo "$RESPONSE"| jq -r .access_token) - docker login -u $ARTIFACTORY_USER -p $ACCESS_TOKEN $ARTIFACTORY_DOCKER_REPO

默认情况下,存在一个“readers”组。建议创建并使用一个新组“writers”,以便访问令牌可用于RW操作。关于组的更多信息位于JFrog Artifactory用户指南.除凭据外,所有其他参数比如Docker注册表名称,URL等通过环境变量获取。详情请浏览我们的网页Docker框架在GitHub的例子

c.运行docker build (dockerfile),并静态地标记docker映像,使其指向CODEBUILD_BUILD_ID

build: command: - echo进入构建阶段…- echo Build开始于“日期”- curl - o - h "X-JFrog-Art-Api:$ARTIFACTORY_API_KEY" $ARTIFACTORY_URL/$ARTIFACTORY_MVN_REPO/$WEB_APPLICATION_PATH$WEB_APPLICATION_NAME - docker build -t $ARTIFACTORY_DOCKER_REPO/我的-app-image: $ IMAGE_TAG—没有-cache——build-arg WEB_APPLICATION_NAME=$WEB_APPLICATION_NAME。- echo标记docker镜像的静态标签$(echo $CODEBUILD_BUILD_ID | sed 's/:/-/') - docker标签$ARTIFACTORY_DOCKER_REPO/我的-app-image: IMAGE_TAG ARTIFACTORY_DOCKER_REPO /美元我的-app-image: $ (echo $ CODEBUILD_BUILD_ID | sed ' s /: / / ')

d.将docker镜像发布到Artifactory,并使用访问令牌、docker镜像名称和标签修改部署文件

post_build:命令:—echo进入post_build阶段…- echo Build completed on ' date ' - export STATIC_TAG=$(echo $CODEBUILD_BUILD_ID | sed 's/:/-/') - dockerARTIFACTORY_DOCKER_REPO美元/我的-app-image:$IMAGE_TAG - dockerARTIFACTORY_DOCKER_REPO美元/我的-app-image:$STATIC_TAG - sed - $STATIC_TAG|g" scripts/start_server - sed -i -e "s|STATIC_TAG|$STATIC_TAG|g" scripts/install_dependencies - sed -i -e "s|ACCESS_TOKEN|$ACCESS_TOKEN|g" scripts/install_dependencies - sed -i -e "s|ARTIFACTORY_USER|$ARTIFACTORY_USER|g" scripts/install_dependencies - sed -i -e "s|ARTIFACTORY_DOCKER_REPO|$ARTIFACTORY_DOCKER_REPO|g" scripts/install_dependencies

正如你所看到的,AWS CodeStar允许团队在AWS上快速开发、构建和部署应用程序和微服务;有了JFrog Artifactory的集成,您现在就可以用一个构建的真实源来管理这些过程了。

使用AWS CodeStar和JFrog Artifactory作为您的唯一真实来源,实现云原生。