CI/CD并排:Jenkins和JFrog管道

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

无论您是涉足CI/CD还是老手,您都可能对Jenkins有一定的工作知识。10年来,开源自动化服务器一直引领着该领域,并积累了大约1600个插件的生态系统——包括用于Artifactory的Jenkins插件——帮助支持持续集成和持续交付。

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

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

第一眼:詹金斯版

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

Jenkins示例管道构建

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

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

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

管道{代理任何阶段{阶段('克隆'){步骤{git分支:'master', url: "https://github.com/talitz/spring-petclinic-ci-cd-k8s-example.git"}}阶段('Artifactory配置'){步骤{rtServer (id: "kaloula-artifactory", url: "https://kaloula.jfrog。io / artifactory”credentialsId:“管理。jfrog") rtMavenResolver (id: 'Maven -resolver', serverId: 'kaloula-artifactory', releaseRepo: ' libos -release', snapshotRepo: ' libos -snapshot') rtMavenDeployer (id: 'Maven -deployer', serverId: kaloula-artifactory, releaseRepo: ' libos -release-local', snapshotRepo: ' libos -snapshot-local',线程:6,属性:['BinaryPurpose=技术- blogpost ', 'Team=DevOps-Acceleration'])}}阶段('构建Maven项目'){步骤{rtMavenRun(工具:'Maven 3.3.9', pom: 'pom.xml',目标:'-U clean install', deployerId: "maven-deployer", resolverId: "maven-resolver")}} stage ('Build Docker Image'){步骤{脚本{Docker . Build (" kalula - Docker .jfrog. exe ")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管道使用基于YAML(原生代码语言)的DSL。就像Kuberenetes配置和Helm图表,这种键值对的数据序列化语言定义了要完成的工作的操作参数。(詹金斯也有一个YAML插件正在孵化;管道使用YAML)。

集成

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

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

对于这个例子,我们只需要连接到以下的集成:

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

JFrog管道示例CI/CD管道集成

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

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

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

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

2022世界杯阿根廷预选赛赛程资源:—名称:petclinic_repository类型:GitRepomy_github路径:jfrogtw/spring-petclinic-ci-cd-k8s-example分支:include: master - name:petclinic_build_info类型:BuildInfo配置:sourceArtifactory: art buildName: build_and_dockerize_spring_pet_clinic buildNumber: 1 - name:petclinic_image类型:图像配置:registry: art sourceRepository: docker_local imageName: kaloula.jfrog。io/docker-local/宠物诊所imageTag: 1.0.0 autoPull: true - name:spring_helm_chart_resource类型:HelmChartconfiguration: sourceArtifactory: art repository: helm chart: spring-petclinic-ci-cd-k8s-chart version: '1.0.0'

管道宣言

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

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

JFrog管道示例CI/CD

一步的行动 本机步骤类型 描述
构建Maven项目 MvnBuild 方法构建maven项目pom.xml配置文件
构建Docker镜像 DockerBuild 使用Docker CLI构建并标记Docker映像
推送图像到Artifactory
使用构建信息
DockerPush 将完成的Docker映像和build-info推到Artifactory中的Docker注册表
部署图 HelmDeploy 使用Artifactory中的Helm图表部署应用程序


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

管道:—名称:build_and_dockerize_spring_pet_clinic步骤:-名称:build_app类型:MvnBuild配置:集成:-名称:艺术sourceLocation:。autopubishbuildinfo: true mvnCommand: clean install -s settings.xml configFileLocation:。configFileName: maven。yaml input2022世界杯阿根廷预选赛赛程Resources: - name: petclinic_repository outputResources: - name: petclinic_build_info - name:docker_build类型:DockerBuild配置:affinityGroup: dbp_group dockerFileLocation:。dockerFileName: Dockerfile dockerImageName: kaloula.jfrog。io/docker-local/pet-clinic dockerImageTag: 1.0。${run_number} input2022世界杯阿根廷预选赛赛程Resources: - name: petclinic_repository - name: petclinic_build_info集成:- name:艺术- name:docker_push类型:DockerPushconfiguration: inputSteps:—name: docker_build affinityGroup: dbp_group targetRepository: docker-local autopubishbuildinfo: true integrations:—name: art outputResou2022世界杯阿根廷预选赛赛程rces:—name: petclinic_image - name:deploy_helm_chart类型:HelmDeployconfiguration: integration: - 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:—name: petclinic_image—name: spring_helm_chart_resource releaseName: spring- petclinic_ci -cd-k8s-example valuefileppaths:—values.yaml


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

是什么让它运行

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

  1. 我们管道的第一步将在任何新提交到GitHub时触发petclinic_repository
  2. 构建和推送的步骤petclinic_image当Maven项目成功构建并生成一个新的petclinic_build_info
  3. 成功生产petclinic_image到Artifactory中的Docker注册表,触发它最终部署到Kubernetes。

它将运行到哪里?

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

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

剩下的去哪里了?

也许与Jenkins管道最大的不同是什么缺席来自管道DSL:

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

的深入了解

想要探索更多的JFrog管道吗?

你会发现许多其他原因来仔细研究pipeline,包括以下功能:

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

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