LoginSignup
5
6

More than 5 years have passed since last update.

Jenkinsでpythonのスクレイピング環境を作る

Last updated at Posted at 2018-11-27

はじめに

ちょっと、クローラを簡単に動かすための環境が必要になったので、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環境を作ろう

導入するプラグインは
image.png
の合計4つ、依存関係のプラグインも含めると、少々時間がかかりますが、導入しましょう

環境セットアップのジョブ

① ダッシュボードから「新規ジョブ」で「フリースタイルのプロジェクトビルド」を作ります、アイテム名に任意でどうぞ(ここではpython_install)とした
image.png
説明はわかりやすく書けばOK
image.png
次は、「ソースコード管理」と「ビルド・トリガ」はデフォルトのままにして「ビルド環境」まで進めて、[pyenv build warpper]のチェックを入れて、

  • The Python version には、使うバージョンを記入
  • Preinstall pip list には、その環境で使うpipモジュールをカンマ区切り(カンマの前後に半角スペース)で記入

image.png
次に「ビルド」で[Execute python script]を選択して
image.png
適当に、hello world でも書いておく
image.png
さらに「ビルド手順の追加」から「シェルの実行」を選択し
image.png

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

書いたら「保存」
image.png

ジョブができるので、「ビルド実行」します
image.png

そうすると、初回は、ちょっと時間がかかるので、一休みしながら待ちます。
おそらく、初回は、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のアップグレードが必要になったら、このジョブを流すことでアップグレードできます

スクレイピングしてみよう

ダッシュボードに戻って「新規ジョブ」から新しいジョブを作ります

image.png
説明は適当にわかるように書いたら
image.png
先ほど作った、環境構築用のジョブの「ビルド環境」までは同じ設定にします
(※pipのpreinstallは完了しているので空欄でもよいです)
image.png
次に、前述と同じく「ビルド」で[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)

image.png
書き終えたら保存して、ジョブができたら、「ビルド実行」してみましょう
image.png
実行するとコンソール出力に
image.png
こんな感じに、記事のタイトルと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系にしてしまうという力技もある。

さいごに

ほとんど覚書レベルの内容なので、あくまで参考程度にしてもらえるとうれしいです。

5
6
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
5
6