Jenkins CICD Pipeline for Python

7915 ワード

文書ディレクトリ
  • Jenkins CICD Pipeline for Python
  • Jenkins Node server
  • の構成
  • 取付Git
  • Pythonツールのインストールと依存
  • 構成Jenkins Node
  • Jenkins CICD Pipeline for Python
  • agent
  • options
  • stages
  • stage - Initialize
  • stage - Checkout
  • stage - Prepare Build Env
  • stage - Unit Test
  • stage - Code Quality Check
  • stage - Packaging

  • Jenkins CICD Pipeline for Python
    ここでは、Jenkins NodeとしてUbuntu 18.04およびPython 3.6.8を用いてPythonプロジェクトに対してCICD Pipelineを作成することについて説明する.
    Jenkins Node serverの構成
    インストールGit
    一般にUbuntu 18.04はGitを持参しており、git --versionを実行してGitがインストールされているかどうかを確認することができる.
    まだインストールされていない場合は、次のコマンドを実行してインストールできます.
    sudo apt-get update
    sudo apt-get install git -y
    

    Pythonツールのインストールと依存
    一般的にUbuntu 18.04はPython 3.6.8を持参している.
    次のコマンドを実行してPythonツールと依存をインストールします.
    sudo apt-get update
    sudo apt-get install python3-pip python3-venv python3-dev gcc libmysqlclient-dev -y
    
    python3 --version
    pip3 --version
    

    Jenkins Nodeの構成
    以下の記事を参照してJenkins NodeをSSHで構成します.
  • https://blog.csdn.net/nklinsirui/article/details/96485501

  • Jenkins CICD Pipeline for Python
    Pipeline用のツールのリストは次のとおりです.
    ぶんかつ
    ツール
    バージョン管理ツール
    GitLab + Git
    りゅうすいせん
    Jenkins Pipeline
    依存管理
    pip3 + venv + requirements.txt
    ユニットテスト
    nosetests
    テストオーバーライド率チェック
    Coverage+Jenkins Coberturaプラグイン
    コード質量分析
    pylin+Jenkins Warningsプラグイン
    パッケージの適用
    pyinstaller
    agent
    指定されたlabelのJenkins NodeでPipelineを実行します.
    agent {label 'ubuntu-python3'}
    

    options
    options {
    	// Keep max num of recent builds
    	buildDiscarder(logRotator(numToKeepStr: "15"))
    	// Add timestamps on console output
    	timestamps()
        // Set GitLab connection
    	gitLabConnection('GitlabAccess')
        // Disable concurrent builds
    	disableConcurrentBuilds()
    }
    

    stages
    stage - Initialize
    構築前に対応するワークスペースを空にします.
    stage('Initialize') {
        steps {
    	    sh "env"
    		sh "pwd && ls -ltra"
    		cleanWs()
    		sh "pwd && ls -ltra"
        }
    }
    

    stage - Checkout
    GitLabからコードを引く:
    stage('Checkout') {
        steps {
            git branch: "${GIT_REPO_BRANCH}", credentialsId: "${GIT_CREDENTIALS_ID}", url: "${GIT_REPO_URL}"
        }
    }
    

    stage - Prepare Build Env
    Pythonの構築環境を準備します.
  • Pythonバージョン
  • を確認
  • venvの作成(Jenkins NodeサーバのグローバルなPython環境を汚染しないように、後のCICDステップがこの独立したvenvで行われるように)
  • venv
  • をアクティブにする
  • インストールCI/CDの依存(ユニットテスト、テストオーバーライド率チェック、コード品質チェックなど)
  • インストール項目の依存
  • stage('Prepare Build Env') {
    	steps {
    		sh """
    			python3 --version
    			python3 -m venv .venv
    			. .venv/bin/activate
    			pip3 install wheel
    			pip3 install nose
    			pip3 install coverage
    			pip3 install pylint
    			pip3 install -r requirements.txt
    			pip3 list
    		"""
    	}
    }
    

    説明:
  • . .venv/bin/activate source .venv/bin/activateと書く場合、Manage Jenkins->Configure System->Shell->Shell executableを開く必要があります.この値を/bin/bashに設定しますが、Jenkinsの設定を変更することは推奨されません.Linux以外のJenkins Nodeでは、「script.sh:not found」というエラーが発生する可能性があります.
  • pip 3のデフォルトキャッシュディレクトリは~/.cache/pip、~はJenkins NodeのHomeディレクトリ
  • である.
  • Install “wheel” firstly to fix “error: invalid command ‘bdist_wheel’” error when install requirements

  • stage - Unit Test
    ユニットテストとコードテストのオーバーライド率チェックをvenvで実行します.
    stage('Unit Test') {
        steps {
    	    echo "Run unit test and coverage check"
    		sh """
    			. .venv/bin/activate
    			nosetests -v --with-xunit --xunit-file=${UNIT_TEST_REPORT} --with-coverage --cover-xml --cover-xml-file="${COVERAGE_REPORT}" --cover-package=${COVER_PACKAGE} --cover-erase
    		"""
    	}
    	post { 
            always { 
                echo "Archive test results"
                junit allowEmptyResults: true, testResults: "${UNIT_TEST_REPORT}"
    			
    			// Requires Cobertura plugin to archive and display converage report
    			// https://wiki.jenkins.io/display/JENKINS/Cobertura+Plugin
    			echo "Archive coverage report"
    			cobertura autoUpdateHealth: false, autoUpdateStability: false, coberturaReportFile: "${COVERAGE_REPORT}", failNoReports: false, failUnhealthy: false, failUnstable: false, maxNumberOfBuilds: 0, onlyStable: false, zoomCoverageChart: false
            }
        }
    }
    

    説明:
  • の上のnosetestsはverboseモードで動作し(-v)、xunit形式のユニットテストレポート(--with-unit)、ユニットテストレポート生成の位置(--xunit-file)を指定することができる.coverageプラグイン(--with-coverage)を呼び出してxml形式のコードテストオーバーライド率レポート(--cover-xml)を生成し、コードテストオーバーライド率レポートが生成された位置(--cover-xml-file)を指定し、どのコードディレクトリに対してテストオーバーライド率チェックを行うかを指定することができる(--cover-package).前回のコードテストオーバーライド率レポート(--cover-erase)をクリアします.
  • コードテストカバー率レポート
  • をアーカイブおよび表示するには、Jenkins Coberturaプラグインをインストールする必要があります.
    stage - Code Quality Check
    venvでコード品質チェックを実行します.
    stage('Code Quality Check') {
        steps {
    	    echo "Run pylint code style check"
    		// Ignore pylint comments via "-d C"
    		sh """
    			. .venv/bin/activate
    			pylint -d C -f parseable ${SOURCE_ROOT} --exit-zero | tee ${PYLINT_REPORT}
    		"""
    	}
    	post { 
            always { 
                // Requires Warnings plugin since Violations plugin is deprecated
    			// http://wiki.jenkins-ci.org/x/G4CGAQ
    			warnings canComputeNew: false, canResolveRelativePaths: false, canRunOnFailed: true, categoriesPattern: '', defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'PyLint', pattern: "${PYLINT_REPORT}"]], unHealthy: ''
            }
        }
    }
    

    説明:
  • pylinは、Commentレベルの警告を無視するなど、いくつかの警告レベルを無視することができ、-d Cパラメータを使用してpylinが常に成功コード0を返すことができ、生成されたレポートファイル
  • を指定することができます.
    stage - Packaging
    venvでアプリケーションパッケージを作成するには:
    stage('Packaging') {
    	steps {
    	    echo "Run packaging Python program"
    		// Requires to run pyinstaller in each kind of machine
    		
    		script {
    			PACKAGE_NAME = "${PACKAGE_ID}"
    			if ("${params.PACKAGE_VERSION}" != "") {
    				PACKAGE_NAME = "${PACKAGE_NAME}-${params.PACKAGE_VERSION}"
    			}
    			PACKAGE_PATH = "./dist/${PACKAGE_NAME}"
    		}
    
    		sh """
    		    . .venv/bin/activate
    			pip3 install pyinstaller
    			pyinstaller ${ENTRYPOINT_SCRIPT} --onefile --name ${PACKAGE_NAME}
    			pwd && ls -ltra
    			echo "Package: ${PACKAGE_PATH}"
    			du -sh ${PACKAGE_PATH}
    			sha256sum ${PACKAGE_PATH}
    		"""
    	}
    }
    

    説明:
  • pyinstallerは、アプリケーションのエントリスクリプト(entrypoint script)をパッケージ化し、ディレクトリを生成することができる.--exit-zeroのパラメータによってアプリケーションバイナリパケットを生成する、--onefileによってアプリケーションバイナリパケットの名前
  • を指定することもできる.
  • pyinstallerを使用してPythonアプリケーションをパッケージ化することで、Pythonアプリケーションの配布と導入がより簡単になり、関連する依存
  • を別途インストールする必要がなくなります.
  • pyinstallerの制限のため、アプリケーションが配備するマシンはpyinstallerパッケージを実行するマシンと一致しなければならない.例えば、アプリケーションが配備するサーバはUbuntuであり、パッケージに対応するJenkins NodeもUbuntu
  • であることが望ましい.