我正在使用经过编辑的docker-maven图像通过Jenkins管道脚本来编译Java Maven项目。我将jenkins工作区安装为docker的卷。在管道中运行的首批常规脚本之一清理了整个工作区。
但是,包含所有内容(.war文件,surefire报告等)的目标文件夹是作为root:root权限创建的。所有文件也都由root拥有,因此管道无法在下一次运行中失败,因为它无法清理工作空间(权限被拒绝)。
我对此问题进行了很多调查,发现了两种解决方法:
这是我用于maven映像的Dockerfile的样子:
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"
}
}
有没有办法在docker映像中以jenkins的形式运行maven?还是让此docker映像创建的文件为jenkins:jenkins?运行ANT目标的所有其他映像均使用jenkins:jenkins特权创建输出。只有行家不会...也许我不知道某些设置或某些内容。请帮帮我!
答案 0 :(得分:2)
通过--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" +
…