Jenkins流水线构建python单元测试


jenkins2.0后推出pipeline流水线式构建,支持构建任务脚本化。Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
本文主要旨在使用jenkins 的pipeline功能对python项目进行单元测试。
1、jenkins首页新建任务-》输入任务名称,选择流水线

 2.设置构建触发器:也就是什么时候执行构建

 3.创建流水线代码;这里面有两个选项,一个是Pipeline script,一个是Pipeline script from SCM

 Pipeline script:就是直接在这里写流水线代码,如下图,点击右侧蓝色的帮助按钮,会有相关代码例子

下面是我写的python项目的单元测试的流水线代码:

//Jenkinsfile (Declarative Pipeline)
pipeline{
 agent any    //指定执行job的节点,any为不做限制
    // 定义环境变量
 environment {
MY_PYTHON='/root/anaconda3/envs/drr/bin'
SOURCE_DIR='/var/lib/jenkins/workspace/Screw/python_tests/segmentation_part' } //默认命令运行的pwd为项目workspace stages {
stage('Checkout') {
steps {
echo "checkout"
checkout([$class: 'GitSCM', branches: [[name: '*/develop']], extensions: [], userRemoteConfigs: [[credentialsId: 'HWY', url: 'git@gitee.com:mvisioner/screws.git']]])
}
} stage('Build') { steps{ echo '‘Building’ sh 'sudo ${MY_PYTHON}/python --version'
}
}

        // stage可以添加或减少
        stage('Test') {
steps{
echo 'Testing'
sh '''
sudo /bin/bash -c 'source /root/anaconda3/bin/activate drr'
cd ${
SOURCE_DIR}
sudo
${MY_PYTHON}/python -m pytest --cov --cov-report=html:./${JOB_NAME}_${BUILD_NUMBER} --junit-xml=./${JOB_NAME}_${BUILD_NUMBER}/results.xml --html=./${JOB_NAME}_${BUILD_NUMBER}/results.html --verbose --capture=tee-sys ${SOURCE_DIR}
'''
}
}
        stage('Deploy') {
            steps{
                echo 'This is a deploy step'
            }
        }
}
post {
failure{
script{
emailext attachLog: true,
// 邮件模板这里的引号一定要注意写对(坑)
body: '''${SCRIPT, template="groovy-html.template"}''',
mimeType: 'text/html',
charset:'UTF-8',
// PlatformGroup #10 构建失败
subject: "${currentBuild.fullDisplayName} 构建失败",
//用逗号或空格分隔多个邮箱
to: 'xxx@xx.com xxxx@xxx.com'
}
}
}
}

Pipeline script from SCM:就是将Pipeline script写在一个文本文件(也叫Jenkinsfile)里面,将Jenkinsfile文件放到源代码的控制库,Jenkins构建任务时,拉取该代码仓库到本地,然后读取Jenkinsfile的内容,执行相关的步骤。

注意:在使用pipeline script from SCM方式下载Jenkinsfile时,Jenkins会自动清理掉工作空间,如果不想让Jenkins自动清理掉workspace,在Jenkins任务设置里面指定一个路径去下载Jenkinsfile,而不是让Jenkinsfile直接下载到workspace下面