![](/img/trans.png)
[英]How to run sidecar container in jenkins pipeline running inside kubernetes
[英]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'
}
}
}
}
}
}
}
}
請注意:
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.