Jenkins&CI/CD

Jenkins

什么是Jenkins?

  • 中文官网:https://www.jenkins.io/zh/
  • Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

  • Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

  • Jenkins 是由丰富的插件组成的软件,可使用持续集成、持续交付工具链中几乎所有工具,可扩展性非常强,官方称 构建伟大,无所不能!

    Jenkins 官方描述

DevOps

DevOps

  • DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

  • 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

  • 它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。

如何落地实现DevOps理念?

DevOps 兴起于2009年,近年来由于云计算、互联网的发展,促进了DevOps的基础设施及工具链的发展,涌现了一大批优秀的工具,这些工具包括开发,测试,运维的各个领域,例如:GitHub,Git/svn,Docker、Jenkins,HudSon,Ant/Maven/Gradle,QUnit、JMeter等等。

虽然有那么多优秀的工具提高了软件的效率与质量,但是那么多软件一个个手动操作也变得繁琐起来,使用CICD自动化完成这些事情就好了!

DevOps 流程

DevOps 技术栈

CI/CD

传统的开发流程:

  1. 项目经理分配模块给开发人员
  2. 开发人员进行开发,并进行单元测试
  3. 开发完毕,将各模块进行集成,部署到测试服务器
  4. 开发人员进行测试,如果发现bug 回到2 :开发人员修改bug;如果没有发现bug进入5
  5. 部署到生产服务器

问题:

  1. 模块之间依赖关系复杂,在集成时发现大量bug
  2. 测试人员等待测试时间过长
  3. 软件交付时间得不到保障

如何解决问题

  1. 可否将集成测试的时间提前,让测试提前发现bug?
  2. 可否将集成、部署使用自动化的方式代替人工以提升效率?

应用CI/CD,CI/CD 指的是三个方法

参考博客 :@Penn Li:什么是CICD

  • 持续集成(Continuous Integration)

    • 持续集成的重点是将各个开发人员的工作集合到一个代码仓库中。通常,每天都要进行几次,主要目的是尽早发现集成错误,使团队更加紧密结合,更好地协作。
  • 持续交付(Continuous Delivery)

    • 持续交付的目的是最小化部署或释放过程中固有的摩擦。它的实现通常能够将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理想情况下)。
  • 持续部署(Continuous Deployment)
    • 持续部署是一种更高程度的自动化,无论何时对代码进行重大更改,都会自动进行构建/部署。

CI/CD

安装Jenkins

官方建议使用的Docker映像是jenkinsci/blueocean image(来自 Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。Blue Ocean 是一个可视化的插件,美化了自动化构建的过程!

  1. docker启动Jenkins

    docker run \
    -u root \
    -d \
    -p 8080:8080 \
    -p 50000:50000 \
    -v /var/jenkins_home:/var/jenkins_home \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name jenkins \
    jenkinsci/blueocean
  2. 修改插件安装网址,这一步很关键,因第一次登陆会安装插件,如果不换地址超级慢甚至可能导致安装异常(安装异常的表象是进入主页后点击右上角的退出进入的不是登陆页面!需要重新安装)

    # 进入jenkins挂载目录下updates
    cd /var/jenkins_home/updates
    #把 “ www.google.com ” 替换成 “ http://www.baidu.com/ ”
    #全局搜索 “ updates.jenkins-ci.org/download ” 替换成 mirrors.tuna.tsinghua.edu.cn/jenkins
    sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  3. 查看密码,

    # 第一次启动会输出在日志中
    docker logs -f jenkins
    # 或者查看文件里的
    cat /var/jenkins_home/secrets/initialAdminPassword

    docker logs -f jenkins

  4. 访问主机映射出来的端口(这里是8080),输入密码后给我们两个方式安装插件,可以选择安装默认的,进去之后再安装自定义的,也可以直接选择需要的自定义插件!

    安装插件

    • 我这里可能要用到GitHub和GitLab,所以都 ☑️ 上

      选择插件

  5. 接下来就是漫长的等待…(如果超过5分钟第一行还没有安装完,可能是下载镜像没有替换成功,需要删除 /var/jenkins_home 目录从第一步重新开始)

    安装进度条

  6. 安装完毕后经过简单的用户创建即可安装完毕

    安装完成

  7. 进入主页后点击退出,如果进入的是登录页并且可以使用刚刚创建的用户成功登陆,恭喜你jenkins安装成功!

    主页

    登录页

安装Jenkins插件

中文插件

Gitee

  • 安装后,点击重启即可生效

重启

Jenkins 的使用

Pipeline

使用流水线基本步骤

  1. 创建一个流水线任务

创建一个流水线

  1. 创建之后,发现可以配置脚本来定义流水线如何工作

    流水线脚本

  2. 配置一下简单的执行脚本 流水线脚本语法官方文档

    pipeline {
    agent any
    stages {
    stage('构建') {
    steps {
    sh 'echo "Hello World"'
    sh '''
    echo "多条命令在一个步骤下start..."
    ls -lah
    echo "多条命令在一个步骤下end..."
    '''
    }
    }
    stage('测试') {
    steps {
    sh 'echo 测试开始'
    sh '''
    echo "测试结束"
    '''
    }
    }
    }
    }

打开Blue Ocean 点击运行

  1. 触发流水线

流水线执行可视化界面

定义执行环境

agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 所有的Pipeline都需要 agent 指令。

在执行引擎中,agent 指令会引起以下操作的执行:

  • 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。

  • 一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件

流水线工作目录

  • agent any :在任何可用的代理上执行流水线或阶段

  • agent none :当在 pipeline 块的顶部没有全局代理, 但是每个 stage 部分都需要包含他自己的 agent

  • label :在提供了标签的 Jenkins 环境中可用的代理上执行流水线或阶段。 例如: agent { label 'my-defined-label' }

  • node :agent { node { label 'labelName' } }agent { label 'labelName' } 一样, 但是 node 允许额外的选项 (比如 customWorkspace )

  • docker :

    使用给定的容器执行流水线或阶段。该容器将在预置的 node上,或在匹配可选定义的label 参数上,动态的供应来接受基于Docker的流水线。 docker 也可以选择的接受 args 参数,该参数可能包含直接传递到 docker run 调用的参数, 以及 alwaysPull 选项, 该选项强制 docker pull ,即使镜像名称已经存在。 比如: agent { docker 'maven:3-alpine' }

    agent {
    docker {
    image 'maven:3-alpine'
    label 'my-defined-label'
    args '-v /tmp:/tmp'
    }
    }
  • dockerfile :

    执行流水线或阶段, 使用从源代码库包含的 Dockerfile 构建的容器。为了使用该选项, Jenkinsfile 必须从多个分支流水线中加载, 或者加载 “Pipeline from SCM.” 通常,这是源代码仓库的根目录下的 Dockerfile : agent { dockerfile true }. 如果在另一个目录下构建 Dockerfile , 使用 dir 选项: agent { dockerfile {dir 'someSubDir' } }。如果 Dockerfile 有另一个名称, 你可以使用 filename 选项指定该文件名。你可以传递额外的参数到 docker build ... 使用 additionalBuildArgs 选项提交, 比如 agent { dockerfile {additionalBuildArgs '--build-arg foo=bar' } }。 例如, 一个带有 build/Dockerfile.build 的仓库,期望一个构建参数 version:

    agent {
    // Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
    dockerfile {
    filename 'Dockerfile.build'
    dir 'build'
    label 'my-defined-label'
    additionalBuildArgs '--build-arg version=1.0.2'
    }
    }

环境变量

pipeline {
agent any
environment {
JAVA_HOME = '/usr/local/java'
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}

stages {
stage('Build') {
steps {
sh 'echo ${JAVA_HOME}'
}
}
}
}

善后处理

使用post块,可以告诉jenkins执行结束后执行什么:

  • always :总是执行
  • success :成功后执行
  • unstable :不稳定的状态
  • failure :失败时执行
  • changed :只有当前流水线或阶段的完成状态与它之前的运行不同时
  • aborted: 通常由于流水线被手动的aborted。
pipeline {
agent any
post {
always {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
success {
echo 'I succeeeded!'
}
unstable {
echo 'I am unstable :/'
}
failure {
echo 'I failed :('
}
changed {
echo 'Things were different before...'
}
}
}

发送邮件

可以在post块中某个处理下,发送邮件,比如在构建失败后发送邮件通知

post {
failure {
mail to: 'team@example.com',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}

人工确认

使用 input 命令,可以暂停等待人工确认是否进行下一个步骤

pipeline {
agent any
stages {
stage('Deploy - Staging') {
steps {
echo 'Building'
}
}

stage('Sanity check') {
steps {
input "是否开始下一个步骤?"
}
}

stage('Deploy - Production') {
steps {
echo 'Building'
}
}
}
}

人工确认

WebHook

  • WebHook事件钩子,几乎每个代码仓库:码云、github、gitlab…都有webhook

  • 可以实现,当我们代码提交,发送一个事件给jenkins,jenkins立马进行编译、构建、发布等工序

  1. 配置触发器,这里测试选择gitee webhook,并生成密码

    配置触发器

    生成密码

  2. 登录gitee选择一个存储库,在设置中找到webhooks,填写webhook地址、密码并添加webhook

    添加webhook

  3. 提交代码测试或者直接点击测试按钮

    成功通知到jenkins进行构建

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/06/Jenkins/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀