Я использую отредактированное 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. Только мавен не знает ... Может быть, я не в курсе какой-то обстановки или чего-то такого. Помогите мне, пожалуйста!