首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Jenkins Blue Ocean中运行“sidecar”容器?

如何在Jenkins Blue Ocean中运行“sidecar”容器?
EN

Stack Overflow用户
提问于 2020-06-03 05:10:43
回答 2查看 1.5K关注 0票数 2

一般来说,我对Jenkins和CI/CD相当陌生,但我相信我已经搜索了足够长的时间,得出的结论并不像我期望的那样。

我想在我的网站上做一些前端测试,就像在现实生活中一样,我想在一个Docker容器中测试网站,在另一个容器中测试数据库。Jenkins将其记录为"sidecar“容器它可以是管道的一部分。

他们的例子:

代码语言:javascript
复制
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.
     */
    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'
    }
}

问题是,我没有‘传统的’Jenkins管道,但我运行的是Jenkins Blue Ocean。这给了我一个奇特的流水线编辑器,但我的流水线代码(Jenkinsfile)看起来与示例非常不同:

代码语言:javascript
复制
pipeline {
  agent {
    docker {
      image 'php'
    }

  }
  stages {
    stage('Build') {
      steps {
        sh 'composer --version'
        sh 'composer install'
      }
    }

    stage('Tests') {
      steps {
        echo 'Do test'
      }
    }

  }
}

那么,我如何在蓝海管道中产生(和拆卸)这些"sidecar“容器呢?目前,如果我想添加一个与Docker相关的步骤,Pipeline编辑器没有可用的选项。我还能继续使用吗docker.image?我确实有Docker管道插件已安装。

..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-25 04:40:37

大半年后,我终于发现这比我想象的要简单得多。可以使用docker-compose来完成。

你需要确保你的Jenkins可以访问docker-compose。因此,如果您将Jenkins作为docker容器运行,请确保它可以访问Docker套接字。此外,Jenkins不太可能附带docker-compose (JENKINS-51898)所以你必须构建你自己的蓝海镜像来安装docker-compose。

不是复制下面的文件,而是检查https://docs.docker.com/compose/install/获取最新版本!

代码语言:javascript
复制
# Dockerfile
FROM jenkinsci/blueocean

USER root

RUN curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && \
    chmod +x /usr/local/bin/docker-compose
    
USER jenkins

一旦Jenkins和Docker启动并运行,您就可以使用常规的docker-compose文件部署应用程序的测试版本,包括您可能需要的所有数据库和其他容器。您可以使用以下命令安装依赖项并启动测试docker-compose exec在以docker-compose开头的容器内执行命令。

请注意 docker-compose -f docker-compose.test.yml exec -T php composer-install

执行composer-install命令,该命令被定义为phpdocker-compose文件中的服务。最后,无论测试结果如何,所有容器和相关卷(-v标志)都将关闭并删除。

代码语言:javascript
复制
# Jenkinsfile
pipeline {
  agent any
  stages {
    stage('Start') {
      steps {
        sh 'docker-compose -f docker-compose.test.yml up -d'
      }
    }
    stage('Composer install') {
      steps {
        sh 'docker-compose -f docker-compose.test.yml exec -T php composer install --no-interaction --no-progress --optimize-autoloader'
      }
    }
    stage('Test') {
      steps {
        sh 'docker-compose -f docker-compose.test.yml exec -T php '
      }
    }
  }
  post {
    always {
      sh 'docker-compose -f docker-compose.test.yml down -v'
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2020-06-05 19:31:47

Jenkins在链接实际上是一个全功能的管道,但有一个例外。你需要注释掉checkout scm如果您将管道脚本直接提供给Jenkins。

代码语言:javascript
复制
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") {
            /* Wait until mysql service is up */
            sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
        }
        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'
        }
    }
}

您可能会感到困惑的是,上面示例中的代码样式与Blue Ocean管道编辑器生成的样式非常不同。这是因为脚本是用

脚本化管道蓝海已经产生了一个声明性管道..。两者在Jenkins中都得到了完全支持,并且都在底层使用相同的引擎,但语法差异可能会在一开始就导致混淆。

您可以使用上面的脚本管道示例就好了,但是如果您想保留声明式管道,您可以在脚本步骤中运行script

部分。在这两种情况下,您都需要根据需要更改docker映像和执行的命令。

代码语言:javascript
复制
pipeline {
    agent any
    stages {
        stage('Build and test') {
            steps {
                script {
                    node {
                        docker.image('mysql:5').withRun('-e "MYSQL_ROOT_PASSWORD=my-secret-pw"') { c ->
                            docker.image('mysql:5').inside("--link ${c.id}:db") {
                                /* Wait until mysql service is up */
                                sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
                            }
                            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'
                            }
                        }
                    }
                }
            }
        }
    }
}

请注意:

  1. 本例中使用的Docker容器链接功能是一个遗留功能,最终可能会被移除。
  2. 管道将在make check,asmake中未提供centos:7图像。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62161475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档