CI/CD并排:Jenkins和JFrog管道

你想探索JFrog管线吗DevOps管道自动化,但还没有能够开始?要学习新东西,从你已经熟悉的东西开始是有帮助的。

无论您是CI/CD的新手还是资深人士,您都可能对Jenkins有一些工作知识。10年来,开源自动化服务器一直是该领域的领导者,并积累了一个由大约1600个插件组成的生态系统——包括Artifactory的Jenkins插件-帮助支持持续集成和持续交付。

JFrog管线是CI / CD自动化的组成部分JFrog DevOps平台,一个完整的端到端二进制文件生产和交付系统。作为一个现代人,完全进行CI / CD与Artifactory的二进制文件自然集成的解决方案库管理, Pipelines可以提供集中的自动化服务,以满足从小型初创企业到全球企业的任何需求。

但两者的真正区别是什么呢?让我们看一下如何编写相同的基本管道来构建和部署应用程序,首先在Jenkins中,然后在JFrog pipeline DSL中。两个示例都将在JFrog平台实例中使用ArtifactoryKaloula

第一眼:詹金斯版

我们Jenkins版本的管道运行在虚拟机上的单个代理上,并执行一系列的9个动作(阶段):

Jenkins示例管道构建

阶段 描述
克隆 在管道执行期间克隆源仓库。
Artifactory配置 为这个管道配置Jenkins Artifactory Plugin
构建Maven项目 根据构建maven项目pom.xml
构建Docker镜像 使用Docker命令行构建和标记Docker镜像
将图像推到人工 将完成的Docker镜像推送到Artifactory中的Docker注册表
发布构建信息 将完成的Docker映像的构建信息发布到Artifactory
安装舵 将Helm 3安装到代理环境中
配置Helm和Artifactory 配置Helm客户端以使用Artifactory中的Helm存储库
部署图 使用Helm图表部署应用程序

我们的Jenkins管道使用Apache Groovy,这是一种面向Java平台的Java语法兼容的面向对象编程语言。由于您已经非常熟悉Jenkins,因此这段代码看起来应该非常熟悉,不需要解释。

要为这个Jenkins管道运行Groovy代码,管理员必须安装额外的插件:

管道{代理任意阶段{阶段('克隆'){步骤{git分支:'主',url: "https://github.com/talitz/spring-petclinic-ci-cd-k8s-example.git"}}阶段('Artifactory配置'){步骤{rtServer (id: "kaloula-artifactory", url: "https://kaloula.jfrog. . "/artifactory", credentialsId: "admin. io "。rtMavenResolver (id: 'Maven -resolver', serverId: 'kaloula-artifactory', releaseRepo: 'lib -release', snapshotRepo: 'lib -snapshot') rtMavenDeployer (id: 'Maven -deployer', serverId: kaloula-artifactory, releaseRepo: 'lib -release-local', snapshotRepo: 'lib -snapshot-local',线程:6,属性:[' binarpurpose = technicblogpost ', 'Team=DevOps-Acceleration'])}} stage('Build Maven Project'){步骤{rtMavenRun(工具:'Maven 3.3.9', pom: 'pom.xml',目标:'-U clean install', deployerId: "maven-deployer", resolverId: "maven-resolver")}} stage ('Build Docker Image') {steps {script {Docker . Build (" kalouula - Docker .jfrog. Build ")Io /" + "宠物诊所:1.0.${env. .BUILD_NUMBER}") } } } stage ('Push Image to Artifactory') { steps { rtDockerPush( serverId: "kaloula-artifactory", image: "kaloula-docker.jfrog.io/" + "pet-clinic:1.0.${env.BUILD_NUMBER}", targetRepo: 'docker', properties: 'project-name=jfrog-blog-post;status=stable' ) } } stage ('Publish Build Info') { steps { rtPublishBuildInfo ( serverId: "kaloula-artifactory" ) } } stage('Install Helm') { steps { sh """ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh && helm version """ } } stage('Configure Helm & Artifactory') { steps { withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'admin.jfrog', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) { sh """ helm repo add helm https://kaloula.jfrog.io/artifactory/helm --username ${env.USERNAME} --password ${env.PASSWORD} helm repo update """ } } } stage('Deploy Chart') { steps { withCredentials([kubeconfigContent(credentialsId: 'k8s-cluster-kubeconfig', variable: 'KUBECONFIG_CONTENT')]) { sh """ echo "$KUBECONFIG_CONTENT" > config && cp config ~/.kube/config helm upgrade --install spring-petclinic-ci-cd-k8s-example helm/spring-petclinic-ci-cd-k8s-chart --kube-context=gke_dev_us-west1-a_artifactory --set=image.tag=1.0.${env.BUILD_NUMBER} """ } } } } }

再看:管道版本

JFrog pipeline使用基于YAML(代码原生语言)的DSL。就像Kuberenetes配置和Helm图,这种键值对的数据序列化语言定义了要完成的工作的操作参数。(詹金斯也有正在孵化的YAML插件;管道本身使用YAML)。

集成

要使管道运行,它需要能够连接到其他工具和服务,例如版本控制系统、云存储、Kubernetes、团队消息传递,当然还有Artifactory。不需要安装和管理插件,也不需要解决它们的冲突;管道为您最可能使用的工具提供了开箱即用的集成,因此连接到这些服务是很容易的。

您可以通过JFrog平台UI向pipeline添加集成。管道集成确保您的秘密安全通过将您的凭据安全地存储在加密的保险库中,管理员可以通过JFrog平台权限管理限制哪些管道可以访问这些服务。

对于本例,我们只需要连接到以下集成:

  1. Artifactory通过我们的权限有限的用户帐户
  2. GitHub用户帐户我们的代码和管道定义存储在哪里
  3. Kubernetes将部署应用程序的集群

JFrog Pipelines示例CI/CD管道集成

2022世界杯阿根廷预选赛赛程资源的声明

管道资源2022世界杯阿根廷预选赛赛程表示管道中的“对象”,它们是步骤的输入和输出。在pipeline内部,它们是数据记录,其中包含有关管道中执行步骤所需资源的信息,也可用于存储与其他步骤共享的信息。

当资源发生变化时,可以使用该资源触发步骤的执行。例如:在提交到源代码仓库时,或者在构建成功后生成build-info时。

我们的资2022世界杯阿根廷预选赛赛程源是通过管道DSL声明的,并且可以与管道声明放在同一个文件中。我们的管2022世界杯阿根廷预选赛赛程道需要的资源是:

2022世界杯阿根廷预选赛赛程资源:-名称:petclinic_repository类型:GitRepo配置:gitProvider: my_github路径:jfrogtw/spring-petclinic-ci-cd-k8s示例分支:包括:master - name:petclinic_build_info类型:BuildInfo配置:sourceArtifactory: art buildName: build_and_dockerize_spring_pet_clinic buildNumber: 1 - name:petclinic_image类型:图像配置:registry: art sourcererepository: docker_local imageName: kaloula.jfrog。io/docker-local/pet-clinic imageTag: 1.0.0 autoPull: true - name:spring_helm_chart_resource类型:HelmChart配置:sourceArtifactory: art repository: helm chart: spring-petclinic-ci-cd-k8s-chart版本:'1.0.0'

管道宣言

管道是由一系列的管道的步骤对资源起作用。2022世界杯阿根廷预选赛赛程

我们在JFrog Pipelines中的示例管道只使用了4个本机步骤,使我们能够执行开箱即用的常见CI/CD操作,而无需编写自己的命令行脚本。

JFrog pipeline示例CI/CD

一步的行动 原生步长类型 描述
构建Maven项目 MvnBuild 构建maven项目pom.xml配置文件
构建Docker镜像 DockerBuild 使用Docker命令行构建和标记Docker镜像
将图像推到人工
带有构建信息
DockerPush 将完成的Docker映像和构建信息推送到在Artifactory中的Docker注册表
部署图 HelmDeploy 使用Artifactory中的Helm图表部署应用程序


添加了我们的集成并声明了资源后,我们的示例管道就可以运行了:2022世界杯阿根廷预选赛赛程

管道:-名称:build_and_dockerize_spring_pet_clinic步骤:-名称:build_app类型:MvnBuild配置:integrations:—name: art sourceLocation:。autoPublishBuildInfo: true mvnCommand: clean install -s settings.xml configFileLocation:。configFileName: maven。—名称:petcli2022世界杯阿根廷预选赛赛程nic_repository—名称:petclinic_build_info—名称:petclinic_build_infodocker_build类型:DockerBuild配置:affinityGroup: dbp_group dockerFileLocation:。dockerFileName: Dockerfile dockerImageName: kaloula.jfrog。dockerImageTag: 1.0. io/docker-local/pet-clinic${run_number} input2022世界杯阿根廷预选赛赛程Resources:—名称:petclinic_repository—名称:petclinic_build_info集成:—名称:art—名称:docker_push类型:DockerPush配置:inputSteps: -名称:docker_build affinityGroup: dbp_group targetRepository: docker-local autoPublishBuildInfo: true集成:-名称:art outputResources: -名称:petclinic_image -2022世界杯阿根廷预选赛赛程名称:deploy_helm_chart类型:HelmDeploy配置:集成:- name: k8s_cluster_integration helmVersion: 3 lint: true flags:——kube-context=gke_dev_us-west1-a_artifactory——set=image.tag=1.0${run_number} input2022世界杯阿根廷预选赛赛程Resources:—名称:petclinic_image—名称:spring_helm_chart_resource releaseName: spring-petclinic-ci-cd-k8s-example valuefileppaths:—values.yaml


这里有一些重要的细节来帮助你理解它:

是什么让它运行

JFrog Pipelines中的每个步骤都可以配置为在一个事件上触发执行,或者在序列中的前一个步骤完成时触发执行。下面是我们的例子:

  1. 我们的管道的第一步将触发对GitHub的任何新提交petclinic_repository
  2. 建立和推动的步骤petclinic_imageDocker映像将在Maven项目成功构建并生成新文件时运行petclinic_build_info
  3. 的成功制作petclinic_image到Artifactory中的Docker注册表,触发它最终部署到Kubernetes。

它将在哪里运行?

整个Jenkins版本运行在单个VM代理中代理任何指令,指定池中可用的虚拟机。

在管道中,管道中的每一步都在运行时容器中执行从池中分配到构建节点VM。如果需要,任何步骤都可以指定它自己的特定运行时映像具有所需的环境,或者管道DSL可以为所有步骤指定默认运行时。但是您不必指定任何—我们的示例管道没有指定,因此所有步骤都在管理员设置的默认运行时中执行。

剩下的去哪了?

也许与詹金斯管道最大的不同在于缺席管线DSL:

  • 首先,不需要克隆源代码库。
  • 不需要对Artifactory进行任何配置——作为JFrog平台自然集成的一部分,Pipelines可以以正确的方式构建我们的应用程序。
  • 不需要CLI命令来执行常见的构建操作——声明性的本地步骤为您命令Maven、Artifactory、Docker和Helm。开发人员总是可以使用一个通用步骤来发出命令行指令,就像他们在Jenkins阶段所做的那样。但是有了pipeline的原生步骤,你就不必这么做了——你只需要指定即可什么你想要完成,不怎么去完成它。如果您需要在您的步骤中发出用于配置或清理的附加命令,您可以这样做,但通常不需要它们。
  • 使用pipeline,发布构建信息不再是一个单独的操作,而可以成为构建操作的一个固有部分。要维护DevOps最佳实践,您所要做的就是通过设置说“Yes, please”autoPublishBuildInfo真正的
  • 不需要从管道中配置k8。kubecconfig是Kubernetes pipeline集成的一部分,它与您的K8s凭据一起被加密并保密。
  • 也不需要安装或配置Helm——它已经是运行时容器的一部分了。的管道附带的标准运行时图像包括最常用的服务(例如,Docker, Helm, JFrog CLI),这样步骤就可以期待它们被安装并准备就绪。

的深入了解

想要进一步探索JFrog管线吗?

你会发现有很多其他的原因让你仔细看看管道,包括:

不想将现有的Jenkins工作流转换为pipeline ?学习如何做到Jenkins和pipeline之间的互操作以保护您现有的CI投资和/或促进最终的迁移。

更好的是,免费开始使用云中的管道