pipeline中使用docker
来源:原创
时间:2021-02-07
作者:脚本小站
分类:Jenkins
先在jenkins中安装docker pipeline插件,并将jenkins加入docker用户组。
usermod -aG docker jenkins
在镜像中执行命令:
pipeline {
agent {
docker { image 'node:7-alpine' } //定义镜像
}
stages {
stage('Test') {
steps {
sh 'node --version' // 在镜像 node:7-alpine 中执行该命令
}
}
}
}为容器添加运行参数:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v $HOME/.m2:/root/.m2' // 为容器添加运行参数
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B' // 在容器中执行该命令
}
}
}
}在多个容器中执行命令:
pipeline {
agent none
stages {
stage('Back-end') {
agent {
docker { image 'maven:3-alpine' } // 定义镜像一
}
steps {
sh 'mvn --version' // 在容器一中执行命令
}
}
stage('Front-end') {
agent {
docker { image 'node:7-alpine' } // 定义镜像二
}
steps {
sh 'node --version' // 在容器二中执行命令
}
}
}
}在自己构建的镜像中执行命令:
pipeline {
agent { dockerfile true }
stages {
stage('Test') {
steps {
sh 'node --version'
sh 'svn --version'
}
}
}
}运行一个sidecar容器:withRun是运行参数。
node {
checkout scm
/*
* In order to communicate with the MySQL server, this Pipeline explicitly
* maps the port (`3306`) to a known port on the host machine.
* 将这个镜像的3306端口映射到主机了,这样就可以为jenkins提供测试环境了,而无需在本地安装mysql了
*/
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw" -p 3306:3306') { c ->
/* Wait until mysql service is up */
sh 'while ! mysqladmin ping -h0.0.0.0 --silent; do sleep 1; done'
/* Run some tests which require MySQL */
sh 'make check'
}
}运行一组容器:
node {
checkout scm
// 最外面跑的容器是提供本次构建的测试环境的
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
// 这个容器是在内部执行了一个命令
docker.image('mysql:5').inside("--link ${c.id}:db") { // inside表示在容器内部运行命令
/* Wait until mysql service is up */
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
}
// 这个容器在内部执行了一个需要mysql服务的命令
docker.image('centos:7').inside("--link ${c.id}:db") {
/*
* Run some tests which require MySQL, and assume that it is
* available on the host name `db`
*/
sh 'make check'
}
}
}可以查看日志:
sh "docker logs ${c.id}"构建镜像:
node {
checkout scm
def customImage = docker.build("my-image:${env.BUILD_ID}") // imagename:tag
customImage.inside {
sh 'make test' // 在构建好的镜像内部执行测试命令
}
}将构件好的镜像上传到仓库:
node {
checkout scm
def customImage = docker.build("my-image:${env.BUILD_ID}")
customImage.push()
// customImage.push('latest') 也可以指定上传不同的标签
}指定构建镜像的Dockerfile:
node {
checkout scm
def testImage = docker.build("test-image", "./dockerfiles/test") // 第二个参数可以指定构件进行的Dockerfile
testImage.inside {
sh 'make test'
}
}添加其他的构建参数:
node {
checkout scm
def dockerfile = 'Dockerfile.test'
// 第二个参数还可以添加其他构建镜像的参数,参数最后的位置是Dockerfile文件的位置
def customImage = docker.build("my-image:${env.BUILD_ID}", "-f ${dockerfile} ./dockerfiles")
}调用远程的docker:
node {
checkout scm
// 调用远程的docker服务来跑容器
docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {// 第二个参数是docker容器所需的认证
// 跑这个镜像来提供本次测试的运行环境
docker.image('mysql:5').withRun('-p 3306:3306') {
/* do things */
}
}
}使用自定义的docker仓库:
node {
checkout scm
// 自定义的docker仓库
docker.withRegistry('https://registry.example.com') {
// 提供运行环境并执行命令
docker.image('my-custom-image').inside {
sh 'make test'
}
}
}自定义仓库的密码和账号:
node {
checkout scm
// 设置自定义仓库的认证,第二个参数是在jenkins中设置好的认证id,填上去就可以了
docker.withRegistry('https://registry.example.com', 'credentials-id') {
// 构建镜像
def customImage = docker.build("my-image:${env.BUILD_ID}")
// 上传镜像
/* Push the container to the custom Registry */
customImage.push()
}
}官方文档地址:
https://www.jenkins.io/zh/doc/book/pipeline/docker/ https://www.jenkins.io/zh/doc/book/pipeline/syntax/
