Jenkins CICD Pipeline for Python
文書ディレクトリ 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を持参しており、
まだインストールされていない場合は、次のコマンドを実行してインストールできます.
Pythonツールのインストールと依存
一般的にUbuntu 18.04はPython 3.6.8を持参している.
次のコマンドを実行してPythonツールと依存をインストールします.
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を実行します.
options
stages
stage - Initialize
構築前に対応するワークスペースを空にします.
stage - Checkout
GitLabからコードを引く:
stage - Prepare Build Env
Pythonの構築環境を準備します. Pythonバージョン を確認 venvの作成(Jenkins NodeサーバのグローバルなPython環境を汚染しないように、後のCICDステップがこの独立したvenvで行われるように) venv をアクティブにするインストールCI/CDの依存(ユニットテスト、テストオーバーライド率チェック、コード品質チェックなど) インストール項目の依存
説明: pip 3のデフォルトキャッシュディレクトリは である. Install “wheel” firstly to fix “error: invalid command ‘bdist_wheel’” error when install requirements
stage - Unit Test
ユニットテストとコードテストのオーバーライド率チェックをvenvで実行します.
説明:の上の コードテストカバー率レポート をアーカイブおよび表示するには、Jenkins Coberturaプラグインをインストールする必要があります.
stage - Code Quality Check
venvでコード品質チェックを実行します.
説明: pylinは、Commentレベルの警告を無視するなど、いくつかの警告レベルを無視することができ、 を指定することができます.
stage - Packaging
venvでアプリケーションパッケージを作成するには:
説明: pyinstallerは、アプリケーションのエントリスクリプト(entrypoint script)をパッケージ化し、ディレクトリを生成することができる. を指定することもできる. pyinstallerを使用してPythonアプリケーションをパッケージ化することで、Pythonアプリケーションの配布と導入がより簡単になり、関連する依存 を別途インストールする必要がなくなります. pyinstallerの制限のため、アプリケーションが配備するマシンはpyinstallerパッケージを実行するマシンと一致しなければならない.例えば、アプリケーションが配備するサーバはUbuntuであり、パッケージに対応するJenkins NodeもUbuntu であることが望ましい.
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で構成します.
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の構築環境を準備します.
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」というエラーが発生する可能性があります.~/.cache/pip
、~はJenkins NodeのHomeディレクトリ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
)をクリアします.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: ''
}
}
}
説明:
-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}
"""
}
}
説明:
--exit-zero
のパラメータによってアプリケーションバイナリパケットを生成する、--onefile
によってアプリケーションバイナリパケットの名前