声明式 Jenkins 管道:是否可以使用 SSH 凭据构建 Dockerfile?
Declarative Jenkins pipeline: is it possible to build Dockerfile with SSH credentials?
我正在尝试设置以下 Jenkins 管道:
- 从 SCM 签出的管道
- 构建在 Docker 容器内运行
- Docker 图像是从 Docker 文件构建的
- Docker 图片需要 SSH 访问,因此使用
--ssh
flag
有ssh-agent插件,但是只有在构建容器后才能使用,也就是说docker层缓存不能使用.我也可以使用脚本化管道,但它会强制我的整个管道编写脚本。
我还尝试在 docker 中使用 --secret
标志传递凭据文件,但我找不到在 additionalBuildArgs
中使用凭据的方法:如果我调用 credentials()
,我只是得到一个未转换的管道对象。如果这有效,它实际上可能是一个解决方案:
agent {
dockerfile {
additionalBuildArgs('--secret id=secret,src=' + credentials('credential'))
}
}
我还考虑过将代理定义移出声明性管道对象之外,但后来在 pipeline
中找不到使用该代理的方法。
有没有办法使它与声明性管道一起工作,或者至少保持大部分声明性?
在发布此答案时,无法使用声明性管道来完成。声明式代理声明的转换和执行不够灵活,无法让这种事情发生。然而,可能的是创建一个管道库函数来在 sshagent
块中调用 docker.build
。当然,这不会像使用声明代理那样干净。
可以在此处查看 Docker 集成的源代码:
我正在尝试设置以下 Jenkins 管道:
- 从 SCM 签出的管道
- 构建在 Docker 容器内运行
- Docker 图像是从 Docker 文件构建的
- Docker 图片需要 SSH 访问,因此使用
--ssh
flag
有ssh-agent插件,但是只有在构建容器后才能使用,也就是说docker层缓存不能使用.我也可以使用脚本化管道,但它会强制我的整个管道编写脚本。
我还尝试在 docker 中使用 --secret
标志传递凭据文件,但我找不到在 additionalBuildArgs
中使用凭据的方法:如果我调用 credentials()
,我只是得到一个未转换的管道对象。如果这有效,它实际上可能是一个解决方案:
agent {
dockerfile {
additionalBuildArgs('--secret id=secret,src=' + credentials('credential'))
}
}
我还考虑过将代理定义移出声明性管道对象之外,但后来在 pipeline
中找不到使用该代理的方法。
有没有办法使它与声明性管道一起工作,或者至少保持大部分声明性?
在发布此答案时,无法使用声明性管道来完成。声明式代理声明的转换和执行不够灵活,无法让这种事情发生。然而,可能的是创建一个管道库函数来在 sshagent
块中调用 docker.build
。当然,这不会像使用声明代理那样干净。
可以在此处查看 Docker 集成的源代码: