Jenkins Pipeline插件是否支持Do​​cker Compose?

时间:2016-05-13 16:07:03

标签: jenkins docker jenkins-pipeline

我正在寻找一种在Jenkins 2.0中运行由多个容器组成的支持Docker的构建的方法。

是否有计划在 Pipeline 中为 Docker Compose 提供原生支持,或通过CloudBees docker插件为管道提供支持。

或者可以/必须通过显式调用sh docker-compose...解决这个问题吗?甚至可以在try... finally内使用它们 进一步控制服务生命周期。

编辑:第一个答案是建议一种在jenkins中构建docker容器的方法。这不是这里所需要的。我(EngineerDollery)希望使用compose在jenkins中启动我的目标平台,以便我可以将我的应用程序部署到它并运行端到端测试。

4 个答案:

答案 0 :(得分:12)

Jenkins bug tracking中搜索后,使用JENKINS-35025在Docker容器中运行作业时,会考虑maven build建议docker-compose.yml

另请参阅Creating CI pipeline with Jenkins,它假设您的Jenkins服务器上安装了docker-compose。

注意:一年后(2017年8月),docker-compose is still not supported in the Docker Pipeline plugin

2018年7月,Ivan Aracki注意in the comments

  

使用与主机版本相同的版本手动安装docker-clidocker-compose是现在的解决方案......

答案 1 :(得分:2)

以下是运行在其中运行docker的jenkins容器的文件:

docker run \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  getintodevops/jenkins-withdocker:lts

参考:https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

答案 2 :(得分:0)

我遇到了类似的问题,我发现了https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html,但我不知道与此有什么关系。

我的问题是在开发时测试,并且还在Jenkins中自动化测试,我使用docker-compose来调出一些php脚本和一个mysql服务器,运行隔离测试(截至目前的phpunit)。

我认为我可以通过

实现这一目标
  1. 在泊坞主机中创建网络(使用docker network create
  2. 创建并运行连接到该网络的mysql docker(使用docker run mysql --network=netname --name=mysqlmachine
  3. 由jenkins运行脚本,指定--network并引用mysqlmachine作为主机。
  4. 但是这意味着我需要设置db数据,清理db数据,并且即使在不需要时也总是留在mysqlmachine上,消耗一些ram资源。我可以在定义管道的Jenkinsfile中用docker start mysqlmachinedocker stop mysqlmachine命令解决最后一个问题。

    但是,再一次,在jenkins运行的docker中执行shell我找不到docker命令

    对我而言,这是一个可行的解决方案,直到我找不到更好的东西

    更新: 我将尝试https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin解决方案,它几乎满足我的需求

    更新08.02: 正如Alexander Zeitler所建议的,使用

    agent {
            docker {
                image 'pdmlab/jenkins-node-docker-agent:6.11.1'
                args '-v /var/run/docker.sock:/var/run/docker.sock'
            }
        }
    
    在Jenkins文件中的

    允许在docker中使用docker-compose命令:docker,这主要是docker附近的docker,如下所示:Docker in Docker - volumes not working: Full of files in 1st level container, empty in 2nd tier

    但我更喜欢使用另一种方法,不需要以特殊方式运行jenkins。

    管道说:

    stage('Test') {
        steps {
            sh './build_docker.sh jenkinstests'
        }
    }
    

    和build_docker.sh确实:

     jenkinstests)
     docker volume create idealodbconn
     docker run -v idealodbconn:/data --name helper busybox true
     docker cp ./dbconn/db249.json helper:/data
     docker rm helper
    
     docker-compose -f services/docker-compose-jenkins.yml up \
     --abort-on-container-exit \
     --exit-code-from idealoifapi
    
     docker-compose -f services/docker-compose-jenkins.yml rm -f
     docker volume rm idealodbconn
     ;;
    

    此处--abort-on-container-exit表示退出,一旦定义到docker-compose-jenkins.yml中的一个容器退出,--exit-code-from idealoifapi表示从idealoifapi图像中取出退出代码。

    就是这样。可能缺少的部分是docker-compose-jenkins.yml使用的卷,它是外部的:true:

    volumes:
        idealodbconn:
            external: true
    

答案 3 :(得分:0)

我按照他们的Nestybox中的描述,docker-compose使用blog post在Jenkins管道中工作。我使用以下Dockerfile构建了自己的Jenkins安装:

FROM nestybox/jenkins-syscont:latest
# Install docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose \ 
&& chmod +x /usr/local/bin/docker-compose

因此,我只是按照blog post中的说明进行操作,并且可以运行如下所示的管道:

pipeline {

   agent any

   stages {
       stage('docker-compose') {
           steps {
              sh "docker-compose build"
              sh "docker-compose up -d"
              ...
           }
       }
   }
   post {
      always {
         sh "docker-compose down || true"
      }
   }   
}