6场景代码
6.1 Svn提交后触发Jenkins自动构建
6.1.1 方法1
*基本思路:subversion+scm poll两个插件来监控,来监控SVN上面是否变更(是Jenkins主动监控SVN)
https://blog.csdn.net/modoo_junko/article/details/37593225
6.1.2 方法2
*基本思路:SVN代码变动后触动post-commit,然后触动Jenkins脚本进行构建操作
https://blog.csdn.net/q13554515812/article/details/86651851
6.2利用tools作用域实现多版本编译
在实际工作中,有时需要对同一份源码使用多个版本的编译器进行编译。tools指令除了支持pipeline作用域,还支持stage作用域。所以,我们可以在同一个pipeline中实现多版本编译。代码如下:
pipeline {
agent none
stages {
stage('build with jdk-10.0.2') {
tools {
jdk "jdk-10.0.2"
}
steps {
sh "printenv"
}
}
stage('build with jdk-9.0.4') {
tools {
jdk "jdk-9.0.4"
}
steps {
sh "printenv"
}
}
}
}
[1] 《Jenkins 2.x实战指南》
[2] https://blog.51cto.com/ygqygq2/2446717
[3] https://jenkins.io/zh/doc/book/pipeline/syntax/
[4] https://jenkins.io/zh/doc/pipeline/steps/
6.2 docker
[4] http://www.eryajf.net/3298.html
6.2.1常规用法。
日常构建部署中,常常会用到编译工作,因此这里的步骤可以放入到镜像中执行,这里利用node项目的编译举一个示例:
pipeline {
agent {
docker {
lable 'docker'
image 'registry.cn-hangzhou.aliyuncs.com/eryajf/node:11.15'
}
}
stages {
stage('Build') {
steps {
sh 'npm install --registry=https://registry.npm.taobao.org'
}
}
}
}
当流水线执行的时候,Jenkins会首先将代码更新,然后将 $WORKSPACE 挂载到容器之中,这个可以通过构建日志中看出来:
docker run -t -d -u 0:0 -w /root/.jenkins/workspace/test-pinpeline -v /root/.jenkins/workspace/test-pinpeline:/root/.jenkins/workspace/test-pinpeline:rw,z -v /root/.jenkins/workspace/test-pinpeline@tmp:/root/.jenkins/workspace/test-pinpeline@tmp:rw,z -e ******** registry.cn-hangzhou.aliyuncs.com/eryajf/node:11.15
接着执行我们定义的install编译命令,当然,下边可以继续添加步骤,将代码rsync到远程主机,或者其他操作。
此处可用的参数如下:
- lable(可选):定义一个标签,用处不十分大。
- image:定义构建时使用的镜像。
- args:可以定义类似docker run命令时的一些参数。
- alwaysPull:布尔类型,是否在每次运行的时候重新拉取镜像。
6.2.2添加参数。
日常编译比较影响构建时间的一个因素是本地缓存,因此还可以用如下方式将本地缓存挂载到容器之中,从而加快构建速度。
pipeline {
agent {
docker {
image 'registry.cn-hangzhou.aliyuncs.com/eryajf/node:11.15'
args '-v /root/.npm:/root/.npm'
}
}
stages {
stage('Build') {
steps {
sh 'npm install --registry=https://registry.npm.taobao.org'
}
}
}
}
6.2.3多个容器。
基于如上的事实,发散我们的思维,我们可以将许多个基础性的步骤,封装成一个又一个镜像,然后在每个步骤中只需调用封装好的镜像,传入所需的参数,即可完成比较复杂的构建。
多个容器用法,如下简示:
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'registry.cn-hangzhou.aliyuncs.com/eryajf/node:11.15'
args '-v /root/.npm:/root/.npm'
}
}
steps {
sh 'npm install --registry=https://registry.npm.taobao.org'
}
}
stage('deploy'){
agent {
docker {
image 'registry.cn-hangzhou.aliyuncs.com/mckj/ansible'
}
}
steps {
sh 'echo "通过ansbile进行部署"'
}
}
}
}
因为Jenkins默认会将$WORKSPACE挂载到两个容器中,因此各种操作直接基于当前目录即可,这是值得注意的一点。
这里只是做一个演示,提供一种思路,以后有需要,可以借此发挥更多的妙用。
6.2.4基于Dockerfile。
这种方式,应用的大概比较少,仅做简单介绍。
首先在项目根目录创建一个Dockerfile:
FROM eryajf/centos:7.5
MAINTAINER eryajf <linuxlql@163.com>
<linuxlql@163.com>
<linuxlql@163.com># Install node
<linuxlql@163.com>ADD node-v11.15.0-linux-x64.tar.xz /usr/local/
<linuxlql@163.com>
<linuxlql@163.com>ENV NODE /usr/local/node-v11.15.0-linux-x64
<linuxlql@163.com>ENV PATH $PATH:$NODE/bin
<linuxlql@163.com>
<linuxlql@163.com>RUN npm i -g pm2 gulp yarn --registry=https://registry.npm.taobao.org
然后定义Jenkinsfile:
pipeline {
agent { dockerfile true }
stages {
stage('Build') {
steps {
sh 'npm install --registry=https://registry.npm.taobao.org'
}
}
}
}
感觉起来,这种方式引入了过多的不确定因素,对于构建稳定性,反而不是一件好事儿,所以不太推荐。