如何在Jenkins的Docker容器中运行构建


18

我正在尝试使用Jenkins在Docker容器中构建C ++项目。我在Jenkins或在Jenkins之外的容器中构建都没有问题。

下面是我尝试过的。为了清楚起见,我省略了卷映射。

情况1

以下命令在外壳中成功运行了构建。

docker run --rm --interactive=true --tty=true $IMAGE make

但是,当在Jenkins中作为“执行外壳程序”步骤运行时,Docker返回以下错误。

cannot enable tty mode on non tty input

情况二

以下命令与上一个命令相似,但是禁用了交互性。

docker run --rm $IMAGE make

Jenkins可以成功运行构建。但是,中止构建时存在严重问题。该构建立即被标记为已中止,但是容器一直运行直到构建完成。退出后,也不会移除容器。

在shell中运行时,命令会成功构建,但是无法中断它。退出后,容器也将被取出。

有谁知道如何在Jenkins的Docker容器中干净地运行构建并保留中止构建的功能吗?

不能选择使用任何Jenkins插件,因为Docker调用位于脚本内并且无法轻松提取。


1
也许要进行一项后期工作,任务是删除容器?对于中止构建的情况,也许您可​​以有一个特殊的构建来停止并删除所有虚假容器?这是次优的,但至少,这是一种易于设置的解决方法。:-)
lgeorget '16

1
这与我对clean的定义不太匹配:)但是我很欣赏这个建议,这当然是有效的解决方法。
marcv81 '02

Answers:


3

在Jenkins中运行Docker构建的最简单方法是使用管道作业。它有很多内置插件可以控制您的Docker环境和容器。

一些例子是

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

有关更多信息:https : //www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

您可以实现以下工作流程:

  1. 创建一个Docker容器并指定一个名称,以便您可以轻松地引用它(例如,在脚本中)
  2. 启动它,并使用某些东西作为保持容器运行的入口点
  3. 使用docker exec container cmd ...发布您的构建和测试命令
  4. 停止容器
  5. 移除图片

docker exec ...是像一个远程外壳访问网络机器。默认情况下,它不是交互式的,也不分配tty。这对于编译和执行测试套件应该很好。该命令正确转发容器内部执行的命令的退出状态。

然后可以通过以下方式中止构建作业:

  • docker stop container (发送TERM和KILL,然后在两者之间等待),或
  • docker kill container, 甚至
  • docker exec container pkill someexecutable

具体命令的工作流程:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

对于使用该工作流一个真实的例子,你可以看看这个.travis.yml文件,实际CI脚本,该容器内运行脚本泊坞窗文件中使用的图像。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.