簡體   English   中英

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

[英]How to run a “sidecar” container in Jenkins Blue Ocean?

總的來說,我對 Jenkins 和 CI/CD 相當陌生,但相信我已經搜索了足夠長的時間來得出結論,事情並不像我預期的那樣。

我想在我的網站上做一些前端測試,就像在現實生活中一樣,我想在一個 Docker 容器中測試網站,在另一個容器中測試數據庫。 Jenkins 將此記錄為“sidecar”容器,可以成為管道的一部分。

他們的例子:

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)看起來與示例完全不同:

pipeline {
  agent {
    docker {
      image 'php'
    }

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

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

  }
}

那么我將如何在藍海管道中生成(並拆除)這些“邊車”容器? 目前,如果我想添加與 Docker 相關的步驟,管道編輯器沒有可用選項。 我還能使用docker.image嗎? 我確實安裝了Docker 管道插件

沒有可用的步驟 .

鏈接中 Jenkins 提供的示例實際上是一個功能齊全的管道,但有一個例外。 如果您將管道腳本直接提供到 Jenkins 中,則需要注釋掉checkout scm

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 管道編輯器生成的代碼樣式非常不同。 那是因為腳本是在Scripted Pipeline中編寫的,而 Blue Ocean 已經生成了一個Declarative Pipeline Jenkins 完全支持兩者,並且兩者都使用相同的引擎,但語法差異可能會導致啟動時混淆。

您可以使用上面的腳本化管道示例,但如果您想保留聲明性管道,您可以在script步驟中運行腳本化部分。 在這兩種情況下,您都需要根據需要更改 docker 映像並執行命令。

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失敗,因為centos:7映像中未提供make

半年多后,我終於發現它比我想象的要簡單得多。 可以用 docker-compose 來完成。

您需要確保您的 Jenkins 可以訪問 docker-compose。 因此,如果您將 Jenkins 作為 docker 容器運行,請確保它可以訪問 Docker 套接字。 此外,Jenkins 不太可能隨附 docker-compose ( JENKINS-51898 ),因此您必須構建自己的藍海映像才能安裝 docker-compose。

而不是復制下面的文件,檢查https://docs.docker.com/compose/install/以獲得最新版本!

# 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 開頭的容器內執行命令來安裝依賴項並啟動測試。

Note that docker-compose -f docker-compose.test.yml exec -T php composer-install the composer-install command in the container that was defined as the php service in the docker-compose file.

最后,無論測試結果如何,所有容器和相關卷(-v 標志)都將關閉並刪除。

# 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 <run test script>'
      }
    }
  }
  post {
    always {
      sh 'docker-compose -f docker-compose.test.yml down -v'
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM