使用阿里云容器服务Jenkins 2.0实现持续集成之Pipeline篇(updated on 2016.12.23)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文将用java web源代码来演示一个Pipeline项目如何优雅地实现代码提交触发测试,war包打包,测试结果展示,war包本地存储以及上传OSS,构建镜像,部署应用,邮件推送结果的持续交付方案。 在最后一部分,我们将介绍动态生成slave,执行job,销毁slave。

Jenkins 2.0

Jenkins 2.0新特性:Pipeline as code,全新的开箱体验和UI可用性提升以及完全向后兼容。

  • Pipeline as Code
    通过使用Groovy DSL来描述一套运行于Jenkins上的工作流程,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。并且,Jenkins支持从代码库直接读取脚本。
  • 全新的开箱体验和UI可用性提升
    Jenkins 1.XXX 安装默认是开放所有权限,因为安全性存在隐患。而Jenkins 2.0则加强了安全管理。
  • 完全向后兼容
    Jenkins官方公布是完全向后兼容的,所以在Jenkins 1.XXX版本的功能都可以使用,但插件还是得自己验证。

场景描述

我们在定义一个Jenkins项目的时候,希望它是一个清晰的范围。也就是说,如果这个项目叫mvn test and build,我们就应该在脚本里实现测试和jar/war包打包。而事实上是,接下来的需求很多时候是把测试结果展示出来,还有上传jar/war包。这个时候,Devops工程师会陷入一种纠结,就是值不值得为了这个需求再重新创建一个freeStyle的项目。明明可能只有两个语句,却需要整个重新配置一个项目。新建意味着付出更多的精力并且后期维护成本增加;在原有的项目里实现,意味着项目臃肿,定义模糊。Jenkins 2.0 提供的Pipeline项目类型给出了很好的解决办法。

下面我们将用java web源代码来演示一个Pipeline项目如何优雅地实现代码提交触发测试,war包打包,测试结果展示,war包本地存储以及上传OSS,构建镜像,部署应用,邮件推送结果的持续交付方案。 在最后一部分,我们将介绍动态生成slave,执行job,销毁slave。

先给张图来个Pipeline项目的视觉感受:
1.jpg

使用容器服务部署Jenkins应用和Slave

阿里云容器服务的官方示例模板已经新增了Jenkins 2.0镜像版本,只需要将镜像版本号1.651.3改成2.19.2。编排模板如下:

jenkins:
    image: 'registry.aliyuncs.com/acs-sample/jenkins:2.19.2'
    ports:
        - '8080:8080'
        - '50000:50000'
    volumes:
        - /var/lib/docker/jenkins:/var/jenkins_home
    privileged: true
    restart: always 
    labels:
        aliyun.scale: '1'
        aliyun.probe.url: 'tcp://container:8080'
        aliyun.probe.initial_delay_seconds: '10'
        aliyun.routing.port_8080: jenkins
    links:
        - slave-java
slave-java:
    image: 'registry.aliyuncs.com/acs-sample/jenkins-slave-dind-java'
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    restart: always 
    labels:
        aliyun.scale: '1'

(updated)有的情况下用户需要使用root用户来启动slave容器,下面更新的这个模版里的slave镜像registry.cn-beijing.aliyuncs.com/qinyujia-test/jenkins-slave-dind-java-maven是以root用户(密码是passwd)启动的,docker client version为1.12.5,使用容器服务部署的时候请先升级Docker版本到最新版。

jenkins:
    image: 'registry.cn-hangzhou.aliyuncs.com/qinyujia-test/jenkins:2.19.2'
    ports:
        - '8080:8080'
        - '50000:50000'
    volumes:
        - /var/lib/docker/jenkins:/var/jenkins_home
    privileged: true
    restart: always 
    labels:
        aliyun.scale: '1'
        aliyun.probe.url: 'tcp://container:8080'
        aliyun.probe.initial_delay_seconds: '10'
        aliyun.routing.port_8080: jenkins
    links:
        - slave-java
slave-java:
    image: 'registry.cn-beijing.aliyuncs.com/qinyujia-test/jenkins-slave-dind-java-maven'
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    restart: always 
    labels:
        aliyun.scale: '1'

在Jenkins master中配置slave。
2.jpg

创建Pipeline项目实现持续交付流程

选择Jenkins,添加类型为User with Password的Credentials,存储GitLab账号密码。同样添加存储OSS以及阿里云容器服务Registry账号密码的Credentials。了解OSS请参考OSS快速入门
3.jpg
新建一个Pipeline项目。
4.jpg
配置General,选择Discard old builds来减少存储空间占用。
5.jpg
配置Build Trigger,选择Build when a change is pushed to GitLab类型,根据需要来选择触发Event类型,branch,使用Secret token等。
6.jpg
最后最关键的也就是配置Pipeline,本示例采用的是Pipeline Script,直接在项目中填写脚本,就像前面介绍的一样,用户也可以使用Pipeline script from SCM方式,直接从代码读取Jenkinsfile。
7.jpg

Note: 请打开上图中的Pipeline Syntax链接,Jenkins提供了很大程度上帮用户生成脚本的功能。

完整的脚本如下:
node指定的是slave节点,必须使用Jenkins已经管理的节点名称。
stage指的是一个view,名称由用户自己指定。本示例一共创建了6个stage来实现持续交付。其中deploy是连接了一个freestyle的应用部署项目。

  • Prepare:拉取代码。
  • mvn test and build:测试和打包war包。
  • publish and archive:测试结果展示,war包本地存储。
  • Upload to oss:上传war包到共享存储OSS。
  • image build:镜像构建,推送。
  • deploy:部署应用。
node('slave-java') {
  stage('Prepare') {
    withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'gitlab',
      usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
      sh 'rm -rf java-demo'
      sh "git clone http://'${USERNAME}':'${PASSWORD}'@139.129.99.183:10080/root/java-demo.git"     
    }
  }
  stage('mvn test and build') {
    sh 'ls'
    dir('./java-demo') {
      sh 'mvn -version'
      sh 'mvn  -Dmaven.test.failure.ignore clean package' 
    }
   }
  stage('publish and archive') {
    dir('./java-demo') {      
      junit '**/target/surefire-reports/TEST-*.xml'
      archive 'target/*.war'
    }
   }
  stage('Upload to oss') {
    withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'gitlab',
      usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
      sh 'rm -rf oss'
      sh "git clone http://'${USERNAME}':'${PASSWORD}'@139.129.99.183:10080/root/oss.git" 
    }  
    dir('./oss') {
      sh 'unzip OSS_Python_API_20160419.zip'  
      withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'oss',
        usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
        sh 'python osscmd put ../java-demo/target/boot-api.war oss://cs-jenkins/boot-api.war --host=oss-cn-qingdao.aliyuncs.com --id=${USERNAME} --key=${PASSWORD}'    
      }     
    }
  }   
  stage('image build') {
    dir('./java-demo') {
      sh 'cp target/boot-api.war .' 
      withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'registry',
        usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
          sh 'sudo docker login -u ${USERNAME} -p ${PASSWORD} -e yujia.qyj@alibaba-inc.com registry.cn-beijing.aliyuncs.com'    
          sh 'sudo docker build -t registry.cn-beijing.aliyuncs.com/qinyujia/boot-api .'
          sh 'sudo docker push registry.cn-beijing.aliyuncs.com/qinyujia/boot-api'
      }       
    }
  }
  stage('deploy') {
    build 'deploy'
  }
  stage('email') {
    emailext body: '''Project: $PROJECT_NAME 
    Build Number: # $BUILD_NUMBER
    Build Status: $BUILD_STATUS
    Check console output at $BUILD_URL to view the results.''', recipientProviders: [[$class: 'DevelopersRecipientProvider']], subject: '$BUILD_STATUS - $PROJECT_NAME - Build # $BUILD_NUMBER', to: 'yujia.qyj@alibaba-inc.com'
  }
}

Dynamic slave

下面我们来介绍一下如何配置动态的生成slave,执行Jenkins job,销毁slave。
首先安装yet another docker插件。
然后选择Manage Jenkins,Configure System。
创建一个阿里云服务的集群,作为slave容器的承载。
Docker URL中填写集群接入点地址。
Host Credentials中添加 Docker Host Certificate Authentication类型的证书。按照图中提示把集群相应的证书输入。这时候可以使用Test Connection来测试集群的连通性。
8.jpg
9.jpg

Docker Image Name中填写slave镜像。本示例中使用的是阿里云容器服务提供的示例镜像registry.aliyuncs.com/acs-sample/jenkins-slave-dind-java。
Registry Credentials中添加类型为User with Password的Credentials,输入阿里云容器服务镜像仓库的账号和密码。
Create Container Settings中在Volumes对话框中挂载两个数据卷:
/var/run/docker.sock:/var/run/docker.sock #用来让slave可以使用宿主机的docker deamon。
/home/jenkins/.m2:/root/.m2 #将maven仓库存储在ECS的数据卷中,这样即使容器删除,maven repository还能保留,接下来新生成的slave可以不用重新下载依赖包。
10.jpg
Jenkins Slave Config部分,Labels是slave节点在Jenkins项目的标识符。Launch method是master连接slave的方式,本示例选用的是Docker SSH computer launcher的方式,Credentials中添加类型为User with Password的Credentials,填写registry.aliyuncs.com/acs-sample/jenkins-slave-dind-java镜像的账号密码,为jenkins/jenkins。 (slave镜像registry.cn-beijing.aliyuncs.com/qinyujia-test/jenkins-slave-dind-java-maven的账号密码是root/passwd。)
11.jpg
这样slave的docker源就已经配置完成。下面我们只需要修改一行Jenkins Pipeline代码就可以使用动态slave。把node中的标签由'slave-java'改成‘docker’。 这时候,您就可以变更代码触发整个持续交付流程了。

node('docker')

总结

这套持续交付的方案,最大的两个特性在于,一,使用了Jenkins Pipeline Project,通过Jenkinsfile脚本简化整个配置过程,增加了artifacts存储,加强了结果展示,UT结果看板以及stage时间统计。二,Dynamic slave,提供了动态生成slave,执行Jenkins job,销毁slave的能力。

想查看阿里云容器服务提供了哪些slave节点,请访问 https://github.com/AliyunContainerService/jenkins-slaves
想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
27天前
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
46 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
2月前
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
53 4
|
2月前
|
人工智能 弹性计算 调度
阿里云容器服务 ACK 产品技术动态(202312)
容器服务 Kubernetes 版 ACK 【新功能】 Feature:支持基于机密虚拟机的 AI 模型推理保护 ACK 现已支持将基于 Intel® Trusted Domain Extension(Intel® TDX)技术的 ECS 实例加入 TDX 机密虚拟机计算节点池,使集群具备 TDX 机密计算能力,实现 AI 模型的可信推理和微调,保障模型数据的机密性与完整性。结合 PyTorch 与 Intel® AMX指令集,您可以在 32 核实例上实现秒级出图的推理能力。
401 1
|
3月前
|
jenkins Java 持续交付
【项目集成工具】Jenkins
【项目集成工具】Jenkins
|
2月前
|
Kubernetes 监控 调度
阿里云容器服务ACK
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)提供高性能、可伸缩的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。在ACK中,利用cGPU(Containerized GPU)技术可以实现GPU资源的共享,提高GPU利用率,降低整体成本。
47 6
|
24天前
|
jenkins 测试技术 Shell
百度搜索:蓝易云【Jenkins集成Allure报告】
通过以上步骤,你可以成功将Allure报告集成到Jenkins中,方便查看测试结果和统计测试报告的各项指标。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
15 0
|
1月前
|
监控 数据可视化 测试技术
集成阿里云 RPA 与现有系统
随着企业对自动化和数字化转型的需求不断增长,阿里云 RPA(机器人流程自动化)技术成为了提升业务效率和减少人工操作的重要工具。本文将介绍如何集成阿里云 RPA 与现有系统,以实现更高效的业务流程自动化。
|
1月前
|
Kubernetes 监控 Cloud Native
阿里云云原生容器高级工程师认证(ACP级-Alibaba Cloud Certification Professional)考试大纲
介绍阿里云云原生容器高级工程师认证(ACP级-Alibaba Cloud Certification Professional)所需具备的知识及学习方法等。
137 2
|
2月前
|
人工智能 运维 Kubernetes
期待已久!阿里云容器服务 ACK AI 助手正式上线
期待已久!阿里云容器服务 ACK AI 助手正式上线

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版