tencent cloud

文档反馈

在持续集成中使用 Docker

最后更新时间:2023-12-29 11:44:51
    本文为您介绍如何在持续集成中使用 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') {
    
    // 将会从从主机名 registry.example.com 拉取 my-custom-image
    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 {
    // 需要检出代码后,才可以使用代码仓库内的 Dockerfile
    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 {
    // 默认将使用根路径的 Dockerfile 进行构建
    docker.build('my-docker-image:1.0.0')
    }
    }
    }
    }
    }
    如需为构建指定额外的参数,例如使用指定目录的 Dockerfile,以下是相应的 Jenkinsfile 参考。
    pipeline {
    agent any
    stages {
    // 需要检出代码后,才可以使用代码仓库内的 Dockerfile
    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 {
    // 将使用 ./dockerfiles/Dockerfile.build 进行构建
    docker.build('my-docker-image:1.0.0', '-f Dockerfile.build ./dockerfiles')
    }
    }
    }
    }
    }

    将 Docker 镜像推送到指定的 Registry

    以下是相应的 Jenkinsfile 参考。
    pipeline {
    agent any
    stages {
    // 需要检出代码后,才可以使用代码仓库内的 Dockerfile
    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 ->
    // 注意:这里 callback 的运行环境并不是上面运行的 mysql:5 环境内,而是运行 docker 的宿主机环境
    
    // 运行第二个 mysql 作为执行环境
    
    docker.image('mysql:5').inside("--link ${c.id}:db") {
    // 这里执行的命令都是在第二个运行的 mysql docker 容器内
    // 等待 mysql 服务等待
    sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
    }
    
    // callback 内容运行完毕后,mysql docker 容器将会自动 stop 和 rm 掉
    }
    }
    }
    }
    }
    }

    同时运行多个容器作为测试的依赖服务

    有时候您可能不止需要一个额外的服务作为测试依赖,可以使用嵌套的方式来运行多个服务。
    pipeline {
    agent any
    stages {
    stage('Test') {
    steps {
    script {
    docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c1 ->
    // 注意:这里 callback 的运行环境并不是上面运行的 mysql:5 环境内,而是运行 docker 的宿主机环境
    
    docker.image('redis').withRun('') { c2 ->
    // 注意:这里 callback 的运行环境并不是上面运行的 redis 环境内,而是运行 docker 的宿主机环境
    sh 'docker ps'
    }
    }
    }
    }
    }
    }
    }

    参考文档

    如您还想进一步了解 Jenkins 当中使用 Docker 的配置方式,可以参考 Jenkins 官方文档:
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持