0x00 前言
Jenkins是一款使用比较广泛的CI/CD平台,2.0版本开始支持了pipeline,通过jenkinsfile文件进行流水线的控制。本文提供了一种在本地Linux环境中快速搭建Jenkins测试环境的方法。
0x01 环境部署
直接使用docker镜像搭建环境是一种比较快捷的方法。编写如下Dockerfile文件:
1 2 3 4 5 6
| FROM jenkins/jenkins:lts
USER root RUN apt -y update \ && apt -y upgrade \ && apt -y install python-pip
|
使用命令:docker build -t jenkins .进行镜像编译。
编译后使用命令:docker run --name jenkins -i -p 8787:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /data/jenkins/jenkins_home:/var/jenkins_home:rw jenkins启动镜像。
/var/run/docker.sock和/usr/bin/docker这两个挂载是为了支持Docker in Docker。/data/jenkins/jenkins_home这个挂载是为了便于保存Jenkins数据,以免容器重启后又要重新配置。
0x02 初始化Jenkins配置
使用浏览器访问http:/127.0.0.1:8787/页面,进行初始化操作。
配置代理
0x03 编写Jenkinsfile
文档地址:https://jenkins.io/zh/doc/book/pipeline/syntax/。
Jenkinsfile分为声明式和脚本式,这里主要介绍声明式。
下面是一个简单的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| pipeline { agent { label "default" }
stages { stage("检出") { steps { sh 'ci-init' checkout( [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } }
stage("构建") { steps { echo "构建中..." sh 'go version' sh 'node -v' sh 'java -version' sh 'php -v' sh 'python -V' sh 'gcc -v' sh 'make -v' // 请在这里放置您项目代码的单元测试调用过程,例如: // sh 'mvn package' // mvn 示例 // sh 'make' // make 示例 echo "构建完成." // archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物 } }
stage("测试") { steps { echo "单元测试中..." // 请在这里放置您项目代码的单元测试调用过程,例如: // sh 'mvn test' // mvn 示例 // sh 'make test' // make 示例 echo "单元测试完成." // junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程 } }
stage("部署") { steps { echo "部署中..." // 请在这里放置收集单元测试报告的调用过程,例如: // sh 'mvn tomcat7:deploy' // Maven tomcat7 插件示例: // sh './deploy.sh' // 自研部署脚本 echo "部署完成" } } } }
|
高级用法
指定docker镜像
1 2 3 4 5 6
| agent { docker { image 'demo/test/base:latest' registryUrl 'https://drunkdream-docker.pkg.coding.net' } }
|
配置环境变量
1 2 3
| environment { MY_ENV = 'test' }
|
访问环境变量
Jenkins内置的环境变量列表可以在http://jenkins-server/pipeline-syntax/globals#env地址中获取。
环境变量可以通过${env.My_ENV}或${My_ENV}或$My_ENV来访问。需要注意的是,使用引号的时候尽量使用",如:echo "${env.My_ENV}",否则会无法生效。Jenkins应该是在运行时将变量动态替换成了实际值,使用单引号的话,则不会进行替换。
而如果写成sh 'echo ${MY_ENV}'则是可以正常工作的,因为此时是由shell程序进行环境变量的读取。
1 2 3 4 5 6 7 8 9 10
| stage('测试') { steps { echo "${env.MY_ENV}" echo "${MY_ENV}" echo "$MY_ENV" sh 'echo $MY_ENV' sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"' echo '${env.MY_ENV}' //输出`${env.MY_ENV}` } }
|
前五条命令都可以正常输出变量值,但最后一条却无法输出。
将命令行输出赋值给变量
Jenkins的${env.My_ENV}方式不支持默认值,也就是bash中的${MY_ENV:-"test"}写法。如果需要这种用法,可以使用以下方式:
1 2 3 4 5 6 7 8 9
| stage('测试') { steps { script { ENV1 = sh(returnStdout: true, script: 'echo ${MY_ENV:-"default"}').trim() } sh 'echo ${ENV1}' //可以正常输出 sh 'python -c "print(__import__(\'os\').environ[\'ENV1\'])"' //会报错 } }
|
trim()方法可以去掉前后的空白字符。
注意:${MY_ENV:-"default"}不能写成${env.MY_ENV:-"default"}
虽然这种方式赋值的变量也可以通过${env.ENV1}方式访问,但其实它并不是环境变量。
动态配置环境变量
1 2 3 4 5 6 7 8 9 10
| stage('测试') { steps { script { ENV1 = sh(returnStdout: true, script: 'echo ${MY_ENV:-"default"}').trim() } withEnv(["MY_ENV=${ENV1}"]) { sh 'python -c "print(__import__(\'os\').environ[\'MY_ENV\'])"' //输出default } } }
|