Образ Macker Docker создает целевую папку, принадлежащую пользователю root, и Jenkins не может удалить ее из своего рабочего пространства - PullRequest
0 голосов
/ 16 ноября 2018

Я использую отредактированное docker-maven изображение для компиляции проектов Java Java, используя сценарий конвейера Jenkins. Я монтирую рабочую область jenkins как том для докера. Один из первых скриптов Groovy, которые запускаются внутри конвейера, очищает всю рабочую область.

Однако целевая папка со всем содержимым (.war-файл, отчеты о достоверности и т. Д.) Создается как root: root-права. Все файлы также принадлежат пользователю root, и поэтому конвейер завершает работу при следующем запуске, так как не может очистить рабочее пространство (разрешение запрещено).

Я много исследовал эту проблему и нашел два обходных пути:

  • Из официальной документации maven - Используйте файл settings.xml и укажите: filePermissions до 777 и directoryPermissions до 777. Я думаю, что это грязное исправление и не должно наноситься ...
  • Добавьте Jenkins в sudoers и вызовите сценарий с sudo rm -rf + в рабочей области - но поскольку мы используем много подчиненных машин, мне придется делать это на многих машинах, и я верю, что есть лучший способ.

Вот так выглядит мой файл Dockerfile для maven:

FROM <our-internal-image>

RUN export http_proxy=$HTTP_PROXY && \
    export https_proxy=$HTTPS_PROXY && \
    zypper -n in tar which java-1_8_0-openjdk java-1_8_0-openjdk-devel && \
    zypper clean && \
    SUSEConnect --cleanup

RUN mkdir -p /usr/share/maven /usr/share/maven/ref && \
    curl -fsSL -o /tmp/apache-maven.tar.gz https://apache.osuosl.org/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz && \
    tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 && \
    rm -f /tmp/apache-maven.tar.gz && \
    ln -s /usr/share/maven/bin/mvn /usr/bin/mvn

ENV JAVA_HOME /usr/lib64/jvm/java-1.8.0-openjdk
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "/root/.m2"

ENTRYPOINT ["/usr/bin/mvn"]

И вот как я вызываю компиляцию нашего модуля на основе maven (docker-maven - это имя образа, созданного на основе Dockerfile):

def _compileMavenModule = {
    stage('Build - compile maven module') {
        sh "docker run " +
                "--name maven-module-${BUILD_ID} " +
                "--rm " +
                "-v ${WORKSPACE}:/build " +
                "-e http_proxy=\"${http_proxy}\" " +
                "-e https_proxy=\"${https_proxy}\" " +
                "-e HTTP_PROXY=\"${http_proxy}\" " +
                "-e HTTPS_PROXY=\"${https_proxy}\" " +
                "-e MAVEN_OPTS=\"-Dhttp.proxyHost=<HTTP_PROXY> -Dhttp.proxyPort=<HTTP_PROXY_PORT>-Dhttps.proxyHost=HTTP_PROXY> -Dhttps.proxyPort=<HTTP_PROXY_PORT>\" " +
                "docker-maven clean package -f /build/path-to-maven-repository/pom.xml"
    }
}

Есть ли способ запустить maven внутри образа докера как jenkins? Или сделать файлы, созданные этим образом док-станции, jenkins: jenkins? Все остальные изображения, на которых выполняются цели ANT, создают выходные данные с привилегиями jenkins: jenkins. Только мавен не знает ... Может быть, я не в курсе какой-то обстановки или чего-то такого. Помогите мне, пожалуйста!

1 Ответ

0 голосов
/ 16 ноября 2018

Pass --user опция в docker run:

sh "docker run " +
            "--name maven-module-${BUILD_ID} " +
            "--user ${env.BUILD_USER_ID}:${env.BUILD_USER_ID}" +
            "--rm " +
            "-v ${WORKSPACE}:/build " +
            "-e http_proxy=\"${http_proxy}\" " +
            "-e https_proxy=\"${https_proxy}\" " +
            "-e HTTP_PROXY=\"${http_proxy}\" " +
            "-e HTTPS_PROXY=\"${https_proxy}\" " +
            "-e MAVEN_OPTS=\"-Dhttp.proxyHost=<HTTP_PROXY> -Dhttp.proxyPort=<HTTP_PROXY_PORT>-Dhttps.proxyHost=HTTP_PROXY> -Dhttps.proxyPort=<HTTP_PROXY_PORT>\" " +
            "docker-maven clean package -f /build/path-to-maven-repository/pom.xml"
}

Это передаст вашего текущего пользователя как пользователя и группу внутри контейнера Docker.

РЕДАКТИРОВАТЬ : Если эти переменные пусты, вы можете попытаться получить значения, используя bash:

user = sh(returnStdout: true, script: 'id -u').trim()
group = sh(returnStdout: true, script: 'id -g').trim()
sh "docker run " +
            "--name maven-module-${BUILD_ID} " +
            "--user $user:$group" +
            …
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...