gpt4 book ai didi

docker - 使用 Jenkins 声明性管道为 dockerfile 代理设置构建参数

转载 作者:IT老高 更新时间:2023-10-28 12:43:47 29 4
gpt4 key购买 nike

我正在使用声明性管道语法在 docker 容器内执行一些 CI 工作。

我注意到 Jenkins 的 Docker 插件使用主机中 jenkins 用户的用户 id 和组 id 运行容器(即,如果 jenkins 用户的用户 id 为 100 和组 id 为 111,它将运行管道创建带有命令 docker run -u 100:111 ...) 的容器。

我遇到了一些问题,因为容器将与不存在的用户一起运行(特别是我遇到了一些用户没有主目录的问题)。所以我想创建一个 Dockerfile,它将接收用户 ID 和组 ID 作为构建参数,并在容器内创建一个适当的 jenkins 用户。 Dockerfile 如下所示:

FROM ubuntu:trusty
ARG user_id
ARG group_id

# Add jenkins user
RUN groupadd -g ${group_id} jenkins
RUN useradd jenkins -u ${user_id} -g jenkins --shell /bin/bash --create-home
USER jenkins

...

dockerfile 代理有一个 additionalBuildArgs 属性,所以我可以读取主机中 jenkins 用户的用户 ID 和组 ID,并将它们作为构建参数发送,但我现在遇到的问题是在指定代理之前,似乎无法在声明性管道中执行这些命令。我希望我的 Jenkinsfile 是这样的:

// THIS WON'T WORK
def user_id = sh(returnStdout: true, script: 'id -u').trim()
def group_id = sh(returnStdout: true, script: 'id -g').trim()

pipeline {
agent {
dockerfile {
additionalBuildArgs "--build-arg user_id=${user_id} --build-arg group_id=${group_id}"
}
}
stages {
stage('Foo') {
steps {
...
}
}
stage('Bar') {
steps {
...
}
}
stage('Baz') {
steps {
..
}
}
...
}
}

我有什么方法可以做到这一点?我也尝试将管道指令包装在节点内,但管道需要位于文件的根目录。

最佳答案

我验证了尝试在没有节点的情况下分配 user_id 和 group_id 是行不通的,正如您所发现的,但这对我分配这些值并稍后访问它们很有用:

def user_id
def group_id
node {
user_id = sh(returnStdout: true, script: 'id -u').trim()
group_id = sh(returnStdout: true, script: 'id -g').trim()
}

pipeline {
agent { label 'docker' }
stages {
stage('commit_stage') {
steps {
echo 'user_id'
echo user_id
echo 'group_id'
echo group_id
}
}
}
}

希望这些也适用于您的 additionalBuildArgs 语句。

在评论中,您指出了在使用它来配置 dockerfile 之前在声明性管道之外计算 user_id 和 group_id 的方法最有可能存在严重缺陷:它发现 user_id 的从站不一定与它用来启动基于 docker 的构建的从属设备相匹配。在保持声明性 Jenkinsfile 约束的同时,我没有任何办法解决这个问题。

您可以通过使用全局代理声明来保证所有阶段都有一个从站:Jenkins declarative pipeline: What workspace is associated with a stage when the agent is set only for the pipeline?

但是具有相同标签的多个节点引用并不能保证相同的工作空间:Jenkins declarative pipeline: What workspace is associated with a stage when the agent is set only for the pipeline?

关于docker - 使用 Jenkins 声明性管道为 dockerfile 代理设置构建参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44805076/

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