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通用库管理使连接使用您选择的DevOps工具,包括最流行的CI服务器。这有助于推动Artifactory被接受为二进制存储库管理的行业标准。
JFrog管道是一种自动化胶水统一JFrog DevOps平台中的所有工具m,像Jenkins一样,它可以让你的软件经历从代码到构建到二进制,再到发布的每个阶段。但是作为JFrog平台的一部分,它自然地与Artifactory、x射线和Distribution集成在一起,并且可以通过一个统一的权限模型为细粒度的访问控制.

管道还在企业规模上运行,能够通过一个为所有管理员和团队提供的单一中央平台支持数百个CI/CD管道。
即使有这些令人信服的理由将您的CI从Jenkins迁移到pipeline,一次性全部迁移可能也不现实。
从Jenkins到pipeline
对于这个例子,我们已经构建了一个Go REST应用程序,Jenkins将对其进行构建,运行单元测试,然后将应用程序推送到一个Docker暂存库中。接下来,JFrog管道将把Docker Go应用程序从暂存库部署到一个Kubernetes集群。我们将使用Kubernetes发动机(GKE).此外,我们将使用Artifactory作为我们的Docker注册表。这样就很容易将构建推进到发布,而不用将相同的构建推到另一个发布注册中心。

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

让我们看看我们的詹金斯管道.以下Jenkinsfile中重要的部分是建立信息发布而且帖子阶段。在Jenkins构建并测试我们的Go应用程序映像之后,我们将构建信息发布给Artifactory。
stages {stage('Build') {steps {container('golang'){sh 'go Build'}}} stage('Unit Tests') {steps {container('golang'){sh 'go test ./…-run Unit'}}} stage('Docker Build') {steps {container(' Docker '){sh " Docker Build -t partnership-public-images.jfrog. "io/goci-example:latest ."}}} stage('Docker Push to Repo') {steps {container(' Docker '){script {Docker ."withRegistry(“https://partnership-public-images.jfrog。Io ', 'gociexamplerepo') {sh "docker push partnershippublic -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管道。接下来我们将讨论这个webhook是如何在JFrog pipeline中设置的。
Post {success {script {sh . sh"curl -XPOST -H \"授权:基本amVmabcdefM25rMW5z=\" \"https://partnership-pipelines-api.jfrog。io/v1/projectIntegrations/17/hook\" -d '{\"buildName\":\"$JOB_NAME\",\"buildNumber\":\"$BUILD_NUMBER\",\"buildInfoResourceName\":\"jenkinsBuildInfo\"}' -H \"内容类型:application/json\""}}}
JFrog管道
我们的JFrog管道将通过Jenkins管道推送的构建信息触发,并执行剩余的部署和阶段操作以发布。

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

JFrog管道定义了它YAML中的管道步骤.这个文件的第一部分是我们的资源。2022世界杯阿根廷预选赛赛程这些是管道使用的数据的源和目标。在我们的例子中,我们定义我们的GitHub回购,aBuildInfo连接到jenkins_openshiftk8s_com詹金斯整合,并最终BuildInfo资源推广我们的发布。BuildInfo资源用于存储构建的元数据。
2022世界杯阿根廷预选赛赛程资源:—名称:gociexampleGithubRepo类型:GitRepo配置:gitProvider: myGithub路径:myaccount/goci-example—name: jenkinsBuildInfo类型:BuildInfo配置: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
我们的第一步是Bash接收詹金斯触发器的步骤jenkinsBuildInfo.
—name: start_from_jenkins类型:Bash配置:input2022世界杯阿根廷预选赛赛程Resources:—名称:jenkinsBuildInfo执行:onExecute: - echo 'Jenkins工作触发管道'
如果一切顺利,我们将Go REST应用程序部署到登台环境中。在这种情况下,我们对此有一个GKE集群。我们通过一个Kubernetes集成gociexampleClusterCreds命名。我们可以与任何Kubernetes集群集成通过提供我们的kubecconfig数据作为一个Integration对象。
我们使用HelmDeploy步骤使用repo中的HelmChart目录部署我们的应用程序。
—name: deploy_staging类型:HelmDeploy配置:inputSteps:—name: start_from_jenkins inputResources:—name: goc2022世界杯阿根廷预选赛赛程iexampleGithubRepo触发器:false integrations:—name: gociexampleClusterCreds releaseName: goci-example chartPath: chart/goci-example/
然后我们有一个Bash步骤,等待Go REST应用程序变得可用。
—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类型:Bash配置:inputSteps:—name: wait_for_server inputResources:—name: goc2022世界杯阿根廷预选赛赛程iexampleGithubRepo触发器:false runtime: type: image image: auto: language: go versions:—“1.13”环境变量:STAGING_URL:“https://goci-example.35.238.177.209.xip。执行:onExecute: - cd ../dependencyState/2022世界杯阿根廷预选赛赛程resources/gociexampleGithubRepo - go mod download - go test ./test -run Staging
最后,如果我们的临时测试通过了,我们就将构建提升为发布版本。
—name: promote_release类型:PromoteBuild配置:targetRepository: partnership-public-images.jfrog。io状态:发布评论:通过分段测试。input2022世界杯阿根廷预选赛赛程Resources:—name: jenkinsBuildInfo outputResources:—name: releaseBuildInfo
我们的JFrog Pipeline可以进一步扩展,以提供连续交付(CD)操作,使用JFrog Distribution将您的软件发布到终端系统和JFrog Edge系统。但我们将把这个问题留给未来的博客文章。
保持DevOps移动
如您所见,将Jenkins管道连接到JFrog管道是一个简单的过程。如果需要,你也可以触发JFrog管道中的Jenkins管道.
从一堆工具中开发您的软件交付工具链是一项耗时且令人沮丧的任务。使用统一的工具链,比如JFrog平台,可以让你专注于你的软件而不是工具。但是如果你有现成的工具,你可以很容易地将它们插入到JFrog平台中,并且仍然可以利用JFrog平台的特性。
