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/