如何在jenkins管道中的docker容器中运行python脚本

时间:2019-02-20 23:17:51

标签: python docker jenkins jenkins-pipeline

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

我在VM上运行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>

这就是我当前的jenkins管道脚本的样子。

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

1 个答案:

答案 0 :(得分:0)

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

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

以下是我的jenkins作业控制台输出:

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, 因此,您可以通过管道步骤将代码克隆到jenkins作业工作区中,而无需进行cd <your code folder in container>