はじめに
ちょっと、クローラを簡単に動かすための環境が必要になったので、Jenkinsとpythonを組み合わせてクローラ用の環境を作った際の覚書です。
環境
OS : Ubuntu 18.04 x86_64
CPU : Intel core i7-3770k
MEM : 16GB
SSD : 512GB
OSの設定
…は割愛します、普通にインストールして、ロケールとタイムゾーンだけは以下の設定にしてある状態
sudo timedatectl set-timezone Asia/Tokyo
sudo ntpdate time.google.com
sudo localectl set-locale LANG=ja_JP.utf8
sudo localectl set-keymap jp106
ユーザ設定
jenkinsユーザを作ってwheelグループに追加します
sudo adduser jenkins
sudo usermod -aG wheel jenkins
wheelグループをNOPASSWDでコマンドを実行できるようにします
sudo visudo
で、以下のコメントアウトを解除します
#%wheel ALL=(ALL) NOPASSWD: ALL
↓
%wheel ALL=(ALL) NOPASSWD: ALL
Jenkinsのインストール
sudo apt-get update
sudo apt-get upgrade
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
jenkinsのプロセスが立ち上がったら
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
xxxxxxxxxxxxxxxxxxxxxxxxx ←初回ログイン用パスワード
ブラウザで http://{IPアドレス}:8080/
にアクセスして、上記の初回ログイン用パスワードを入力して、ログインします
このあたりのことは、Jenkinsをインストールして使ってみよう[Mac/Linux/Windows を参考にするといいと思います。かなり親切に解説されているところが多いですので、以降割愛します
Jenkins PluginでPython環境を作ろう
導入するプラグインは
の合計4つ、依存関係のプラグインも含めると、少々時間がかかりますが、導入しましょう
環境セットアップのジョブ
① ダッシュボードから「新規ジョブ」で「フリースタイルのプロジェクトビルド」を作ります、アイテム名に任意でどうぞ(ここではpython_install)とした
説明はわかりやすく書けばOK
次は、「ソースコード管理」と「ビルド・トリガ」はデフォルトのままにして「ビルド環境」まで進めて、[pyenv build warpper]のチェックを入れて、
- The Python version には、使うバージョンを記入
- Preinstall pip list には、その環境で使うpipモジュールをカンマ区切り(カンマの前後に半角スペース)で記入
次に「ビルド」で[Execute python script]を選択して
適当に、hello world
でも書いておく
さらに「ビルド手順の追加」から「シェルの実行」を選択し
pyenvとpipのアップグレード用のスクリプトを書く
#!/bin/sh
if [ ! -d "$HOME/.pyenv" ]; then
#なかったらClone
git clone git://github.com/yyuu/pyenv.git "$HOME/.pyenv"
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
else
#あったら変数読み込み
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
fi
if [ ! -d "$HOME/.pyenv/plugins/pyenv-update" ]; then
git clone git://github.com/yyuu/pyenv-update.git "$HOME/.pyenv/plugins/pyenv-update"
fi
pyenv update
pip install --upgrade pip
そうすると、初回は、ちょっと時間がかかるので、一休みしながら待ちます。
おそらく、初回は、pipのアップグレードを促すログが出て失敗しますので、もう一度、「ビルド実行」をします
すると、コンソールには以下のようなログがでて今度は成功すると思います。
コンソール出力
ユーザーunknown or anonymousが実行
ビルドします。 ワークスペース: /var/lib/jenkins/workspace/python_install
$ bash -c "[ -d \$HOME/.pyenv ]"
$ bash -c "cd /var/lib/jenkins/workspace/python_install && env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv local 2>/dev/null || true"
$ bash -c "mkdir \$HOME/.pyenv.lock"
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv versions --bare"
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv rehash"
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv exec pip list"
Installing datetime...
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv exec pip install datetime"
Requirement already satisfied: datetime in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (4.3)
Requirement already satisfied: pytz in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from datetime) (2018.7)
Requirement already satisfied: zope.interface in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from datetime) (4.6.0)
Requirement already satisfied: setuptools in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from zope.interface->datetime) (39.0.1)
Installed datetime.
Installing pyInstaller...
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv exec pip install pyInstaller"
Requirement already satisfied: pyInstaller in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (3.4)
Requirement already satisfied: setuptools in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pyInstaller) (39.0.1)
Requirement already satisfied: pefile>=2017.8.1 in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pyInstaller) (2018.8.8)
Requirement already satisfied: macholib>=1.8 in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pyInstaller) (1.11)
Requirement already satisfied: altgraph in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pyInstaller) (0.16.1)
Requirement already satisfied: future in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (from pefile>=2017.8.1->pyInstaller) (0.17.1)
Installed pyInstaller.
$ bash -c "env PYENV_ROOT\=\$HOME/.pyenv PYENV_VERSION\=3.6.5 \$HOME/.pyenv/bin/pyenv rehash"
$ bash -c "rm -rf \$HOME/.pyenv.lock"
[python_install] $ python /tmp/jenkins3284310755011377124.py
Hello World
[python_install] $ /bin/sh /tmp/jenkins7561038842122963616.sh
[2;32mUpdating /var/lib/jenkins/.pyenv...
[0mFrom https://github.com/yyuu/pyenv
* branch master -> FETCH_HEAD
Already up to date.
[2;32mUpdating /var/lib/jenkins/.pyenv/plugins/pyenv-update...
[0mFrom git://github.com/yyuu/pyenv-update
* branch master -> FETCH_HEAD
Already up to date.
Requirement already up-to-date: pip in /var/lib/jenkins/.pyenv/versions/3.6.5/lib/python3.6/site-packages (18.1)
Finished: SUCCESS
これでJenkinsのpython実行環境が完成です。
※pyenvとpipのアップグレードが必要になったら、このジョブを流すことでアップグレードできます
スクレイピングしてみよう
ダッシュボードに戻って「新規ジョブ」から新しいジョブを作ります
説明は適当にわかるように書いたら
先ほど作った、環境構築用のジョブの「ビルド環境」までは同じ設定にします
(※pipのpreinstallは完了しているので空欄でもよいです)
次に、前述と同じく「ビルド」で[Execute python script]を選択して、こんな感じに、feedを拾って解析するスクリプトを適当に書いてみる
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
user_head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
url = 'https://qiita.com/hirohiro77/feed'
response = requests.get(url,headers=user_head)
soup = BeautifulSoup(response.content, 'html.parser')
for entry in soup.find_all("entry"):
print(entry.find("title").string)
print(entry.find("id").string)
書き終えたら保存して、ジョブができたら、「ビルド実行」してみましょう
実行するとコンソール出力に
こんな感じに、記事のタイトルとIDを抽出してくるように動きます。
あとは、CSVに格納したり、いろいろできますね。
これでスクレイピング用のJenkinsサーバは完成です
はまりポイント
実際に実行して、はまるポイントがいくつかあります。
Pythonスクリプトのジョブを動かした際に、pipでインストールしたモジュールが見つからないというエラーが出る場合があります
ImportError: No module named 'BeautifulSoup'
みたいなやつですね。この現象が発生した場合の解決策
- 環境変数を確認する
pyenvラッパーが何かの拍子に、$HOMEの展開ができなくなる現象が稀に出るようで、jenkinsユーザのホームの ~/.bash_profile
にpyenv導入の際の環境変数を追記しておく
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
- pythonスクリプトの実行前に環境変数を定義し直す
pythonスクリプトの実行前に「シェルの実行」で以下のスクリプトを加えておく
#!/bin/sh
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
- pyenvローカル/グローバル設定をしてしまう
pyenv local 3.6.5
pyenv global 3.6.5
- そもそもpyenvの利用をやめてしまう
単一バージョンでしか使わないのであれば、pyenvを外してパッケージインストールされているpythonを使うという手もある。この場合、cp /usr/bin/python3 /usr/bin/python
みたいな感じでデフォルトのpythonを3系にしてしまうという力技もある。
さいごに
ほとんど覚書レベルの内容なので、あくまで参考程度にしてもらえるとうれしいです。