我正在做跨平台测试(工具,而不是内核),所以我为每个操作系统都有一个自定义映像(用于临时 Jenkins 从属),基于标准基础映像:centos6、centos7、ubuntu14、sles11、sles12 等。
除了基础不同之外,我的图像彼此之间有很多共同点(为了速度,它们都获得了预先构建且经常更改的 maven/gradle/npm 存储库的副本)。
这是创建图像方式的简化示例(图像中的 tarball 相同):
# Dockerfile one
FROM centos:centos6
ADD some-files.tar.gz
# Dockerfile two
FROM ubuntu:14.04
ADD some-files.tar.gz
Run Code Online (Sandbox Code Playgroud)
这导致必须定期重建大图像(多 GB)。由于 docker 构建缓存,一些层重用发生在重建之间,但如果我可以完全停止重建图像,那就更好了。
如何在我的图像之间可靠地共享公共内容?
在这些目录之外,图像不会发生太大变化。这不能是一个简单的挂载卷,因为在使用中这一层中的目录被修改,所以它不能是只读的,并且源不能被更改(所以我正在寻找更接近 COW 但应用于特定图像的子集)
根据Jenkins Pipeline Docs的介绍,在使用Docker时,我应该能够使用管道步骤。但是,“ archiveArtifacts ”似乎不起作用:
def container = docker.image("some_image")
container.inside {
sh 'date > /tmp/test.txt'
sh 'cat /tmp/test.txt' //works, shows file
def fileContents = readFile '/tmp/test.txt' //works
echo "Contents: ${fileContents}" //works, shows file
archiveArtifacts '/tmp/*.txt' //FAILS
}
Run Code Online (Sandbox Code Playgroud)
“ 错误:找不到与文件模式“ /tmp/*.txt”匹配的工件。配置错误?”。
我尝试过的事情:
关于归档Docker容器中生成的文件有什么建议吗?
PS:我打开了一个错误报告 ...看来archiveArtifacts仅适用于Docker容器中$ WORKSPACE中的文件。
似乎provided可以很好地理解包含与范围的直接依赖关系。似乎runtime也很容易实现包含具有作用域的传递依赖项。
但是我如何才能包含两个间接级别的依赖项?
例子:
A --> B --> C
Run Code Online (Sandbox Code Playgroud)
其中 A 依赖于 B(编译范围),B 依赖于 C(提供的范围)。
我想A检索C(例如:在本地下载 jar),无论是通过程序集描述符还是maven-dependency-plugin:copy-dependencies其他机制。
我已经尝试了上述两个插件的所有选项组合。这两种方法都没有涵盖这种情况。它们都获得B(即使B更改为提供的依赖项),以及任何编译范围的依赖项B,但未提供 B 的依赖项。
我想我正在尝试做一些类似于我的项目的阴影表示但没有解包依赖项的事情。
当然,我不想在 A 的 pom 中枚举 B 的所有依赖项 - 我想隐式和递归地检索(然后打包)所有依赖项。
我正在尝试将利用Jenkins Job DSL插件的代码分解为可重用的部分,并且我怀疑我的问题是Groovy的通用问题,而不是Jenkins特定的问题。例如,我想重用此块的某些部分:
freeStyleJob() {
//generic stuff
name "something"
description "something else"
//custom stuff
scm {
svn {
//etc....
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过将名称和描述放在实用程序方法中(显然,我不仅想在现实生活中做更多的事情)。但是,我找不到合适的语法来创建当前作用域的闭包。这是我认为的样子:
def jobCommonItems() {
return {
//generic stuff
name "something"
description "something else"
}
}
freeStyleJob() {
jobCommonItems().call()
//custom stuff
scm {
svn {
//etc....
}
}
}
Run Code Online (Sandbox Code Playgroud)
(也许有一个closure.delegate =这个在某处)
但是,这不适用于闭包。它适用于方法,如下所示:https : //dzone.com/articles/groovy-closures-owner-delegate
为了说明这一点,下面的测试显示了三种可能的语法组合:
String myString = "Top Level: string"
def myMethod() {
println "Top Level: Method"
}
def myClosure = { println "Top Level: Class"}
class …Run Code Online (Sandbox Code Playgroud)