先扯淡几句


从2005年2月到2016年4月jenkins2发布,jenkins已经经历了10多个年头了,在CI(持续化集成)中扮演着十分重要的地位。随着Docker的诞生,把容器的使用门槛降低更低,把服务部署到容器里面,让服务的部署变得更便捷、灵活。从代码提交到服务的自动部署,测试,销毁服务,在回到代码提交…每一份提交一份代码都能看到最终部署结果,这对敏捷团队来说再好不过了。

这篇博客没有讲太深的内容,一些使用技巧和心得之后有机会的话会和大家继续分享。此处暂且先抛个砖,希望能带给大家一个比较好的入门文档 🙂

Jenkins2的特点


  • CD(Continuous Delivery)
    • pipeline
  • 提高易用度(开箱即用,拎包入驻,包网包水电…)
    • getting started
    • create item
    • job configure
  • 完全向前兼容 (?)
    • 似乎没有官方说的那么好,升级到jenkins2之后遇到好几个插件都挂了

Why Pipeline?


官方给出的几个pipeline特性是:

  • Visualized(可视化)
    • 安装了Pipeline Satge view,可将pipeline的整个过程使用模块视图的方式展示
      example
  • Durable(这个不知道怎么翻译好…耐用的?)
    • pipeling任务进程在master宕机后依旧可以独立运行,master重启后可以恢复任务
  • Pausable(可暂停)
    • pipeline脚本可以使用input关键字,阻塞等待用户选择是否继续执行
  • Versatile(功能强大的)
    • 支持复杂的CD需求
      example
  • Extensible(可扩展的)
    • 可以在pipeline里面调用插件提供的接口

pipeline插件在Jenkins 2发布后(同时pipeline也发布了2.0)的安装数量变化趋势:
pipeline plugin downloads

jenkins2 的最大改进是从CI到CD的一个扩展,CD中的代表就是pipeline,pipeline的出现是受到Build Flow Plugin的启发,所以和Build Flow会有不少神似之处。
为什么使用pipeline?先撇开VisualizedDurablePausable…这些特性不说,以前的jenkins配置,基本上就是一个job对应一个Git、一个Agent(运行节点)。对于有好几个Git的项目,就需要对每一个Git建立各自的job,并建立上下游关系,还需要有至少一个统一的下游job去触发整体的部署工作,扩展性很受限制。然而,pipeline as code,可以将一系列的配置写在pipeline中,甚至可以将这些编译部署过程全写在Jenkinsfile中使用单独一个版本控制去维护。

pipeline基本组成


  • Stage
    • 表示当前进行的阶段,名字可以随意去,如:git、build、test、build等
  • Node
    • 后面接一个小括号和一个大括号,小括号指定节点的名字或标签(缺省时随机选择节点),大括号表示在该节点运行的内容
  • Step
    • 像git、echo、sh、archiveArtifacts等这些指令,一个指令就是一个step

如:

Stage "build"   // ----------------------------------------> Stage
node ("master") {   // ----------------------------------> Node
    git "https://cr.deepin.io/xxxx"   // --------------> Step
    sh "make build"   // ---------------------------------> Step
}

创建一个pipeline job


点击左侧的New Item,选择pipeline类型的Job
New Item

几个小demo实践一下 😛


在Job的配置页面写入一个hello world的pipeline脚本

stage 'Stage 1'
node("master") {
   echo 'Hello world'
}

pipeline hello world

保存配置,回到Job的控制页面,点击Build Now

运行成功后,可以看到pipeline stage view plugin展示出来的stage视图(如果插件没有安装的话到Manager Jenkins > Manager Plugin中安装):

Ok,第一个pipeline运行成功

尝试一下更复杂一些的demo:

  • parallel (并行) demo
stage 'parallel-testing'
node("master"){
    parallel 'check one': {
        echo "start checking one"
        sleep 5
        echo "finish checking one"
    }, 'check two': {
        echo "start checking two"
        sleep 15
        echo "finish checking two"
    }, 'check three': {
        echo "start checking three"
        sleep 10
        echo "finish checking three"
    }
}
  • 混合型demo
node("master"){
    stage 'git'
    git url:'https://cr.deepin.io/only-for-test', branch:'master'

    stage 'build & package'
    echo "npm install"
    echo "node node_modules/gulp/bin/gulp.js build"
    echo "package ..."
    sleep 3

    stage "test"
    echo "deploy to testing environment, testing..."
    sleep 5

    input "测试通过,是否部署?"    // 这里会阻塞等待用户的输入
    stage 'Deploy'
    echo "deploying"
    sleep 2

    echo "finish."
}

HELP:借助snippet generator生成pipeline代码块


刚接触pipeline的话肯定会对pipeline的groovy语法和一些命令的使用不熟悉,没关系,jenkins pipeline早早就准备好了一个代码模块生成器

到任意一个pipeline的job页面,进入pipeline syntax

Sample Step中可以选择任意你想了解使用的指令

比如,选择Build job(触发其他job)这个命令,选择之后,这个指令所接受的参数,如wait for completionparameters等,都会自动展示出来,让你直接填写。完成后,点击Generate Groovy,生成代码:

是不是突然感觉轻松了好多?Jenkins pipeline的辅助工具做得还是比较好、比较全面的 😉

补充两个pipeline高级用法


尝试了几个demo之后,意犹未尽?那就一起看看高级一些的用法呗

Jenkinsfile

当pipeline代码化了,内容变多,也许就需要使用版本管理工具去管理了,Jenkins官方也推荐将pipeline代码存放在独立的Jenkinsfile中,pipeline插件提供了Pipeline script from SCM机制,配置也不难,如下图:
pipeline scm
图中的Jenkinsfile-demo仓库中只有一个Jenkinsfile文件,文件内容就是直接的pipeline脚本
(官方文档说,当Jenkinsfile仓库有更新时Pipeline script from SCM会自动拉取构建,然而我并没发现它会自动拉取,不过这个也不影响,可以在配置中的Build Triggers部分加上对应的触发器也是一样可以自动触发的)

Pipeline的Docker扩展

先安装CloudBees Docker Pipeline插件,然后接上一个带有Docker环境的节点

也举个栗子吧:

stage "docker"
node('docker-agent'){
    docker.image('busybox').inside('-v /tmp/data:/data') {
        sh 'ls /'
    }
}

这个栗子的意思是:选择busybox作为运行镜像,insidedocker run的启动参数,-v /tmp/data:/data是指将/tmp/data目录挂载到容器里面的/data目录中,{}块为在容器内执行的动作。

其他具体的使用可以使用pipeline snippet generator(上面有说到怎么使用)或者参考下面这个表格:

WORKFLOW SCRIPT EXAMPLE(S)
image (Provides a handle to image ) def image = docker. image(‘maven:3.3.3-jdk8’)
image.inside (Runs steps inside image ) image.inside(‘-v /repo:/repo’) { // some block }
image.pull (Pulls image ) image.pull()
image.push (Push image to registry ) image.push() image.push(“latest”)
image.run (Runs Docker image and returns container ) def container = image.run(“–name my-api -p 8080:8080”) container.stop()
image.withRun (Runs image and auto stops container ) image.withRun {api -> testImg. inside(“–link=${api.id}:api”) { // some block } }
image.tag (Records tag of image ) image.tag(“${tag}”, false)
image.imageName() (Provides image name prefixed with registry info ) sh “docker pull ${image. imageName()}”
container.id (ID of running container ) sh “docker logs ${container.id}”
container.stop (Stops and removes container ) container.stop()
build (Builds Docker image ) docker.build(“cb/ api:${tag}”,”target”)
withServer (Runs block on given Docker server ) docker.withServer(‘tcp://swarm. cloudbees.com:2376’, ‘swarm-certs’) { // some block }
withRegistry (Runs block using specified Docker registry ) docker.withRegistry(‘https:// registry.cloudbees.com/’, ‘docker- registry-login’) { // some block }
withTool (Specifies name of Docker client to use ) docker.withTool(‘toolName’) { // some block }

(表格参考自:Continuous Delivery With Jenkins Workflow

附:使用docker快速搭建Jenkins环境


(如果已经搭建了可以忽略此小节)

step 1: 依赖

step 2:启动Jenkins

先创建一个目录,在该目录下创建docker-compose.yml文件
docker-compose.yml

jenkins:
    container_name: jenkins
    image: jenkinsci/jenkins:2.14
    ports:
        - "8080:8080"
        - "50000:50000"
    environment:
        - JAVA_OPTS=-Duser.timezone=Asia/Shanghai
    volumes:
        - $PWD/jenkins_home:/var/jenkins_home
    restart: always

在该目录下创建jenkins_home目录,用于容器中的jenkins_home的挂载

mkdir -p jenkins_home
# jenkins容器里面的执行用户是id为1000的jenkins用户,对jenkins_home目录需要读写权限
sudo chown 1000:1000 jenkins_home

启动Jenkins:

docker-compose up

step 3:输入initialAdminPasswd

浏览器打开http://localhost:8080
getting started

看刚刚docker-compose的输出中:
admin passwd

拷贝passwd,输入,continue

step 4:安装插件

install plugin
(如果等太久没出这个页面,可以尝试手动刷新一下)

这个页面也是Jenkins2对“易用性”的改进之一,已经归类好一些推荐的插件,一键安装即可。点击Install suggested plugins,进入安装页面。(由于国内网络的原因,插件有可能会安装失败,可刷新,选择Retry安装部分安装失败的插件)

step 5:管理员账号设置

admin
安装完成后,进入管理员账号设置页面,填上基本信息,继续。

点击Start using Jenkins进入Jenkins主页面,安装完成。pipeline等相关组件在刚刚的suggested plugins也已经装上了。接下来看Jenkins pipeline的使用。

其他推荐:

参考:


(完)

3 thoughts on “Jenkins2.0 从CI到CD”

  1. 整理了一下目录的基本结构,增加了目录展示插件,终于清晰一些了…

发表评论

电子邮件地址不会被公开。 必填项已用*标注