gpt4 book ai didi

docker - 如何在 Jenkins Blue Ocean 中运行 "sidecar"容器?

转载 作者:行者123 更新时间:2023-12-02 18:17:58 25 4
gpt4 key购买 nike

总的来说,我对 Jenkins 和 CI/CD 还比较陌生,但相信我已经搜索了足够长的时间来得出结论,事情并不像我预期的那样。

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

他们的例子:

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'
}
}

}
}

那么我将如何在 Blue Ocean 管道中生成(并拆除)这些“sidecar”容器?如果我想添加与 Docker 相关的步骤,目前管道编辑器没有可用的选项。我还能使用 docker.image 吗?我有 Docker Pipeline plugin安装。

no available steps .

最佳答案

Jenkins 在 link 中提供的示例实际上是一个功能齐全的管道,只有一个异常(exception)。如果您将管道脚本直接提供给 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 - 如何在 Jenkins Blue Ocean 中运行 "sidecar"容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62161475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com