4
0

More than 1 year has passed since last update.

Jenkinsとshellの初心者が1からジョブを作って勉強になったこと - その2(python script)

Last updated at Posted at 2023-04-25

1個目のジョブを作成した後に、元々localで動いているpython scriptをJenkinsで動くように新しいジョブを作成し、且つ1個目のジョブと連動する要望があったため、新しジョブの作成及びパイプラインの作成をしました。その中で勉強になったこととかを記載するようにします。

JenkinsでPythonを使う

pythonプラグインのインストール

Jenkinsでpythonを使うのに、pythonのプラグインをインストールする必要があります。
image.png

すると、Jenkinsジョブの設定にExecute Python scriptの選択肢が出ます。
image.png

ビルド手順を追加して、python scriptを貼り付けば利用できます。

pythonのインストール

今回使ったサーバーは元々pythonが入っている状態でした。
以下のコマンドを実行すればインストールできると思います。
(dockerの環境でしたので、docker含めたコマンドになります。)

docker exec -it --user root [dockerの名前] /bin/bash -c "sudo apt install python3"

python3があっても実行ができなかったトラブルシューティング

ビルド手順に自分の書いたPythonスクリプトを貼り付けたら実行できます。
今はPython3は新しいが、それをインストールしても実行できないこともあります。

Caused: java.io.IOException: Cannot run program "python" (in directory "(省略)"): error=2, No such file or directory

調べてみたら、Python3がインストールされていて、python3 --versionのコマンドは見つかりますが、python --versionのコマンドが見つからないからエラーになったようです。
以下のようにpython-is-python3というパッケージをインストールしたら解決できました。

docker exec -it --user root [dockerの名前] /bin/bash -c "sudo apt install python-is-python3"

Jenkinsのパイプラインを使う

パイプラインの作成

新規ジョブ作成をクリックして、以下のページでパイプラインを作成すればよいのです。

image.png

パイプラインスクリプトの定義

image.png

例えば、一番シンプルなケースで、既に2つのジョブを作成していて
2つのジョブを連続で実行したい場合は以下のように書けば実行できます。
パイプラインのステージ、ステップ及びステップの中のジョブを定義します。

pipeline {
    agent any
    stages {
        stage("ステージ名1") {
            steps {
                build job: "ジョブ名1"
            }
        }
        stage("ステージ名2") {
            steps {
                build job: "ジョブ名2"
            }
        }
    }
}

ジョブ1とジョブ2のところは自分の作ったジョブの名前と一致させる必要があります。

パラメータ付きビルド

ジョブのビルドのパラメータを設定すれば、ジョブ単体にパラメータを渡すことはできますが、ここはパイプラインでパラメータを渡す例を記載します。(parameters)

pipeline {
    agent any
    stages {
        stage("ステージ名1") {
            steps {
                build job: "ジョブ名1",
                parameters: [
                    string(name: "パラメータ名", value: "${パラメータ名}")
                ]
            }
        }
        stage("ステージ名2") {
            steps {
                build job: "ジョブ名2",
                parameters: [
                    string(name: "パラメータ名", value: "${パラメータ名}")
                ]
            }
        }
    }
}

pythonの実装

今回自分の仕事はlocalで動いているpythonスクリプトをJenkinsで動かすだけなので、追加実装はそこまで必要ないが、Jenkinsに移行するに伴って以下の追加対応が必要でした。

ビルドのパラメータの取得

pythonのosライブラリを使えば取得できます。

import os

param = os.environ['ParamName']

一つ要注意なのは、パラメータが空の場合、上記の構文だとパラメータがNoneになり、
後続の処理でこのパラメータを使いたい場合はエラーが出ます。
そのため、以下のように事前に判定したほうが意図しないことを防げます。

import os

if os.getenv('ParamName') is not None:
  param = os.environ['ParamName']
else:
  param = "hoge"

ファイルの中身の取得

今回はジョブ1で取得した結果をジョブ2に渡す必要があり、ジョブ1で結果をファイルに書き込んで、ジョブ2のpython scriptでファイルの中身を読み込んだ仕組みを作りました。
pythonでのファイル読み込みは以下の例になります。

filePath="ファイルのフルパス"
f = open(filePath, 'r')
for line in f:
   print(line)

一行しか読み込まない場合はreadlineを使うことができます。

f = open(filePath, 'r')
line = f.readline()
print(line)

実際に読み込んだ行の両方に空白文字や改行コードとかが含まれ、それを変数として使うと後続の処理で意図しないことが発生します。そのため、stripを使って、両端にある特定の文字列や空白文字を削除することがお勧めです。

line = f.readline().strip()

後、ファイルをそのまま開いた状態にすると、システムのリソース消耗し、他の人もアクセスできなくなりますので、ファイルを閉じることを忘れないでください。
簡単な一文でできます。

f.close()

最後に

以上は新しいpythonジョブ及びパイプラインを作った時に学んだ知識です。
皆さんのご参考になれれば幸いです。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0