2017年5月7日日曜日

kubernetesをRaspberry pi 3にインストールする(その2)

前回に引き続きkubernetesをRaspberry pi 3にインストールします。

1. etcdのインストール

etcdの配布されているバイナリーにARM版がないため、ソースコードからビルドします。
今回はビルドして、そのバイナリを他のRasPiに配るようにします。

1.1 etcdのビルドとインストール (masterの1台)

# Go-langをインストール
$ wget https://storage.googleapis.com/golang/go1.8.1.linux-armv6l.tar.gz
$ tar zxf go1.8.1.linux-armv6l.tar.gz
$ sudo mv go /usr/local
$ echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc
# etcdをクローンしてビルド
$ export GOOS=linux
$ export GOARCH=arm
$ export GOARM=7
$ git clone --branch v3.1.7 https://github.com/coreos/etcd.git
$ cd etcd
$ ./build
# ビルドされたファイルは./bin/にできるので、インストール
$ sudo mv ./bin/* /usr/local/bin/
$ sudo chmod 755 /usr/local/bin/etcd
$ sudo chmod 755 /usr/local/bin/etcdctl
# 他のRasPiにファイルを転送
$ scp ./bin/etcd node02:/usr/local/bin/etcd
$ scp ./bin/etcd node02:/usr/local/bin/etcdctl
$ scp ./bin/etcd node03:/usr/local/bin/etcd
$ scp ./bin/etcd node03:/usr/local/bin/etcdctl
# etcdのデータ保存用のディレクトリを作成
$ sudo mkdir -p /var/lib/etcd
$ sudo chown -R root:$(whoami) /var/lib/etcd
$ sudo chmod -R a+rw /var/lib/etcd
# systemdファイルを作成
$ cat > /etc/systemd/system/etcd.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
After=network.target
[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0
Environment="ETCD_UNSUPPORTED_ARCH=arm"
ExecStart=/usr/local/bin/etcd --name etcd-1 \\
    --data-dir /var/lib/etcd \\
    --discovery-srv k8s.h-tsk.com \\
    --initial-advertise-peer-urls http://node01.k8s.h-tsk.com:2380 \\
    --advertise-client-urls http://node01.k8s.h-tsk.com:2379 \\
    --listen-client-urls http://127.0.0.1:2379,http://node01.k8s.h-tsk.com:2379 \\
    --listen-peer-urls http://node01.k8s.h-tsk.com:2380 \\
    --initial-cluster-token my-etcd-token \\
    --initial-cluster-state new
[Install]
WantedBy=multi-user.target
EOF

1.2 etcdのインストール (残りmaster)

# ビルドされたファイルは転送してあるので、実行権限付与
$ sudo chmod 755 /usr/local/bin/etcd
$ sudo chmod 755 /usr/local/bin/etcdctl
# etcdのデータ保存用のディレクトリを作成
$ sudo mkdir -p /var/lib/etcd
$ sudo chown -R root:$(whoami) /var/lib/etcd
$ sudo chmod -R a+rw /var/lib/etcd
# systemdファイルを作成 (インストール先によってNODE_IDをかえる)
$ sudo su -
$$ export NODE_ID= 2 or 3
$$ cat > /etc/systemd/system/etcd.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
After=network.target
[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0
Environment="ETCD_UNSUPPORTED_ARCH=arm"
ExecStart=/usr/local/bin/etcd --name etcd-${NODE_ID} \\
    --data-dir /var/lib/etcd \\
    --discovery-srv k8s.h-tsk.com \\
    --initial-advertise-peer-urls http://node0${NODE_ID}.k8s.h-tsk.com:2380 \\
    --advertise-client-urls http://node0${NODE_ID}.k8s.h-tsk.com:2379 \\
    --listen-client-urls http://127.0.0.1:2379,http://node0${NODE_ID}.k8s.h-tsk.com:2379 \\
    --listen-peer-urls http://node0${NODE_ID}.k8s.h-tsk.com:2380 \\
    --initial-cluster-token my-etcd-token \\
    --initial-cluster-state new
[Install]
WantedBy=multi-user.target
EOF

1.3 etcdの起動 (master)

etcdを2つ目のmasterを起動するまでは、1台目のstartコマンドは戻ってこないです。(2台でetcdクラスタが組めるまでは待機するらしい)
$ sudo systemctl start etcd
$ sudo systemctl enable etcd

2. flannelのインストール (master, node)


$ sudo apt-get install -y build-essential linux-libc-dev bridge-utils git curl ssh unzip
$ wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-arm.tar.gz
$ tar zxf flannel-v0.7.1-linux-arm.tar.gz
$ sudo mkdir /opt/flanneld
$ sudo mv flanneld /usr/local/bin/flanneld
$ sudo mv mk-docker-opts.sh /opt/flanneld/mk-docker-opts.sh
$ sudo chmod 755 /usr/local/bin/flanneld
$ sudo chmod 755 /opt/flanneld/mk-docker-opts.sh
$ sudo su -
$$ mkdir -p /etc/flanneld
$$ export ADVERTISE_IP=192.168.13.1 # <- 設定する各masterのIPアドレス
$$ cat > /etc/flanneld/options.env << EOF
FLANNELD_IFACE=${ADVERTISE_IP}
FLANNELD_ETCD_ENDPOINTS=http://node01.k8s.h-tsk.com:2379,http://node02.k8s.h-tsk.com:2379,http://node02.k8s.h-tsk.com:2379
EOF
$$ cat > /etc/systemd/system/flanneld.service << EOF
[Unit]
Description=Network fabric for containers
Documentation=https://github.com/coreos/flannel
Requires=networking.service
Before=docker.service
After=networking.service
[Service]
Type=notify
Restart=always
RestartSec=5
EnvironmentFile=/etc/flanneld/options.env
LimitNOFILE=40000
LimitNPROC=1048576
ExecStartPre=/sbin/modprobe ip_tables
ExecStartPre=/bin/mkdir -p /run/flanneld
ExecStart=/usr/local/bin/flanneld --ip-masq=true
## Updating Docker options
ExecStartPost=/opt/flanneld/mk-docker-opts.sh -d /run/flanneld/docker_opts.env -i
[Install]
WantedBy=multi-user.target
EOF

3. flannelとdockerの連携設定 (master, node)

3.1 docker.serviceにflannelの設定をおこなう(master, node)

$ sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
$ sudo sed -i "s/\[Service\]/\[Service\]\nEnvironmentFile=-\/run\/flanneld\/docker_opts.env/" /etc/systemd/system/docker.service
$ sudo sed -i "s/fd:\/\/$/fd:\/\/ \$DOCKER_OPTS \$DOCKER_OPT_BIP \$DOCKER_OPT_MTU \$DOCKER_OPT_IPMASQ/" /etc/systemd/system/docker.service

3.2 etcdにflannelの設定を入れる (masterの1台だけ)

$ etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'

3.3 flannelとdockerを起動させる (master, node)

$ sudo systemctl daemon-reload
$ sudo systemctl start flanneld
$ sudo systemctl enable flanneld
$ sudo systemctl restart docker  
やっとkubernetesを動かす環境がセットアップできたので、次回はインストールをします。





kubernetesをRaspberry pi 3にインストールする(その1)

kubernetes 1.6がリリースされたので、出遅れ感もありながらRaspberry pi 3にインストールしてみる。

すでにhypriotkubeadmを組み合わせるとサクッとクラスタが作れるけど、勉強もかねて手動で全部入れることにします。

今回はRaspberry pi3を5台で、下記のような構成で設定します。


1. RaspberryPiにRaspbianのインストール (master, node共通)

インストール方法は有名なので省略。
注意点としては、最近のRaspbianはデフォルトでSSHが無効化されているので、boot領域に"ssh"の空ファイルをおいて、有効化させておくこと。

2. ネットワークの設定 (master, node共通)

今回のネットワークハブは5ポートでRasPiが5台だと、有線で外部接続ができないのでmasterにする1台をNATゲートウェイします。

2.1 RasPiに固定IPの設定 (master, node共通)

知らない間に固定IPの方法が "/etc/network/interfaces" から "/etc/dhcpcd.conf" 変わったらしい... 
"/etc/network/interfaces"にこんなコメント入ってた
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

"/etc/dhcpcd.conf"にeth0の設定を入れますが、有線LANはeth0で認識するみたいなので確認せず入れちゃう。
$ cat <<EOF >> /etc/dhcpcd.confinterface eth0static ip_address=192.168.13.12/24   # <- ここはそれぞれの固定IPstatic routers=192.168.13.1                # <- NATゲートウェイにする1台だけは、設定しないのでコメントアウトstatic domain_name_servers=192.168.13.1 # <- DNSサーバを建てるところのIP(後述)EOF
※ここでOS再起動させると固定IPに変わるけど、DNSサーバを立ててないので外に繋がらなくなります....

2.2 NATゲートウェイの設定 (masterの1台だけ)

RasPiはNICが1つしかないので、USBのNICを追加(Wifiでも良いけど遅い気がするので...)して設定します。

RasPiについているNICは "eth0" で認識されていて、USB増設した方は "eth1" になっていてDHCPでIPアドレスが取れてます。
$ ip addr | grep -e "eth[0-9]"
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.41/24 brd 192.168.1.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.42/24 brd 192.168.1.255 scope global eth1
これを "eth0" (192.168.13.1 [固定IP]) <---> "eth1" (192.168.1.xx [DHCP])でNATゲートウェイに替えます。

あとは先人のUbuntu 14.04のルーター化に書かれているとおり黙々と設定します。
$ sudo vi /etc/sysctl.conf
#net.ipv4.ip_forward=1
↓ (コメントアウトを外す)
net.ipv4.ip_forward=1
 
$ sudo /sbin/iptables -t nat -A POSTROUTING -s 192.168.13.0/255.255.255.0 -j MASQUERADE
$ sudo /sbin/iptables-save -c > /etc/iptables.rules
$ cat <<EOF >> /etc/network/if-pre-up.d/iptables_start
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
exit 0
EOF
$ sudo chmod +x 
/etc/network/if-pre-up.d/iptables_start

3. OSの初期設定 (master, node共通)

ここは全部rootユーザに昇格してコマンド実行します。sudo打つのが面倒なので、、、
# piユーザーのパスワード変更
$ passwd pi
# cgroupを有効化
$ sed -ie 's/rootwait/cgroup_enable=cpuset cgroup_enable=memory rootwait/' /boot/cmdline.txt
# docker公式にしたがってインストール$ curl -sSL https://get.docker.com | sh$ gpasswd -a pi docker
# raspi-configでHostnameとかTimeZoneとか
$ raspi-config

4. 設定反映のために各RasPiを再起動すると、固定IPで接続できるはず。

5. DNSサーバの設定  (masterのNATゲートウェイの1台だけ)

dnsmasqをDNSサーバにして、RasPiのネットワークから外部DNSに問い合わせるためと、etcdのDNSディスカバリのために設定を入れます。

今回は "k8s.h-tsk.com" を内部ネットワーク用のサブドメインで使います。


$ sudo apt-get install -y dnsmasq dnsutils 
$ sudo /etc/dnsmasq.conf# 以下の項目をコメントアウトを外して修正domain-neededbogus-privstrict-orderlocal=/k8s.h-tsk.com/expand-hostsdomain=k8s.h-tsk.com
# 以下の項目をetcd公式にしたがって追加 (node01~03をetcdクラスタにします)srv-host=_etcd-server._tcp.k8s.h-tsk.com,node01.k8s.h-tsk.com,2380srv-host=_etcd-server._tcp.k8s.h-tsk.com,node02.k8s.h-tsk.com,2380srv-host=_etcd-server._tcp.k8s.h-tsk.com,node03.k8s.h-tsk.com,2380srv-host=_etcd-client._tcp.k8s.h-tsk.com,node01.k8s.h-tsk.com,2379srv-host=_etcd-client._tcp.k8s.h-tsk.com,node02.k8s.h-tsk.com,2379srv-host=_etcd-client._tcp.k8s.h-tsk.com,node03.k8s.h-tsk.com,2379 
# 各RasPiのIPアドレスをhosts$ cat <<EOF >> /etc/hosts192.168.13.1 k8s-node01 node01192.168.13.12 k8s-node02 node02192.168.13.13 k8s-node03 node03192.168.13.14 k8s-node04 node04192.168.13.15 k8s-node05 node05EOF 
$ systemctl start dnsmasq$ systemctl enable dnsmasq

6 DNSが動いているか確認  (masterのNATゲートウェイの1台だけ)

# 全部のRasPiのIPアドレスが取れるはず$ dig +noall +answer node01.k8s.h-tsk.com node02.k8s.h-tsk.com node03.k8s.h-tsk.com node04.k8s.h-tsk.com node05.k8s.h-tsk.comnode01.k8s.h-tsk.com. 0 IN A 192.168.13.1node02.k8s.h-tsk.com. 0 IN A 192.168.13.12node03.k8s.h-tsk.com. 0 IN A 192.168.13.13node04.k8s.h-tsk.com. 0 IN A 192.168.13.14node05.k8s.h-tsk.com. 0 IN A 192.168.13.15
# etcdクラスタに入れるmasterの3台分が取れるはず$ dig +noall +answer SRV _etcd-server._tcp.k8s.h-tsk.com_etcd-server._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2380 node03.k8s.h-tsk.com._etcd-server._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2380 node02.k8s.h-tsk.com._etcd-server._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2380 node01.k8s.h-tsk.com.$ dig +noall +answer SRV _etcd-client._tcp.k8s.h-tsk.com_etcd-client._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2379 node03.k8s.h-tsk.com._etcd-client._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2379 node02.k8s.h-tsk.com._etcd-client._tcp.k8s.h-tsk.com. 0 IN SRV 0 0 2379 node01.k8s.h-tsk.com.

長くなったので、etcdとflannelのインストールとkubernetesのインストールは分けます。




参考:
  1. dnsmasqで始めるプライベートDNSサーバ
  2. Providing SRV and TXT records for Kerberos and LDAP with dnsmasq
  3. raspberry pi 3でSSH接続できない?
  4. Installing Kubernetes on ARM with kubeadm

2015年9月1日火曜日

FlaskとPython3からGmailでメール送信(OAuth 2.0対応)

Webアプリ経由でGmailからメールを送ることにしたが、せっかくなのOAuth 2.0に対応させることにした。

ベースのソースコード下記にあるので、2つを組み合わせてそれを動かす。

1.の方はFlaskでOAuth2.0認証して、Google Driveのファイルを取得しているので、認証後に2.のGmailから送信するように組み合わせる。
2つ合体はサクッと。。。
まぁ。動きません。

ここからは試行錯誤なので、結論を書くと、
  • Payloadの"raw"はurlsafe_b64decodeを使いましょう。
  • Python3で使う場合は、ちゃんとStrからByteに変換してからBase64変換をかけましょう。
いじょ。

適当な入力フォームから送ると、

こんな結果が帰ってきます。



ソースはこんな感じ。
※GoogleDevelopersConsoleからAPI認証用Jsonファイルをダウンロードして、作業ディレクトリに"client_secrets.json"として保存してください。
※送信元のメールアドレスは、API認証用Jsonファイルと同じカウントでないとNG。
※ソースはBitbucketにおいてありますので、自己責任で使ってください。


ここからが試行錯誤した結果。
Pythonのバージョンなのか、日本語なのか、GmailのBase64フォーマットの変換でエラー。。。

  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/base64.py", line 62, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
TypeError: 'str' does not support the buffer interface
まぁ。GoogleのサンプルがPython2系向けで、3系からByteとStrの扱いが変わったので、再度サクッと。。。

直したとこだけ。
return {'raw': base64.b64encode(message.as_string())}

return {'raw': base64.b64encode(bytes(message.as_string(), 'UTF-8')).decode()}
これで、ASCIIは送れるようになったので。

キャプチャか何か。同じ同じ

日本語を送ろうとすると。。。。こんな感じで、エラーが。
Invalid value for ByteString: Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1dGY・・(略)・・・

GoogleAPIを使うためにググる。
stackoverflowの
によると、"urlsafe_b64encode"を使えよとのこと。
PHPの話みたいなので、Pythonだとこれかな。

base64.urlsafe_b64encode (s)バイト文字列 s を URL-safe アルファベットを利用してエンコードします。標準 base64 アルファベットに比べて、+ の替わりに - を、/ の替わりに _ を利用します。結果は = を含みます。
直すと、無事に日本語が送れました。
なかなか、”URL Safe” Base64に気づかず、結構はまったのでメモ。

2015年5月19日火曜日

さくらVPSのCentos7が起動しなくなった。。。

さくらVPSのCentos7が、YUMでカーネルアップデート後にカーネルパニックでブートローダーから読めなくなった。
実は、OSがカーネルパニックで起動しなくなったのは2回目なので、、、、今回は作業メモを残すことにした。3回目に備えて。。。

完全に作業メモなので、気が向いたら綺麗に書くかも。。。

①CentOSのISOからレスキューモードで起動させる。
 さくらVPSのコントロールパネル
  →OSインストール
  →カスタムOSインストール
  →CentOS7を選択
   →内容を確認するを押す
  →インストールを実行するを押す
    ※バックアップを取ってから作業してね 的なメッセージがでるが無視。。。
  →準備ができるとVNCコンソールを開くボタンが表示される。

 ここからVNCコンソールの作業
 トラブルシューティングを選択
 →レスキューを選択
 →ISOからOSが起動する。
  →既存のHDDをマウントするか聞かれるので、Continueを選択
  →何度かOKを押す
 →シェルが表示される。
 →chroot /mnt/systemimage
 
②1つ前のカーネルで起動させる。
下記のサイトを参考に実施。
http://ayufishing.blog.fc2.com/blog-entry-12.html
※このサーバのCentOS7は、6からのアップデートなのでGRUBで起動する。

vi /etc/grub.conf

default=0

default=1

③再起動させる
exit
→reboot

④再起動後、特に問題が無ければYUMでアップデートされる前のカーネルで起動する。
 が、今回はサービス起動中に固まってしまって起動できず。。。

⑤シングルユーザで起動
下記のサイトを参考に実施
http://infrakeise.blog92.fc2.com/blog-entry-151.html

GRUBの画面で、何かキーを押す
→起動選択画面で、1つ前のカーネルにカーソルを動かし、「e」を押す
 →kernel始まる行にカーソルを動かし「e」を押す
 →最後尾にスペースを入れて「single」と入力し、エンターを押す。
 →1つ前の画面に戻るので、「b」を押す。
→HDDからCentOSがシングルユーザモードで起動する。
 →途中でRootパスワードを入れるように言われるので、入力するとRootでログインができる。

⑥シングルユーザモードでSSHを起動して、外部にデータを救出
シングルユーザモード(ランレベル1)では、NetworkとSSHが起動していないので手動起動。
下記のサイトで、シングルユーザでもSSHが起動できると書いてあったので、試したら本当に起動した。
http://qiita.com/hilotech/items/4d830347085ca27e3ba1

下記のコマンドで、NetworkサービスとSSHDを起動させる。
 systemctl start network
 systemctl start sshd
→もし、SSHでRootログインを禁止している場合は、
vi /etc/ssh/sshd_conf
root〜 yesにする
 →あとは、通常のSSHの接続と同じで使えるので、SFTPでファイルを外部に送ってやればOK.








2015年3月22日日曜日

JenkinsでtoxとPytestを使ってCI

JenkinsでToxとPytestを使って、テストを実行するまでの設定。

まず、Jenknsがインストールされているサーバに下記をインストールします。
本当は、Virtualenvを使うのが良いのですが、Jenkinsの設定が面倒なので、そのまま入れます。。。。(あんまり良くないよね。。。。。)

1. Tox.iniを準備
試験したいプロジェクトにTox.iniファイルを作成します。
今回は、Python2.7と3.4で、PytestとPEP8確認とカバレッジを実行します。(ちなみに、試験で使うPythonはインストールされてないとダメです。なので、Python2,7と3.4はJenkinsサーバにインストール済みです。)

プロジェクトのdirectory構成はこんな感じ。
├── LICENSE
├── application
│   ├── Calculation.py
│   ├── __init__.py
├── setup.py
├── test
│   ├── test_Calculation.py
└── tox.ini


Tox.ini
[tox]
envlist = py27, py34

[pytest]
pep8maxlinelength = 120

[testenv:py27]
basepython = /usr/local/python27/bin/python2.7

[testenv:py34]
basepython = /usr/local/python34/bin/python3.4

[testenv]
deps =
  pytest
  pytest-cov
  pytest-pep8
  blinker
  Flask
  itsdangerous
  Jinja2
  MarkupSafe
  raven
  requests
  six
  Werkzeug

commands =
  py.test \
    --pep8 \
    --cov application \
    --cov-report xml \
    --junitxml=junit-{envname}.xml \
    test

2. setup.pyを準備
Toxにはsetup.pyが必ず必要らしいので、簡易的な物を作成します。



# -*- coding:utf-8 -*- 
from distutils.core import setup
setup(name='application name', 
  version='0.0.1',
  description='application description',
  author='auth user name',
  author_email='email@localhost.localhost', )
3. JenkinsサーバにToxをインストール
$ sudo pip install tox
ずらずらと・・・
$ sudo -u jenkins python -c "import tox; print tox.__version__"
今回は「1.9.0」がインストールされた様です。

4. jenkinsに「shiningpanda」「Cobertura Plugin」プラグインをインストール
・「shiningpanda」は、JenkinsでPythonを実行するためのプラグインです。
・「Cobertura Plugin」はカバレッジ集計用のプラグインです。

「Jenkinsの管理」→「プラグインマネージャ」→「利用可能」タブに進んで、「ShiningPanda Plugin」「Cobertura Plugin」にチェックを入れてインストールします。

5. JenkinsにPythonの設定
今回は、Python2.7とPython3.4を設定します。

「Jenkinsの管理」→「システムの設定」のなかに「Python」という項目があると思います。
「Python追加」から必要な分だけPythonの設定を入れて、保存。

各項目の設定 
 ・Name: Jenkinsで識別するための名前(何でもよさそう)
 ・Home or executable: Pythonの実行パス。「which python」等で確認して設定。


6. Jobの作成
「新規ジョブ作成」から「マルチ構成プロジェクトのビルド」を選択して、OK。
プロジェクト名はお好きな物を。


7. Jobの設定
6. で新規にジョブを作成した場合は、設定画面に遷移しているはずなので。(遷移していない人は、プロジェクト名を選択して、「設定」を押してください。)

設定画面の下の方にある項目を設定してきます。それ以外の項目は、GithubにコミットしたタイミングでJobを走らせたい場合は設定してください(ここでは割愛)。

次の3カ所を設定して、保存する。
・マトリックスの設定
 「軸の追加」→「Tox」を選択して、「py27」にチェック。「py34」にもチェックしたいが項目がない。。。

   仕方が無いので、「高度な設定」→「py34」と入力。

・ビルド
 「ビルド手順の追加」→「Tox Bulider」を選択し、「Configuration file」に「tox.ini」(デフォルトだった)になっていることを確認。

・ビルド後の処理
 「ビルド後の処理の追加」から次の2つを選択して設定する。

 ①「Cobertura カバレッジ・レポートの集計」
    Cobertura XMLレポート パターン: **/coverage.xml
    ※Pytestのカバレッジレポートは、「coverage.xml」で出力されるので。
 ②「JUnitテスト結果の集計」
    テスト結果XML: **/junit-*.xml
    ※tox.iniで設定したファイル名を指定。

 設定するとこんな感じになる。

8. あとは「ビルド実行」を押すだけ。

参考
http://d.hatena.ne.jp/kuma8/20121124/1353723982
http://tox.readthedocs.org/en/latest/example/jenkins.html
http://shiningpanda.com/tox-on-jenkins-with-shiningpanda-plugin.html


2015年3月21日土曜日

CentOS 7にPython3.4をインストール

2012年にCentOS 6.2 に Python 2.7.2をインストールしてから、気づけばOSもPythonも新しいバージョンに移行してました。

CentOS 7に更新したので、Python3.4をソースからインストールします。
元のPython2.x系は、CentOSで使っている(yumがPythonで書かれていたような、、、)ものはそのままにして、別に3.xを入れます。

1.インストールに必要なものをインストール
$sudo yum install zlib zlib-devel tk-devel tcl-devel sqlite-devel ncurses-devel gdbm-devel readline-devel bzip2-devel openssl-devel

2.Pythonをダウンロードして解凍する
$ wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
$ tar zxvf Python-3.4.3.tgz
3.インストール
今回は、「/usr/local/python34」配下にインストールします。
$ cd Python-3.4.3
$ ./configure --with-threads --enable-shared --prefix=/usr/local/python34
$ make
$ sudo make install

4.パス設定
$ vi ~/.bash_profile
下記を追加する。
export PATH=/usr/local/python34/bin:$PATH

5.エラー対策(x86_64の場合)
ここで,実行すると
python3: error while loading shared libraries: libpython3.4m.so.1.0: cannot open shared object file: No such file or directory
とエラーで動かない.コンパイルはされているので,シンボリックを貼る
$ sudo ln -s /usr/local/python34/lib/libpython3.4m.so.1.0 /lib64/

6.確認
$ python3 --version
Python 3.4.3と表示されれば成功

2014年5月25日日曜日

VMWare ESXiで使っていたHDDをArch Linuxでマウント

ESXiの中身をfuseを使ってマウントして引き上げる。

参考
http://mapi.tumblr.com/post/2909365768

ツールのインストール
1.非Rootユーザで実施
[test@localhost ~]# wget https://aur.archlinux.org/packages/vm/vmfs-tools/vmfs-tools.tar.gz

2.解凍
[test@localhost ~]# tar zxvf vmfs-tools.tar.gz

3.依存関係を解決しながらコンパイル

[test@localhost ~]# makepkg -s

4.インストール
[test@localhost ~]# sudo pacman -U vmfs-tools-0.2.5-1-x86_64.pkg.tar.xz

マウント
[test@localhost ~]# sudo vmfs-fuse /dev/sda1 /mnt

アンマウント
公式サイトのどこにもアンマウント方が書いてないし、とりあえず普通にアンマウントしたらできた。。。ちなみに「sudo fusermount /mnt」はダメでした。。
[test@localhost ~]# sudo umount /mnt

あとは、コピーするなり、変換するなり、お好きなように。