首页 > 解决方案 > 如何在詹金斯管道的docker容器中运行python脚本

问题描述

我在 dockerhub 中有一个 docker 映像,我想在我的 jenkins 管道脚本中添加它作为代理。作为图像的一部分,我执行 git clone 以从 github 获取一个存储库,该存储库具有多个 python 脚本,这些脚本对应于我的 jenkins 管道中的多个阶段。我尝试到处搜索,但找不到有关如何访问 jenkins 管道中 docker 容器内文件的相关信息。

我在虚拟机上运行 jenkins,它安装了 docker。管道在 docker 容器上执行构建。由于管道的每个阶段都涉及许多步骤,因此我尝试尽可能多地使用 python API。

这就是我的 dockerfile 的样子,并且图像构建成功,我可以将它托管在 dockerhub 中。当我运行容器时,我可以看到“jenkins_pipeline_scripts”目录,其中包含管道阶段所需的所有 Python 脚本。

FROM ros:melodic-ros-core-stretch

RUN apt-get update && apt-get -y install python-pip

RUN git clone <private-repo with token>

这就是我当前的詹金斯管道脚本的样子。

pipeline {
    agent {
        docker {
            image '<image name>'
            registryUrl 'https://registry.hub.docker.com'
            registryCredentialsId 'docker-credentials'
            args '--network host -u root:root'
        }
    }

    stages {
        stage('Test') {
            steps {
                sh 'python jenkins_pipeline_scripts/scripts/test.py'   
            }
        }
    }
}

这是我执行作业时遇到的错误。

$ docker top 05587cd75db5c4282b86b2f1ded2c43a0f4eae161d6c7d7c03d065b0d45e1 -eo pid,comm
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ python jenkins_pipeline_scripts/scripts/test.py
python: can't open file 'jenkins_pipeline_scripts/scripts/test.py': [Errno 2] No such file or directory

标签: pythondockerjenkinsjenkins-pipeline

解决方案


当 Jenkins Pipeline 启动代理容器时,它将更改容器的WORKDIRvia-w选项并通过选项挂载 Jenkins 作业的工作区文件夹-v

由于这两个选项,Jenkins 作业的工作区文件夹将成为您容器的WORKDIR.

以下是我的詹金斯作业控制台输出:

docker run -t -d -u 29001:100 
-w /bld/workspace/test/agent-poc 
-v /bld/workspace/test/agent-poc:/bld/workspace/test/agent-poc:rw,z 
-v /bld/workspace/test/agent-poc@tmp:/bld/workspace/test/agent-poc@tmp:rw,z 
-e ******** -e ******** -e ******** -e ******** 
docker.hub.com/busybox cat

您在构建映像时克隆代码并且它们不在 . WORKDIR,因此不会报告此类文件错误。

解决您的问题的两种方法。

1)首先cd你的代码文件夹,你应该知道那个路径。

    stage('Test') {
        steps {
            sh '''
              cd <your code folder in container>
              python jenkins_pipeline_scripts/scripts/test.py
            '''   
        }
    } 

2)将 git clone 代码仓库从 Dockerfile 移到管道阶段

正如我在开始时解释的那样,您的工作工作区将成为容器的工作区WORKDIR,因此您可以通过管道步骤将代码克隆到詹金斯工作工作区,然后您无需cd <your code folder in container>.


推荐阅读