GitLab 6.9.4からGitLab7.4.2へのアップデートとSSHポートの設定

銀鷹です。

しばらく研究室のGitLabのアップデートをサボっていたが、
Task listsがサポートされたということもありバージョンアップを行ったので手順を残しておく。

GitLabの変更内容の詳細は以下のURLを参照のこと。
幾つか変更が行われているが、私(及び周囲の人)としてはTask Listsのサポートが一番大きい。 https://about.gitlab.com/2014/10/22/gitlab-7-4-released/

今回アップデートするGitLabはomnibus installerでインストールしているため、
アップデートもomnibus installerを用いて行う。

手順は以下のとおり、今回はGitLab 6.9.2からGitLab7.4.2へアップデートを行った。
今回アップデートを行うGitLabはDebian 7.6上で動作している。
公式アップデート手順より引用。

unicornとsidekiqの停止。

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq

GitLabのバックアップ(リポジトリWiki、ユーザ等)

sudo gitlab-rake gitlab:backup:create

最新版パッケージの入手と適応。
以下のdebパッケージのURLは新しいバージョンがリリースされると変わるはず。 最新のものはここで確認のこと。

wget https://downloads-packages.s3.amazonaws.com/debian-7.6/gitlab_7.4.2-omnibus-1_amd64.deb
sudo dpkg -i gitlab_7.4.2-omnibus-1_amd64.deb

GitLabの再設定と再起動。
gitlab.ymlを手動で書き換えている場合は変更が取り消されるので注意すること。
可能であれば後述の方法で設定の変更を行うことを推奨。

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

以上でアップデートは完了。
なお、omnibus installerではなく、GitからCloneしてインストールをしている場合のアップデート手順は以下のとおり。
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/6.x-or-7.x-to-7.4.md

/etc/gitlab/gitlab.rbを用いたGitLabの設定変更方法

例として、22番ポート以外でOpenSSH Serverを動作させている場合について記載する。
調べると、多くの場合以下のようにgitlab.ymlを変更するように記載されていることが多い。

http://stackoverflow.com/questions/18517189/gitlab-with-non-standard-ssh-port-on-vm-with-iptable-forwarding

## GitLab Shell settings
gitlab_shell:
  ...
  # If you use non-standard ssh port you need to specify it
  ssh_port: 766

ただし、この用に直接gitlab.ymlを編集した場合、sudo gitlab-ctl reconfigureを実行することで設定内容が上書きされてしまう。
正しくはgitlab.rbに以下のように記載する。

gitlab_rails['gitlab_shell_ssh_port'] = 766

この記載を行った上で、sudo gitlab-ctl reconfigureを実行することによって、
ssh_portに766が設定された状態でgitlab.ymlが生成される。

このように記載することでgitlab.ymlの内容が変更される理由

GitLabのCookBookを見るとgitlab_shell_ssh_portは以下のように定義されている。
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/attributes/default.rb#L128

しかし、このattributesの上書きは以下のように行われるため、
通常のCookBookのattributesを上書きするつもりでgitlab.rbを編集すると失敗する。 https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/libraries/gitlab.rb#L247

正しく設定を行うためには、 default['gitlab']['gitlab-rails']['gitlab_shell_ssh_port']の中からgitlab-railsの部分を取り出し、-_に変更する。
その上で、その後ろに['gitlab_shell_ssh_port'] = <設定したいポート番号>と記載すればよい。

なぜこのような面倒な事を行っているのかはよくわからないが、
このようにすることでsshのポート番号に限らず他のattributesの上書きも行うことが可能である。

例えば、smptのポートを変更したい場合には、gitlab.rbに以下のように記載すれば良い。
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/attributes/default.rb#L159

gitlab_rails['smtp_port'] = 11125

Jenkinsの導入

銀鷹です。

今回は、Debian7へのJenkinsの導入です。
基本的な手順はhttp://qiita.com/soramugi/items/4b91222caaa67fb460f5を参考にしました。
加えて、前回インストールしたGitLabとの連携も行います。

環境

OS: Debian7
Jenkins + GitLab6.6。
なお、今回はJenkinsとGitLabは同じサーバで動いています。

インストール

Jenkinsがリポジトリを公開してくれているので、こいつを使います。参考

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さんは非常にオープンな人なので、誰のお仕事でも受けてしまう模様。
なので、ちゃんと設定をします。
詳細は、こちらに丁寧にまとまっているので、こちらを参照して下さい。

GitLabとの連携

JenkinsからGitLabへのアクセス

まずは、jenkinsユーザでGitLabへアクセス出来るようにします。

# 鍵の作成
sudo su jenkins
# ssh-keygenの設定はご自由に。
ssh-keygen -t rsa -b 2048

ここで作成した、公開鍵をGitLabに登録。
ユーザは、Jenkinsでビルドさせたいリポジトリにアクセス出来るユーザならだれでも良いはず。

GitLabのProfile settings -> SSH -> Add SSH Keyから登録。
登録したら、以下のコマンドでちゃんと入れるかを確認。

# もし、ポートを変えてるなら-pオプションでポートも指定して下さい。
ssh git@<GitLabのIPアドレスorドメイン> -i <秘密鍵> [-p <SSHのポート>]
# 以下の様な結果が帰ってくればOK
PTY allocation request failed on channel 0
Welcome to GitLab, <ユーザ名>!
Connection to <GitLabのIPアドレス> closed.

ここまでがOKなら、残りはJenkinsへの設定です。

gitlab-hook-pluginのインストールと設定

まずは、Jenkinsのトップページから、
Jenkinsの管理 -> プラグインの管理へ進み、
利用可能のタブを選択して、右上のフィルタに「gitlab」と入力。
候補の中にある、「Gitlab Hook Plugin」を選択してインストール。
以上でインストールは完了。

あとは、実際にジョブを作成します。
トップページから、新規ジョブ作成 -> フリースタイル・プロジェクトのビルドを選択。
設定のところで、ソースコード管理の中にあるGitを選択。

GitLabからリポジトリをクローンする時のURLをRepository URLへ、
Credentials以下のAddを押して、KindSSHユーザ名と秘密鍵を選択、
ユーザ名に「git」、秘密鍵Jenkinsマスター上のファイルからを選択して、
秘密鍵の場所をフルパスで指定。
もし、鍵にパスワードがあるなら、下の高度な設定を押してパスフレーズにパスワードを入力。

あとは、リポジトリ・ブラウザで「gitlab」を選択、
URLにGitLab上のプロジェクトのURLを、Versionには「6.6」を入れて完了。

残りの設定を適当に埋めて、保存で完了です。

ここまで出来たら、Jenkinsのトップページへ戻って、
作ったプロジェクトの右端にあるアイコンを押して、為にしにビルドしてみましょう。
ビルドが成功すれば設定はOKです。

hookの設定

ここまで出来たら、後はGitLab側で、Pushされた時に、自動的にビルドが走るようにします。

GitLabのプロジェクトのSettings->Web Hooksを選択。
URLに「http://<JenkinsサーバのIPアドレスorドメイン>/gitlab/build_now」を入力
Triggerは「Push events」でOKです。
入力が終わったらAdd Web Hookをクリック。
最後に、下に追加された内容を確認した上で、Test Hookをクリック。
Jenkins側でビルドがされているか確認して下さい。
ちゃんとビルドが走っていれば次から、Pushする度にビルドが走ります。
これで、何時でも勝手にJenkinsおじさんがお仕事してくれます。


以上で、GitLabとJenkinsの連携は完了です。
基本的には、

  • JenkinsユーザでGitLabへアクセスを可能にする
  • GitLab-Hook-Pluginを入れる
  • JenkinsのジョブでGitからファイルを取得してビルドを行うようにする
  • GitLab側でWeb Hooksを設定する

の4点が出来ていれば動くと思います。

次回は、JenkinsとDockerの連携を扱います。
これが出来るようになれば、わざわざJenkinsが動くサーバに環境を入れなくても、
手元で作ったDockerコンテナでビルドが実行できるので、お手軽です。

今回は以上になります。

GitLab6.6の導入

銀鷹です。

昨年春に研究室でGitLab5.2を導入したのですが、あれからずいぶん時間が経ちました。
いつの間にかメジャーバージョンまで上がっていたようなので、検証してみました。
加えて、今回はJenkins連携とJenkinsとDockerの連携も扱う予定なので、合計3つの記事になります。

環境

OS: Debian7
GitLab: 6.6.4
GitLab-Shell: 1.8.0

インストール

手作業でやりたい場合はinstallationで良いです。
僕はここの通りに手作業でやりました。
基本的な流れはGitLab5.2の頃と大きく変わっていません。
一部うまく行かなかったところがあったので、そこだけ補足します。

補足1

Install Gemsのセクションで以下のコマンドを実行せよとありますが、
パーミッションが無いよって言って怒られました。
ちなみに、今回はPostgresでインストールしたので、実行したのは上のほうです。

# For PostgreSQL (note, the option says "without ... mysql")
sudo -u git -H bundle install --deployment --without development test mysql aws

# Or if you use MySQL (note, the option says "without ... postgres")
sudo -u git -H bundle install --deployment --without development test postgres aws

仕方ないので、一時的にgitユーザでsudoを使えるようにして対処しました。

# sudo可能なユーザでgitユーザをsudoersに追加
sudo visudo
# git     ALL=(ALL:ALL) ALL PASSWD:ALLを追加
sudo su git
# bundle install実行
sudo bundle install --deployment --without development test mysql aws
# 終わったらgitユーザから普段のユーザに戻る
exit
# bundle installを終えたら、gitユーザをsudoersから外す
sudo visudo
# git     ALL=(ALL:ALL) ALL PASSWD:ALLを削除

補足2

こっちは、一応本家のインストール方法のAdvanced Setup Tipsにも乗っていますが、念のため補足。
GitLabはSSH経由でgitの通信を行います。その関係で、SSH Serverが標準の22番ポートで動いていない場合は、以下の設定をしておく必要があります。

# 以下の内容を /home/git/.ssh/config へ追加。
host localhost          # GitLabサーバのホスト名でlocalhostを置き換える
    user git            # 
    port 2222           # SSH Serverが待ち受けしているポート番号で置き換える
    hostname 127.0.0.1; # GitLabサーバのホスト名orIPアドレスで置き換える
# /home/git/gitlab/config/gitlab.ymlの197行目辺りを修正
# 下のような内容が書いてあるので、ssh_portの番号をSSH Serverの待ち受けポート番号で置き換える
# If you use non-standard ssh port you need to specify it
    ssh_port: 2222

以上でOKです。


相変わらず、若干導入は面倒ですが、悪くない感じのインターフェイスがついたGitの環境が無料で手に入るのはありがたい限りです。
次回は、GitLabとJenkinsの連携について書きます。

近況報告

銀鷹です。

久しくブログを書けていなかったので、適当にリハビリも兼ねて書いています。
本当は、最近検証していたJenkinsとDockerで遊んでいたのを書こうとしていたのですが、
さっきから指が痛いので今日は止めておくことにしました。
今も結構痛いです、爪と指の間が裂けたっぽい感じ。

以下、本題の近況報告です。

1. バイト始めました。

就職活動で金が掛かるとかiPad欲しいとか、とりあえず金がほしいとかでアルバイトを始めました。
大阪にあるIT系の会社でサーバの構築とかいろんな検証とかやっています。
今ホットなのはGitHub Enterpriseの導入でしょうか。
まさか学生のうちに触れるとは思っていなかったので楽しくやっています。
その分、家とか大学で使ってるGitLabがしょぼく見えて悲しいですけど・・・

2. 就職活動とやら

一応来年度に修士課程を卒業ということらしいので、就職活動もやっています。
受ける所を決めるのが一番大変だよなーとか思いながら、色々考えながらやった結果、
ある程度状況が落ち着きました。
まだ幾つかの選択肢は残っていますが、殆ど心は決まりつつあります。
就職活動に関しては色々思うところもありますが、
結局のところ呼ばれた(呼んでくれた)ところへ行くのが良いのでは?と思っています。
このへんに関しては、もうちょっと状況が落ち着いて色々出せるようになったらもうちょっと書こう。
結局割りと早い段階で収束しつつあったので、結局お金はそれほどかからなかった。
色んなイベントとかそいういうのは有効活用していくべきだと思います。
少なくとも、○○ナビみたいなサービスよりは意味があったと思います。
お世話になった関係者の方々、ありがとうございました。

3. 研究

一応、昨年は頑張ったおかげで国際学会にも2回位は出せたし、国内でも1回位は出せた。
イデアとしてはそんなに悪くない感じの反応が得られているので、最後一年もうちょっとやってみるつもり。
もっぱらネットワークセキュリティみたいな感じの事をやっています。
最近の悩みの種は実験というか評価方法。一体どうしたものやら。

以上、近況報告でした。
一体何が書きたかったんだろうか・・・

Arch LinuxをVMWare Playerにインストールした時の注意点

銀鷹です。

完全に自分用のメモですが、Vmware PlayerにArch Linuxをインストールした後、
open-vm-toolsopen-vm-tools-modulesをインストールするんですが、
一部のファイルを修正(?)しないとうまくシャットダウン出来ない問題の解決方法をまとめておきます。

時々やらないといけないのですが、いつもファイルの場所とやり方を忘れるので…

修正内容

/lib/systemd/system/vmtoolsd.serviceを修正する。

[Unit]
Description=Open Virtual Machine Tools(Vmware Tools)
conditionVirtualization=vmware

[Service]
ExecStart=/usr/bin/bmtoolsd
## この一行を追加する。
TimeoutStopSec=1s

[Install]
WantedBy=multi-user.target

そもそも、問題の根本的解決方法じゃないんだけど、
すんなり終了できないよりはマシなので…

まともなやり方もあるんだろうけどな…
完全に自分の忘備録です。

2013年プログラム書き納め(?)

銀鷹です。

12月30日になって、ようやく2013年のレポートを全部書き終えました。
これでレポートは書き納めだ、と思ってたんですが、
よくよく考えるとこのところプログラムは書いてなかったので、
2013年の書き納めも兼ねてちょっと書いたものを貼り付けておきます。

お題は、ここに乗ってたリクルートさんがやってたプロコンのサンプルの一つ。
言語は手慣れた物を、と思ったのでPythonで(最近Python3にようやく移行した)。

最後、ババ抜きが終了しない時の条件が今ひとつわからなかったので、
とりあえず、古い状態を残しておいて、
同じ状態が見つかったらループしてるだろうという雑な感じで対応した。
もうちょっとマシな解法があると思うんだけど、僕にはわからなかった…
(誰か教えてください…)

ひとまず、明日中に別のプログラムを書かない限りは、これが2013年のプログラム書き納めです。
2013年はプログラムより論文(特に英語)を沢山書いた年でした。
来年はもうちょっとコードが書きたいな。

それでは、皆さん良いお年を、来年もよろしくお願いします。

Forward Proxy(Squid3)の設置メモ

銀鷹です。

先日、とある事情によりアメリカに居りましたが、
その際に、日本国外からのアクセスを拒否するサービスを使う必要がありました。
その対策として、Forward Proxyを建てた時のメモです。

Forward Proxyとは?

最近はめっきり聞かなくなりましたが、昔の言葉(?)で言うなら串ってやつです。
最近よくある、Nginxで建てて、裏にあるWebアプリにつなぐReverse Proxyとは別物です。

Forward Proxyは、昔回線が細かった頃には、キャッシュとしての意味合いがあったり、
一時(多分90年台くらい)は、自分のグローバルIPを秘匿して
Webサイトにアクセスするときに使われていた様に思います。
(AnonymousなProxyとかがそういう奴でしたね…)

探すと、今でもリストが公開されているようです。
http://www.cybersyndrome.net/pla5.html

今回は、日本国外のIPアドレスからのHTTPリクエストを、
日本国内のForward Proxyサーバを経由することで、
国内からのアクセスに見せかけるために使います。
(基本的に問題無いと思いますが、規約で禁止されてたりしたら辞めてくださいね…)

Forward Proxy Serverの選定

一応、幾つかサーバがあるようですが、
今回はよくあるSquid3を使いました。

最初は、Nginxでも建てれると聞いてやったんですが、
NginxさんはHTTPSに非対応なので辛くて辞めました。
HTTPオンリーで良いならNingxさんはコンフィグも少なくて楽だったのでお勧めです。

Squid3のインストール

参考サイト: http://tejunsho.com/squid/20130319000170.html

環境

インストール方法

以下のコマンドでOK。

sudo apt-get install squid3

Squid3の設定

/etc/squid3/squid.confを書き換える。
デフォルトでは、いっぱいコメントがついたファイルがありましたが、
バックアップしたうえで、僕は全部書き換えました。
内容は以下のとおり。

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# XXX.XXX.XXX.XXX/XX の部分は、
# Proxyサーバへのアクセスを許可するIPアドレスの範囲です。
acl localnet src XXX.XXX.XXX.XXX/XX

acl winupdate dstdomain .microsoft.com .windowsupdate.com
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

# 以下コメントで囲った部分は、Proxyサーバ利用時に、
# BASIC認証を要求するための設定です。
# 必要なければ消してもOK
##########################
auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/.passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl password proxy_auth REQUIRED

http_access allow password
##########################

http_access allow manager localhost
http_access allow winupdate          
http_access deny manager
http_access deny !Safe_ports         
http_access deny CONNECT !SSL_ports 
http_access allow localhost            
http_access allow localnet
http_access deny all

# Proxyサーバのポート番号、一般的に8080ですが、変えてもよい。
http_port 8080

cache_dir ufs /var/spool/squid3 600 16 256

coredump_dir /var/spool/squid3

refresh_pattern .       0   20% 4320

forwarded_for off

request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

access_log /var/log/squid3/access.log common

cache_mem 256 MB

Proxyサーバ利用時にBASIC認証を要求する場合

BASIC認証用のファイルを作る必要があります。
作成方法は以下のとおり。

# htpasswdコマンドが必要なのでapache utilsをインストール
sudo apt-get install apache2-utils

# 実際にファイルの生成
# <USER>は認証時のユーザ名で、<PASS>はパスワードで置き換えること。
sudo htpasswd -c /etc/squid/.passwd <USER>
New password: <PASS>
Re-type new password: <PASS>

sudo chown proxy:proxy /etc/squid3/.passwd

以上で設定は完了。
sudo service squid3 restartでSquid3を再起動。

建てたForward Proxyを使う

ブラウザのProxy設定部分に、Forward Proxyを建てたサーバのIPアドレスかドメインと設定したポート番号を入れて完了。

BASIC認証を有効化している場合は、初回接続時に認証があります。

後は確認くん(懐かしい)とかで、
ちゃんとIPアドレスがForward Proxyの物になっているかを確認して完了。

あとは、Proxy経由で色んなサービスを使ってください。
まあ、大抵の場合は普通にアクセスするより重くなるので、
必要最低限以外は使わないほうがいいと思います。