本文为您介绍如何在持续集成中使用 Docker。
前提条件
设置 CODING 持续集成中构建环境前,您的腾讯云账号需要开通 CODING DevOps 服务。
进入项目
1. 登录 CODING 控制台,单击团队域名进入 CODING 使用页面。
2. 单击页面右上角的 ,进入项目列表页面,单击项目图标进入目标项目。 3. 进入左侧菜单栏的持续集成功能。
背景介绍
在持续集成当中,除了使用 Docker 作为持续集成的构建环境外,您可能经常需要以 Docker 的形式运行额外的服务作为测试依赖,或在持续集成过程中构建 Docker 镜像,并推送到相关的制品库。
运行指定 Docker 镜像并在其中执行命令
在构建过程中,您可能会需要使用到公有的 Docker 镜像仓库。以下是关于如何拉取指定的 Docker 镜像执行命令的 Jenkinsfile 参考。
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.image("ubuntu").inside('-e MY_ENV=123') {
sh 'echo ${MY_ENV}'
}
}
}
}
}
}
运行指定 Registry 的 Docker 镜像
在构建过程中,您可能会需要使用到私有的 Docker 镜像仓库,例如希望使用 CODING 制品库中已上传的 Docker 镜像仓库。以下是相应的 Jenkinsfile 参考。
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.withRegistry('https://registry.example.com') {
docker.image('my-custom-image').inside {
sh 'make test'
}
}
}
}
}
}
}
若所配置的 registry 对拉取操作带有鉴权,需要您提供有效的凭证 ID,以下是相应的 Jenkinsfile 参考。
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.withRegistry('https://registry.example.com', 'my-credentials-id') {
}
}
}
}
}
}
在持续集成过程中构建 Docker 镜像
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('Build') {
steps {
script {
docker.build('my-docker-image:1.0.0')
}
}
}
}
}
如需为构建指定额外的参数,例如使用指定目录的 Dockerfile,以下是相应的 Jenkinsfile 参考。
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('Build') {
steps {
script {
docker.build('my-docker-image:1.0.0', '-f Dockerfile.build ./dockerfiles')
}
}
}
}
}
将 Docker 镜像推送到指定的 Registry
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
])
}
}
stage('Build') {
steps {
script {
docker.build('my-docker-image:1.0.0')
docker.withRegistry('https://registry.example.com', 'my-credentials-id') {
docker.image('my-docker-image:1.0.0').push()
}
}
}
}
}
}
使用 Docker 运行额外的服务作为测试依赖
在测试过程当中,您可以使用 Docker 来运行如 MySQL 等可被用作测试依赖的服务。下述示例使用了两个容器,一个作为 MySQL 的服务,另一个提供执行环境 (使用 docker link 连接两个容器)。
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
docker.image('mysql:5').inside("--link ${c.id}:db") {
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
}
}
}
}
}
}
}
同时运行多个容器作为测试的依赖服务
有时候您可能不止需要一个额外的服务作为测试依赖,可以使用嵌套的方式来运行多个服务。
pipeline {
agent any
stages {
stage('Test') {
steps {
script {
docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c1 ->
docker.image('redis').withRun('') { c2 ->
sh 'docker ps'
}
}
}
}
}
}
}
参考文档
如您还想进一步了解 Jenkins 当中使用 Docker 的配置方式,可以参考 Jenkins 官方文档:
本页内容是否解决了您的问题?