Jenkins和JFrog管道:CI/CD协同发布软件

作为一名软件制作人,你需要不断发布新版本,即使你需要推动你的技术向前发展。将Jenkins持续集成(CI)管道过渡到更新的、优化的系统不会成为一个障碍,而且您的企业无法承受拆除和替换返工所需要的工作中断。
我们在建造我们的CI / CD的解决方案JFrog管线公司。这就是为什么我们可以很容易地将您当前的Jenkins管道与JFrog管道中的管道连接起来,这样您就可以扩展现有的工具链,而不是破坏它。
像许多组织一样,您已经投入了数百个开发人员小时来构建许多Jenkins管道,这些管道执行起来已经成为您的软件构建过程中不可或缺的一部分。这些Jenkins主力可以继续驱动你的CI的重要部分,但是在JFrog管道中移交给新的工作流。
让我们看看这是如何做到的,以使Jenkins和pipeline能够一起工作。
管道与平台的差异
的CI/CD组件JFrog DevOps平台“一站式DevOps”的端到端解决方案集。在Artifactory的支持下,JFrog平台提供了管理组织所需的一切软件交付,从构件库,二进制文件的分布,安全扫描CI/CD自动化。
很有可能您的Jenkins管道已经将工件和构建推送到Artifactory存储库去,码头工人,舵.那是因为Artifactory的通用存储库管理使连接使用您选择的DevOps工具,包括最流行的CI服务器。这有助于推动Artifactory被接受为二进制存储库管理的行业标准。
JFrog管线是帮助自动化的粘合剂统一JFrog DevOps平台中的所有工具m,像Jenkins一样,它可以让你的软件通过从代码到构建到二进制文件,一直到分发的每个阶段。但是作为JFrog平台的一部分,它自然地与Artifactory、Xray和Distribution集成在一起,并且可以通过一个统一权限模型为细粒度访问控制.

管道还在企业规模上运行,能够通过一个面向所有管理员和团队的中央平台支持数百个CI/CD管道。
即使有这些令人信服的理由将您的CI从Jenkins迁移到Pipelines,但一次性这样做可能并不实际。
从Jenkins到pipeline
对于这个例子,我们构建了一个Go REST应用程序,Jenkins将构建该应用程序,运行单元测试,然后将该应用程序推到暂存的Docker存储库中。接下来,JFrog管线将把Docker Go应用程序从暂存库部署到一个Kubernetes集群。我们将使用谷歌Kubernetes Engine (GKE).此外,我们将使用Artifactory作为Docker注册表。这使得无需将相同的构建推到另一个发布注册表,就可以轻松地将构建推广到发布。

的本例的代码存储库包含我们的Go REST应用程序,Jenkins管道Jenkinsfile和JFrog管道YAML文件。根据最佳实践,管道基础结构也在这些文件中定义。
詹金斯管道
我们的Jenkins管道执行应用程序的初始构建和测试,将Docker容器推到包含构建信息的存储库。

我们来看看我们的詹金斯管道.以下詹金斯文件中重要的部分是发布构建信息而且帖子阶段。在Jenkins构建并测试我们的Go应用程序映像之后,我们将构建信息发布到Artifactory。
阶段{阶段('构建'){步骤{容器('golang'){sh 'go构建'}}阶段('单元测试'){步骤{容器('golang'){sh 'go test ./…-run Unit'}}} stage('Docker Build') {steps {container(' Docker '){sh " Docker Build -t partnership-public-images.jfrog. sh "{}} stage('Docker Push to Repo') {steps{容器('Docker '){script {Docker . io/goci-example:latest ."withRegistry(“https://partnership-public-images.jfrog。Io ', 'gociexamplerepo') {sh "docker推送partnership-public-images.jfrog。Io /goci-example:latest"}}}}}stage('发布构建信息'){环境{JFROG_CLI_OFFER_CONFIG = false}步骤{容器('jfrog-cli-go'){withCredentials([usernamePassword(credentialsId: 'gociexamplerepo', passwordVariable: 'APIKEY', usernamvariable: 'USER')]) {sh "jfrog rt bce $JOB_NAME $BUILD_NUMBER" sh "jfrog rt bag $JOB_NAME $BUILD_NUMBER" sh "jfrog rt bad $JOB_NAME $BUILD_NUMBER \"go。*\"" sh "jfrog rt bp——build-url=https://jenkins.openshiftk8s.com/——url=https://partnership.jfrog。io/artifactory——user=$ user——apikey=$ apikey $JOB_NAME $BUILD_NUMBER"}}}}}
然后在帖子阶段,我们通过在一个特殊的webhook调用中引用管道REST API的构建信息来触发JFrog管道。接下来我们将讨论如何在JFrog管道中设置这个webhook。
后{成功{脚本{shcurl -XPOST -H \"授权:基本amVmabcdefM25rMW5z=\" \"https://partnership-pipelines-api.jfrog。io/v1/projectIntegrations/17/hook\" -d '{\"buildName\":\"$JOB_NAME\",\"buildNumber\":\"$BUILD_NUMBER\",\"buildInfoResourceName\":\"jenkinsBuildInfo\"}' -H \"Content-Type: application/json\""}}}
JFrog管道
我们的JFrog管道将通过Jenkins管道推送的构建信息来触发,并执行剩余的部署和登台操作以发布。

为了将Jenkins连接到JFrog pipeline,我们必须首先创建一个詹金斯集成在我们的管道部署中,这里叫做jenkins_openshiftk8s_com.这个UI提供了我们上面的curl webhook命令,并使我们的Jenkins管道触发我们的JFrog管道。

JFrog管线定义了它YAML中的管道步骤.这个文件的第一部分是我们的资源。2022世界杯阿根廷预选赛赛程这些是管道使用的数据的源和目的地。在我们的例子中,我们正在定义我们的GitHub回购,aBuildInfo连接到jenkins_openshiftk8s_com詹金斯积分,最后一个BuildInfo资源来促进我们的发布。BuildInfo资源用于存储构建的元数据。
2022世界杯阿根廷预选赛赛程资源:—名称:gociexampleGithubRepo类型:GitRepo配置:gitProvider: myGithub路径:myaccount/ goi -example- name: jenkins_buildinfo type: BuildInfo configuration: sourceArtifactory: MyArtifactory buildName: goci-example/master buildNumber: 1 externalCI: jenkins_openshiftk8s_com- name: releaseBuildInfo type: BuildInfo configuration: sourceArtifactory: MyArtifactory buildName: goci-example/master buildNumber: 1
第一步是aBash接收詹金斯触发器的步骤jenkinsBuildInfo.
—name: start_from_jenkins type: Bash配置:input2022世界杯阿根廷预选赛赛程Resources:—name: jenkinsBuildInfoexecute: onExecute: - echo 'Jenkins作业触发管道'
如果一切顺利,我们将把Go REST应用程序部署到登台环境中。在本例中,我们有一个GKE集群。我们通过Kubernetes集成命名为gociexampleClusterCreds。我们可以与任何Kubernetes集群集成通过提供我们的kubecconfig数据作为集成对象。
我们使用HelmDeploy步骤部署我们的应用程序使用HelmChart目录在我们的repo。
—name: deploy_staging type: HelmDeploy configuration: inputSteps:—name: start_from_jenkins inputRes2022世界杯阿根廷预选赛赛程ources:—name: gociexampleGithubRepo trigger: false integrations:—name: gociexampleClusterCreds releaseName: goci-example chartPath: chart/goci-example/
然后是等待Go REST应用程序可用的Bash步骤。
- name: wait_for_server type: Bash configuration: inputSteps:—name: deploy_staging execution: onExecute:—timeout 60 Bash -c 'while [["$(curl -s -o /dev/null -w " %{http_code} " https://goci-example.35.238.177.209.xip.io)"= "200"]];做睡眠5;做的||真的
一旦我们的Go REST应用程序出现在我们的登台环境中,我们就执行登台测试。
—name: staging_test type: Bash configuration: inputSteps:—name: wait_for_server inputRes2022世界杯阿根廷预选赛赛程ources:—name: gociexampleGithubRepo trigger: false runtime: type: image image: auto: language: go versions:—“1.13”environmentVariables: STAGING_URL:“https://goci-example.35.238.177.209.xip.”io" execute: onExecute: - cd ../dependencyState/2022世界杯阿根廷预选赛赛程resources/gociexampleGithubRepo - go mod download - go test ./test -run Staging
最后,如果我们的分段测试通过了,我们就会将构建版本发布。
—name: promote_release type: PromoteBuild配置:targetRepository: partnership-public-images.jfrog。io状态:已发布注释:已通过登台测试。input2022世界杯阿根廷预选赛赛程Resources:—name: jenkinsBuildInfo outputResources:—name: releaseBuildInfo
我们的JFrog Pipeline可以进一步扩展,使用JFrog Distribution提供持续交付(CD)操作,将您的软件发布到终端系统和JFrog Edge系统。但我们将把这个问题留到以后的博客文章中。
保持DevOps运行
正如您所看到的,将Jenkins管道连接到JFrog管道中的管道是一个简单的过程。如果需要,你也可以触发从JFrog管道的Jenkins管道.
从工具的拼凑中开发软件交付工具链可能是一项耗时且令人沮丧的任务。使用像JFrog平台这样的统一工具链可以让你专注于软件,而不是工具。但是如果你有现成的工具,你可以很容易地将这些工具插入JFrog平台,并且仍然可以利用JFrog平台的特性。