JenkinsからConda環境を切り替えてPythonスクリプトを実行する

タイトルが長いですね・・・
で、このエントリはタイトル通りのことを行います

LotteryAnalyzerの中身

先日公開したLotteryAnalyzerですが、まだ完全体ではありません!
LotteryAnalyzerは大きく4つのプログラムが組み合わさって稼働しています。
・フロントエンドのCoreUI(VueJS)
・サーバサイドのLaravel(PHP)
・抽選結果を取得するScrayper(Python)
・抽選結果を予測するPrediction(Python)
このうち、ScrayerとPredictionは毎週決まった時間に実行させたいので、jenkinsから実行できるように設定してみました。

Jenkinsの設定内容

Jenkinsからシェルを実行する。
やりたいことはシンプルですが、以下の点が分からず苦戦しました。
・jenkinsでシェルを呼び出す方法がわからない
・shellの中でのconda環境の切り替え方がわからない

jenkinsからのshell呼び出し

方法として、「sudoを利用して実行権限を持つユーザーで実行」する方式をとりました。

visudo設定

jenkinsから「whoami」コマンドを実行したところ、実行ユーザが「tomcat」となっていたため、tomcatユーザに対してsudoが利用できるように設定しました。

visudo:
tomcat ALL=(ALL) NOPASSWD: /home/ユーザ/batch/lottery/scrayper/exec_lottery.sh
tomcat ALL=(ALL) NOPASSWD: /home/ユーザ/batch/lottery/prediction/exec_prediction.sh
Defaults:tomcat !requiretty

Jenkinsのジョブ内容は以下の通り。
フリースタイルプロジェクトを作成し、設定したシェルを実行するようにします

これでひとまず、jenkinsからシェルを実行できるようになりました。

conda環境を切り替える

pythonの実行環境の制御にanacondaを利用しています。
スクレイピング用、番号予測用でそれぞれ環境が異なります。
端末からは「conda activate」コマンドで切り替えできますが、シェルスクリプト内部からはなぜか切り替えができない事象が発生しました。

以下の方法で解決

>>> conda initialize >>>
 !! Contents within this block are managed by 'conda init' !!
 __conda_setup="$('/home/ユーザ/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
 if [ $? -eq 0 ]; then
     eval "$__conda_setup"
 else
     if [ -f "/home/ ユーザ /anaconda3/etc/profile.d/conda.sh" ]; then
         . "/home/ ユーザ /anaconda3/etc/profile.d/conda.sh"
     else
         export PATH="/home/ ユーザ /anaconda3/bin:$PATH"
     fi
 fi
 unset __conda_setup
 <<< conda initialize <<<

cd /home/ ユーザ /batch/lottery/scrayper/
conda activate scraping37
python lottery_loto7.py

かなり強引ですが、anaconda3をインストールしたときに設定される環境設定スクリプトをシェルの中に埋め込み、実行できました。
参考
https://qiita.com/tori_taro/items/ad3a4f488a49400fd457

自動化完了

これでJenkinsからシェルを実行できるようになりました。
と同時に、当初の目標でもあった、LotteryAnalyzerの自動更新の仕組みも出来上がったわけです。
今後は自動で更新されていくので、毎週の更新が楽しみですね!

Jenkinsは導入当初、左上のおじさんをシャロちゃんに変更して放置していましたが、やっと有効活用できた気がする。