文章目录
pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核 心插件,简单来说 Pipline 就是一套运行于 Jenkins 上的工作流框架,将原本独立运行 于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而 实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline 的实现方式是一套 Groovy DSL,任何发布流程都可以表述为一段 Groovy 脚本。
一、pipline 语法
Stage:阶段,一个 pipline 可以划分为若干个 stage,每个 stage 都是一个操作步骤, 比如 clone 代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多 个 node 执行。
Node:节点,每个 node 都是一个 jenkins 节点,可以是 jenkins master 也可以是 jenkins agent,node 是执行 step 的具体服务器。
Step:步骤,step 是 jenkins pipline 最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类 Jenkins 插件提供实现,一个 stage 中可以有多个 step,例如: sh “make”
二、pipline 优势
可持续性:jenkins 的重启或者中断后不影响已经执行的 Pipline Job。
支持暂停:pipline 可以选择停止并等待人工输入或批准后再继续执行。
可扩展:通过 groovy 的编程更容易的扩展插件。
并行执行:通过 groovy 脚本可以实现 step,stage 间的并行执行,和更复杂的相互依赖关系。
三、pipline job 测试
3.1 创建 pipline job
3.2 测试简单 pipline job 运行
3.2.1 编写pipline代码
node('jenkins-slave1'){
stage("clone 代码"){
echo "代码 clone"
}
stage("代码构建"){
echo "代码构建"
}
stage("代码测试"){
echo "代码测试"
}
stage("代码部署"){
echo "代码部署"
}
}
Jenkins Web 界面配置
3.2.2 执行 pipline job
立即构建,查看构建状态
3.3 测试拉取代码 pipline job 运行
3.3.1 自动生成拉取代码的 pipline 脚本
点击 流水线语法 跳转至生成脚本 URL
git branch: 'develop', credentialsId: 'f55bf2a5-abd5-4f08-87ae-3e9ad4cb1024', url: 'git@10.0.0.31:lcklck/app1.git'
3.3.2 更改 pipline job
3.3.3 执行 pipline job
3.3.4 验证 git clone 日志
3.3.5 jenkins 服务器验证 clone 代码数据
lck@jenkins-slave1:~$ cat /var/lib/jenkins/workspace/linux-pipline-test/index.html
<h1>v111</h1>
<h1>v222</h1>
<h1>v333</h1>
3.4 测试脚本式 pipline 代码
3.4.1 编写脚本式 pipline 代码
node('jenkins-slave1'){
stage("clone 代码"){
git branch: 'develop', credentialsId: 'f55bf2a5-abd5-4f08-87ae-3e9ad4cb1024', url: 'git@10.0.0.31:lcklck/app1.git'
}
stage("代码构建"){
sh 'cd /var/lib/jenkins/workspace/linux-pipline-test && tar czvf code.tar.gz ./index.html'
}
stage("代码复制"){
sh 'cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.37:/data/tomcat/tomcat_appdir/'
sh 'cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.38:/data/tomcat/tomcat_appdir/'
sh 'cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.39:/data/tomcat/tomcat_appdir/'
}
stage("停止 tomcat 服务"){
sh 'ssh tomcat@10.0.0.37 "/etc/init.d/tomcat.sh stop"'
sh 'ssh tomcat@10.0.0.38 "/etc/init.d/tomcat.sh stop"'
sh 'ssh tomcat@10.0.0.39 "/etc/init.d/tomcat.sh stop"'
}
stage("代码部署"){
sh 'ssh tomcat@10.0.0.37 "rm -rf /data/tomcat/tomcat_webdir/myapp/* && cd /data/tomcat/tomcat_appdir && tar xvf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"'
sh 'ssh tomcat@10.0.0.38 "rm -rf /data/tomcat/tomcat_webdir/myapp/* && cd /data/tomcat/tomcat_appdir && tar xvf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"'
sh 'ssh tomcat@10.0.0.39 "rm -rf /data/tomcat/tomcat_webdir/myapp/* && cd /data/tomcat/tomcat_appdir && tar xvf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"'
}
stage("启动 tomcat 服务"){
sh 'ssh tomcat@10.0.0.37 "/etc/init.d/tomcat.sh start"'
sh 'ssh tomcat@10.0.0.38 "/etc/init.d/tomcat.sh start"'
sh 'ssh tomcat@10.0.0.39 "/etc/init.d/tomcat.sh start"'
}
}
3.4.2 执行并验证 pipline job
3.5 测试声明式 pipline job 代码
3.5.1 编写声明式 pipline job 代码
root@jenkins-master:~# cd app1/
root@jenkins-master:~/app1# vim index.html
<h1>v111</h1>
<h1>v222</h1>
<h1>v333</h1>
<h1>v444</h1>
root@jenkins-master:~/app1# git commit -m "v4 version"
[master 625ecab] v4 version
1 file changed, 1 insertion(+)
root@jenkins-master:~/app1# git push
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 297 bytes | 297.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 10.0.0.31:lcklck/app1.git
3f721f0..625ecab master -> master
pipeline{
agent { label 'jenkins-slave1' }
stages{
stage("代码clone"){
steps{
sh "cd /var/lib/jenkins/workspace/linux-pipline-test && rm -rf ./*"
git credentialsId: 'f55bf2a5-abd5-4f08-87ae-3e9ad4cb1024', url: 'git@10.0.0.31:lcklck/app1.git'
echo "代码 clone完成"
}
}
stage("代码构建"){
steps{
sh "cd /var/lib/jenkins/workspace/linux-pipline-test && tar czvf code.tar.gz ./index.html"
}
}
stage("停止服务"){
steps{
sh 'ssh tomcat@10.0.0.37 "/etc/init.d/tomcat.sh stop && rm -rf /data/tomcat/tomcat_webapps/myapp/*"'
sh 'ssh tomcat@10.0.0.38 "/etc/init.d/tomcat.sh stop && rm -rf /data/tomcat/tomcat_webapps/myapp/*"'
sh 'ssh tomcat@10.0.0.39 "/etc/init.d/tomcat.sh stop && rm -rf /data/tomcat/tomcat_webapps/myapp/*"'
}
}
stage("代码copy"){
steps{
sh "cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.37:/data/tomcat/tomcat_appdir/"
sh "cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.38:/data/tomcat/tomcat_appdir/"
sh "cd /var/lib/jenkins/workspace/linux-pipline-test && scp code.tar.gz tomcat@10.0.0.39:/data/tomcat/tomcat_appdir/"
}
}
stage("代码部署"){
steps{
sh 'ssh tomcat@10.0.0.37 "cd /data/tomcat/tomcat_appdir/ && tar xvf code.tar.gz -C /data/tomcat/tomcat_webapps/myapp/"'
sh 'ssh tomcat@10.0.0.38 "cd /data/tomcat/tomcat_appdir/ && tar xvf code.tar.gz -C /data/tomcat/tomcat_webapps/myapp/"'
sh 'ssh tomcat@10.0.0.39 "cd /data/tomcat/tomcat_appdir/ && tar xvf code.tar.gz -C /data/tomcat/tomcat_webapps/myapp/"'
}
}
stage("启动服务"){
steps{
sh 'ssh tomcat@10.0.0.37 "/etc/init.d/tomcat.sh start"'
sh 'ssh tomcat@10.0.0.38 "/etc/init.d/tomcat.sh start"'
sh 'ssh tomcat@10.0.0.39 "/etc/init.d/tomcat.sh start"'
}
}
}
}
3.5.2 执行并验证 pipline job
3.6 使用Jenkinsfile放置pipline代码
3.6.1 编写Jenkinsfile并提交Gitlab
root@jenkins-master:~/app1# vim Jenkinsfile
pipeline{
agent { label 'jenkins-slave1' }
stages{
stage("代码clone"){
steps{
...............................................
root@jenkins-master:~/app1# git add .
root@jenkins-master:~/app1# git commit -m "add Jenkinsfile"
[master 3424fa3] add Jenkinsfile
1 file changed, 51 insertions(+)
create mode 100644 Jenkinsfile
root@jenkins-master:~/app1# git push
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 809 bytes | 809.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 10.0.0.31:lcklck/app1.git
625ecab..3424fa3 master -> master