0x00 前言
Jenkins是一款使用比较广泛的CI/CD
平台,2.0版本开始支持了pipeline
,通过jenkinsfile
文件进行流水线的控制。本文提供了一种在本地Linux环境中快速搭建Jenkins测试环境的方法。
0x01 环境部署
直接使用docker镜像搭建环境是一种比较快捷的方法。编写如下Dockerfile
文件:
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
分为声明式
和脚本式
,这里主要介绍声明式
。
下面是一个简单的模板:
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镜像
agent {
docker {
image 'demo/test/base:latest'
registryUrl 'https://drunkdream-docker.pkg.coding.net'
}
}
配置环境变量
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
程序进行环境变量的读取。
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"}
写法。如果需要这种用法,可以使用以下方式:
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}
方式访问,但其实它并不是环境变量。
动态配置环境变量
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
}
}
}