Jenkins 创建 Pipeline 项目
Jenkins Pipeline 简介
Jenkins pipeline 是 Jenkins 2.0 的精髓,,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色。简单来说,就是一套运行于 Jenkins 上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本,并且 Jenkins 支持从代码库直接读取脚本,从而实现了 Pipeline as Code 的理念。
Pipeline 的几个基本概念
Node:一个 Node 就是一个 Jenkins 节点,可以是 Master,也可以是 Slave,是 Pipeline中具体 Step 的运行环境。
Stage:一个 Pipeline 有多个 Stage 组成,每个 Stage 包含一组 Step。注意一个 Stage可以跨多个 Node 执行,即 Stage 实际上是 Step 的逻辑分组。
Step:是最基本的运行单元,可以是创建一个目录、从代码库中 checkout 代码、执行一个 shell 命令、构建 Docker 镜像、将服务发布到 Kubernetes 集群中。Step 由 Jenkins 和 Jenkins 各种插件提供。
Jenkinsfile
Jenkins Pipeline 支持两种语法,一种 Declarative Pipeline(声明式),一种 ScriptedPipeline(脚本式)。 声明式的 Pipeline 限制用户使用严格的预选定义的结构,是一种声明式的编程模型,对比脚本式的 Pipeline 学习起来更加简单;脚本式的 Pipeline 限制比较少,结构和语法的限制由 Groovy 本身决定,是一种命令式的编程模型。所以我们学习使用声明式的方式编写 jenkinsfile。一般来说 jenkinsfile 会被放在代码库的根目录下。当然也可以在 Web 页面定义。下面是两种不同方式的 jenkinsfile 示例。
# Jenkinsfile (声明式) pipeline { agent any stages { stage('Build') { steps { echo 'Building..' } } stage('Test') { steps { echo 'Testing..' } } stage('Deploy') { steps { echo 'Deploying....' } } } }
前面我们说过,声明式的Pipeline有严格的预定义格式结构,最外层必须是pipeline{},紧接着是 agent 指示 Jenkins 分配一个执行器和工作空间来执行下面的 Pipeline,stages和steps是申明式Jenkinsfile必须的,所有的stage必须要定义在stages里,每一个stage下的 step 要定义在一个 steps 里。
# Jenkinsfile ( 脚本式 ) node { stage('Build') { // } stage('Test') { // } stage('Deploy') { // } }
在脚本式 jenkinsfile 里,你可以定义一个 node 或者多个 node 块,然后在 node 块里定义你的 stage,在 stage 里定义你的 step 即可。
Pipeline Job 示例
1、登录到 jenkins 主页面,点击左侧菜单栏的 New Item。
2、进入到新建 Job 页面,输入 job 名称,在下面选择 Pipeline 类型,然后点击 OK。
3、打开 Pipeline 配置页面,点 Pipeline 选项卡,下拉到 pipeline 部分,选择 pipeline script,在页面定义 jenkinsfile 的方式,在脚本框输入下面的内容。 保存后回到 Job 主页面,点击“立即构建”。
pipeline { agent any stages { stage('Stage 1') { steps { echo 'Hello world!' } } } }
4、构建执行完成后,在页面的右侧以图形的形式显示 pipeline 的结构,点击对应的位置可以查看构建执行的情况。
5、在构建历史处,点击#1 查看这次构建的运行情况,点击“console output”可以看到 Pipeline 的详细运行情况。
通过 scm 获取 Jenkinsfile
首先我们在 gitlab 上的 monitor 仓库的根目录下创建一个 Jenkins 文件,文件的内容为:
pipeline { agent any stages { stage('Stage 1') { steps { echo 'Hello world!' } } } }
接着我们在 Jenkins 新建一个 pipeline job,命名为 My-pipeline-job01,前 2 步,同上一个示例一样,在 My-pipeline-job01 的配置页面,点击 Pipeline 选项卡,下拉到pipeline 部分,选择从 scm 获取 pipeline script
进入到 scm 配置页面,选择从 git 仓库获取
进入到 git 仓库配置页面,输入仓库地址,配置认证,选择分支等,然后点击保存。
保存配置后,回到 Job 主页面,执行“立即构件”,在”console output”中,我们可以看到,首先从 gitlab 仓库获取了所有的代码文件,然后识别到 Jenkins 文件,执行文件中定义的构建任务。
Pipeline 语法生成器
随着 Pipeline 一起发布的内建的文档,使得创建复杂的 Pipelines 更加容易。内建的文档可以根据安装在 Jenkins 实例中的插件,被自动生成和更新。
内建的文档可以通过链接被找到: localhost:8080/pipeline-syntax/。假设你已经有了一个正运行在本地 8080 端口上的实例。同样的文档可以连接到这里,通过任何项目的左边菜单”Pipeline Syntax”。
语法生成器是动态填充的,其中列出了可供 jenkins 使用的步骤,可用的步骤取决于安装的插件。
使用语法生成器生成步骤:
1、打开 Pipeline Syntax。
2、在“示例步骤”下拉菜单中,选择需要的步骤。
3、输入所选择步骤需要的参数信息。
4、点击“生成流水线脚本”生成脚本。
使用 pipeline 实现 monitor 仓库代码的发布
1、在 Gitlab 在 monitor 仓库的根目录上添加 Jenkinsfile 文件,文件内容如下:
此 jenkinsfile 包括五个 stage,分为 replace file、test、package、deploy,对于非编译项目,我们一般包括这五个阶段。
pipeline { agent any stages { stage('replace file') { steps { echo "replace config file use cp " } } stage('test') { steps { echo "unit test " } } stage('package') { steps { sh 'tar czf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=Jenkinsfile' } } stage('deploy') { steps { sh 'ssh 10.0.0.11 "cd /var/www && mkdir web-${BUILD_ID}"' sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.11:/var/www/web-${BUILD_ID}' sh 'ssh 10.0.0.11 "cd /var/www/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz &&rm -f web-${BUILD_ID}.tar.gz"' sh 'ssh 10.0.0.11 "cd /var/www && rm -rf html && ln -s /var/www/web-${BUILD_ID}" /var/www/html' } } stage('test') { steps { echo "deploy after test " } } } }
2、在 jenkins 上创建一新的 Job,job 名称为 monitor-web,类型为 pipeline。
3、配置 gitlab 自动触发构建(具体请参与前面部分相关内容)。
4、配置从 scm 获取 jenkins。
5、保存配置,返回 job 主页面,执行构建。我们看到我们部署已经成功。
Jenkins 权限管理
Jenkins 本身自带安全管理的功能,但是一般情况下很少去使用,更多是使用插件的方式进行更加灵活的处理。
Jenkins 的权限管理需要依赖 Jenkins 的权限管理插件。通过配置插件 role-base,可以很方便给不同用户不同 job 的管理和执行权限。
插件的安装与配置
在系统管理、插件管理中搜索 role-base 插件,可以进行安装,具体安装过程我们就不再叙述,大家可以查看我们插件管理部分的内容。插件安装完成之后,我们需要在“配置全局安全”中启用插件,打开“系统管理->全局安全配置”页面。
选择授权策略为“Role Based Strategy”,保存退出后,在系统管理页面出现一个角色管理工具,点击进入之后,就可以对我们的用户进行权限配置。
创建用户
我们来创建一个 dev 用户,在“系统管理”中,选择“管理用户”。
选择右侧的新建用户
输入用户名、密码等信息
点击“新建用户”完成用户创建。
角色管理
在“系统管理”,选择“Manage and Assign Roles”进入角色管理页面。
点击“Manage Role”,创建一个全局的 dev 角色,授权只读的权限。
在“角色管理页面”,选择“Assign Roles”,将 dev 用户赋予 dev 角色。
需要注意的是,之前 admin 或 root 的权限选项不要移除,否则这些用户可能无法登录。使用 dev 用户登录,发现没有任何 job,因为还没有为 dev 用户配置查看的 job 的权限。
回到角色管理页面,添加一个 dev 的 job 角色,使用正则表达式匹配 dev 角色可以管理的 job 的名称
在“Assign Roles”页面,将刚才创建的 job 角色配置给 dev 用户。
此时,我们再次使用 dev 用户登录 jenkins,即可以看到匹配到的 job,而且可以执行你配置的操作。
Jenkins 备份、升级、迁移
升级
下载新版 Jenkins.war 文件,替换旧版本 war 文件,重启即可。
Jenkins.war 文件的位置一般为/usr/lib/jenkins/Jenkins.war。
迁移、备份
Jenkins 的所有的数据都是以文件的形式存放在 JENKINS_HOME 目录中。所以不管是迁移还是备份,只需要操作 JENKINS_HOME 就行。建议将 JENKINS_HOME 打包后在拷贝,windows上可以用 zip,rar 等,Linux 上有 zip,tar 等。然后将打包的文件解压到新的 JENKINS_HOME目录就行了。
使用 thinbackup 插件备份
1)安装插件:
安装 ThinBackup 插件,可能 参考前面插件管理部分。
2)配置插件:
3 )手动备份:
我们到备份目录查看:
[root@node3 FULL-2017-12-08_15-48]# cd .. [root@node3 jenkins]# ll /data/jenkins/ total 4 drwxr-xr-x 5 root root 4096 Dec 8 15:48 FULL-2017-12-08_15-48 [root@node3 jenkins]# ll /data/jenkins/FULL-2017-12-08_15-48/
4 )测试从备份恢复
我们删除/var/lib/jenkins/job 目录下的 my‐freestyle‐job 目录。
[root@node3 jobs]# rm my-freestyle-job -rf [root@node3 jobs]# ll total 0 drwxr-xr-x 3 root root 38 Dec 8 15:48 accout-maven-job drwxr-xr-x 3 root root 101 Dec 8 15:48 frontend-job drwxr-xr-x 3 root root 101 Dec 8 15:48 pipline-demo
然后我们使用刚才的备份恢复:
恢复完成后,我发现刚才删除的目录又回来了:
[root@node3 jobs]# ll total 0 drwxr-xr-x 3 root root 38 Dec 8 15:48 accout-maven-job drwxr-xr-x 3 root root 101 Dec 8 15:48 frontend-job drwxr-xr-x 3 root root 38 Dec 8 15:48 my-freestyle-job drwxr-xr-x 3 root root 101 Dec 8 15:48 pipline-demo