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

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

pipeline还可以在企业规模上运行,能够通过一个单一的中央平台为所有管理员和团队支持数百个CI/CD管道。
即使有这些令人信服的理由将您的CI从Jenkins迁移到pipeline,也可能不太实际。
从詹金斯到管道
对于这个例子,我们已经构建了一个Go REST应用程序,Jenkins将构建它,运行单元测试,然后将应用程序推送到一个暂存的Docker存储库。接下来,JFrog Pipelines将把Docker Go应用程序从登台存储库部署到Kubernetes集群。我们将使用Google Kubernetes Engine (GKE)。此外,我们将使用Artifactory作为Docker注册表。这使得在不将相同的构建推送到另一个发布注册中心的情况下,将构建提升到发布版本变得很容易。

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

让我们来看看我们的詹金斯管道。以下Jenkinsfile中重要的部分是发布构建信息和帖子阶段。在Jenkins构建并测试我们的Go应用程序映像之后,我们将构建信息发布到Artifactory。
stage {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. sh "}}} stage('Docker Push to Repo') {steps {container(' Docker '){script {Docker . io/goci-example:latest ."}}}withRegistry(“https://partnership-public-images.jfrog。{sh "docker push partnership-public-images.jfrog。Io /goci-example:最新的“}}}}}”stage('Publish Build Info') {environment {JFROG_CLI_OFFER_CONFIG = false} steps {container('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. log "*\"" sh "jfrog rt bp——build-url=https://jenkins.openshiftk8s.com/——url=https://partnership.jfrog。. io/artifactory——user=$ user——apikey=$ apikey $JOB_NAME $BUILD_NUMBER"}}}} . io/artifactory}
然后在帖子在这个阶段,我们通过在一个对Pipelines REST API的特殊webhook调用中引用构建信息来触发JFrog Pipelines。接下来我们将讨论如何在JFrog Pipelines中设置这个webhook。
Post {success {script {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 \"Content-Type: application/json\""}}
JFrog管道
我们的JFrog管道将触发Jenkins管道推送的构建信息,并执行剩余的部署和分段操作以发布。

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

JFrog管线定义了它的YAML中的管道步骤。这个文件的第一部分是我们的资源。2022世界杯阿根廷预选赛赛程这些是管道使用的数据的源和目的地。在我们的例子中,我们正在定义我们的GitHub repo, aBuildInfo资源连接到jenkins_openshiftk8s_com詹金斯整合,并最终BuildInfo资源,以促进我们的发布。BuildInfo资源用于存储构建的元数据。
2022世界杯阿根廷预选赛赛程资源:—名称:gociexampleGithubRepo类型:GitRepo配置:gitProvider: myGithub路径:myaccount/goci-example—名称:jenkinsBuildInfo类型:BuildInfo配置:sourceArtifactory: MyArtifactory buildName: goci-example/master buildNumber: 1 externalCI: jenkins_openshiftk8s_com—名称:releaseBuildInfo类型:BuildInfo配置:sourceArtifactory: MyArtifactory buildName: goci-example/master buildNumber: 1
第一步是aBash步骤接收我们的Jenkins触发器jenkinsBuildInfo。
—名称:start_from_jenkins类型:Bash配置:input2022世界杯阿根廷预选赛赛程Resources: - name: jenkinsBuildInfo执行:onExecute: - echo 'Jenkins job触发的管道'
如果一切顺利,我们就可以将Go REST应用程序部署到暂存环境中。在这种情况下,我们有一个GKE集群。我们通过a引用这个集群Kubernetes集成命名为gociexampleClusterCreds。我们可以与任何Kubernetes集群集成通过将kubecconfig数据作为Integration对象提供。
我们使用HelmDeploy在我们的repo中使用HelmChart目录部署我们的应用程序。
—名称:deploy_staging类型:HelmDeploy配置:inputSteps:—名称:start_from_jenkins inputResources:—名称:gociexampleG2022世界杯阿根廷预选赛赛程ithubRepo触发器:false集成:—名称:gociexampleClusterCreds releaseName: goci-example chartPath: chart/goci-example/
然后我们有一个Bash步骤,等待Go REST应用程序可用。
—名称:wait_for_server类型:Bash配置:inputSteps:—名称:deploy_staging执行:onExecute:—timeout 60 Bash -c 'while [["$(curl -s -o /dev/null -w " %{http_code} " https://goci-example.35.238.177.209.xip.io)"!= "200"]];一定要睡觉;完成了
一旦Go REST应用程序出现在我们的登台环境中,我们就执行我们的登台测试。
—名称:staging_test类型:Bash配置:inputSteps:—名称:wait_for_server inputResources:—名称:gociexampleG2022世界杯阿根廷预选赛赛程ithubRepo trigger: false runtime:类型:image image: auto: language: go版本:—“1.13”环境变量:STAGING_URL:“https://goci-example.35.238.177.209.xip. conf”执行:onExecute: - cd ../dependencyState/2022世界杯阿根廷预选赛赛程resources/gociexampleGithubRepo - go mod download - go test ./test -run Staging ./
最后,如果我们的阶段测试通过了,我们就将构建提升到发布版本。
—名称:promote_release类型:PromoteBuild配置:targetrerepository: 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平台的特性。
