Docker maven映像正在创建root拥有的目标文件夹,Jenkins无法将其从其工作空间中删除

时间:2018-11-16 16:40:52

标签: java maven docker jenkins jenkins-pipeline

我正在使用经过编辑的docker-maven图像通过Jenkins管道脚本来编译Java Maven项目。我将jenkins工作区安装为docker的卷。在管道中运行的首批常规脚本之一清理了整个工作区。

但是,包含所有内容(.war文件,surefire报告等)的目标文件夹是作为root:root权限创建的。所有文件也都由root拥有,因此管道无法在下一次运行中失败,因为它无法清理工作空间(权限被拒绝)。

我对此问题进行了很多调查,发现了两种解决方法:

  • official maven documentation-使用settings.xml并指定: filePermissions 到777和 directoryPermissions 到777。我认为这是肮脏的修复程序,不应应用...
  • 将Jenkins添加到sudoers并在工作区上使用sudo rm -rf +调用脚本-但是由于我们使用了许多从属计算机,因此我必须在许多计算机上执行此操作,并且我相信还有更好的方法。

这是我用于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特权创建输出。只有行家不会...也许我不知道某些设置或某些内容。请帮帮我!

1 个答案:

答案 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" +
            …