Я использую декларативный синтаксис конвейера для выполнения некоторой работы CI внутри контейнера докеров.
Я заметил, что плагин Docker для Jenkins запускает контейнер, используя идентификатор пользователя и идентификатор группы пользователя jenkins на хосте (т.е. если пользователь jenkins имеет идентификатор пользователя 100 и идентификатор группы 111, он будет запускать создание конвейера контейнер с командой docker run -u 100:111 ...
).
У меня были некоторые проблемы с этим, так как контейнер будет работать с не существующим пользователем (в частности, я столкнулся с некоторыми проблемами, когда у пользователя отсутствовал домашний каталог). Поэтому я подумал о создании файла Docker, который получит идентификатор пользователя и идентификатор группы в качестве аргументов сборки и создаст правильного пользователя 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 в хосте и отправить их как сборку, но проблема, с которой я сейчас сталкиваюсь, заключается в том, что кажется, что есть никоим образом не выполнять эти команды в декларативном конвейере до указания агента. Я хочу, чтобы мой 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 {
..
}
}
...
}
}
Есть ли способ добиться этого? Я также попытался обернуть директиву конвейера внутри node, но конвейер должен быть в корне файла.