Ubuntu16.04にGitLabを入れる

Ubuntu 16.04にGitlabを入れていきたいと思います。

Gitlabのインストール

Gitlabのサイトに、OS毎のインストール方法が書いてありました。

$ sudo apt-get install curl openssh-server ca-certificates postfix
$ curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ce
$ sudo gitlab-ctl reconfigure

ポート開ける

80ポートを開けます。

$ sudo ufw allow 80

ポートの衝突を回避する

ブラウザで見てもデフォルトのnginxの画面になる。既にnginx入れているのですが、これとは別にnginxを入れてるみたいでポートが衝突してるらいし。
参考:Ubuntu 14.04 に GitLabをインストールした

上記サイトのとおり、衝突してた。/etc/gitlab/gitlab.rbの下記に、変更したいポートを入れたら出来た。あとは、ufwでポートを開ける必要がある。

nginx['listen_port'] = nil

ブラウザでアクセスしたらGitlabのログイン画面が表示された。パスワード変更してrootでログインできた。

gitユーザでssh接続できるようにする

$ sudo vi /etc/ssh/sshd_config

AllowUsersにgitを追加します。

$ sudo service ssh restart

sshのポートを変えている場合は、gitlab.rbの下記を修正します。

gitlab_rails['gitlab_shell_ssh_port'] = 変更したポート

あとは、ローカルでキーを作成して、gitlabに登録して、.ssh/configを下記のような感じで修正します。

Host hoge.com
        HostName hoge.com
        User git
        IdentityFile C:\Users\hoge\.ssh\hoge_rsa
        Port 12345

メール送信設定

今回はgmailを新たに登録して、設定してみました。gmail登録後に、安全性の低いアプリに許可というのを設定する必要があります。あとは、gitlab.rbを下記のように設定します。

 21  gitlab_rails['time_zone'] = 'Asia/Tokyo'
 22  gitlab_rails['gitlab_email_enabled'] = true
 23  gitlab_rails['gitlab_email_from'] = 'hoge@gmail.com'
 24  gitlab_rails['gitlab_email_display_name'] = 'Hoge'
 25  gitlab_rails['gitlab_email_reply_to'] = 'hoge@gmail.com'

332  gitlab_rails['smtp_enable'] = true
333  gitlab_rails['smtp_address'] = "smtp.gmail.com"
334  gitlab_rails['smtp_port'] = 587
335  gitlab_rails['smtp_user_name'] = "hoge@gmail.com"
336  gitlab_rails['smtp_password'] = "GmailのPASSWORD"
337  gitlab_rails['smtp_domain'] = "smtp.gmail.com"
338  gitlab_rails['smtp_authentication'] = "login"
339  gitlab_rails['smtp_enable_starttls_auto'] = true
340  gitlab_rails['smtp_tls'] = false
341  gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

reconfigure

$ sudo gitlab-ctl reconfigure

CentOS5.0にGitをyumでインストール

yum install gitだとインストールできません。

サーバタイプの確認

$ cat /etc/redhat-release
CentOS release 5.10 (Final)

$ getconf LONG_BIT
64

あと、下記コマンドでx86_64とかが確認できる。

$ cat /proc/version
$ uname -a

rpmforgeを選ぶ

http://pkgs.repoforge.org/rpmforge-release/から、自分のサーバ環境に合うものを確認します。

自分は、CentOS-5 x86 64bitなので、http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpmを選びました。

rpmforgeのインストール

$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
$ sudo rpm -ivh rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm

初期設定が常時使用になっているので、都度使用に変更する

$ sudo sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo

yumでgitを検索

$ yum --enablerepo=rpmforge list | grep git

yumでgitをインストール

$ sudo yum -y --enablerepo=rpmforge install git

参考;
CentOS 5系にyumでgitをインストール
http://pkgs.repoforge.org/rpmforge-release/
yum install git でインストールできない場合 EPELリポジトリの追加

Gitリポジトリをgithubからcodebreakに移行する

Githubのリポジトリをローカルにクローンして、remote originのurlをcodebreakに変更して、pushします。(ローカルリポジトリに、リモートのブランチが全て存在しているか注意します。)

まずは、codebreakに新規リポジトリを作成します。

githubからクローンします。

$ git clone git@github.com:hoge/hoge.git .

ブランチを全てローカル上に落とします。

$ git fetch (リモートのブランチの最新状態を取得)
$ git branch -a (リモートのブランチも含めて表示)
$ git branch (ローカルのブランチを表示)
$ git branch master origin/master (masterがローカルにない場合、左記のようにしてコピー)

(※)下記で現在のremote originのURLが確認できます。

$ git remote -v

remote originのURLをcodebreakに変更します。

$ git remote set-url origin https://hoge@git.codebreak.com/hoge/hoge.git

codebreakのリポジトリにpushします。

$ git push origin master

参考:Gitのリポジトリを移行する

git – クローンしたリポジトリのサブモジュールをワークツリーに展開する

参考:クローンしたリポジトリのサブモジュールをワークツリーに展開する

サブモジュールを含むリポジトリをクローンしたとき、 サブモジュールのディレクトリは空になっている。

git submodule status
を見ると先頭が「-」になっていて、サブモジュールが初期化されていないことがわかる。

git submodule init
git submodule update
とすると、サブモジュールの初期化と更新が実行される。 サブモジュールのディレクトリを見ると、実際にファイルが保存されている。

さくらサーバにgitをインストールする

https://code.google.com/p/git-core/downloads/list

ここから最新版をローカルに落として、サクラサーバにSCPでコピーします。

ここに書いてある通りにインストルします。

$ tar xvfz git-1.9.0.tar.gz
$ cd git-1.9.0
$ ./configure --enable-pthreads=-pthread --prefix=$HOME/local
$ gmake all install

インストールまで出来たら、パスをとおします。

/home/hogehoge/.cshrcを編集します。
下記のset pathというところの最後に、$HOME/local/binを追加します。

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin $HOME/local/bin)

そして、下記をやるとcshrcの再読み込みになるようです。

$ source .cshrc

これでgitと打つとgitがでてきます。

githubにpushするとcapistranoと連動して自動デプロイする

githubにはPost-Receive Hooksという機能があり、これはpushされると、登録したurlにpostアクセスし、json形式でpushしたデータの内容を渡してくれる。なので、このgithubからのpostアクセスを受け付けて、pushデータ内容に応じて、capistranoのサーバにアクセスしcapistranoでデプロイをするようにすれば、pushからの自動デプロイが可能になる。

PHPでGitHubからのpostアクセスの受けをつくる

今回はcapistranoと同じサーバにGitHubのpostアクセスの受けをつくった。ちなみにさくらのvpsサーバ。
apacheの設定をしてgithubから受けられるようにする。受けのphpは下記のような感じにした。

<?php
if(! isset($_POST['payload'])) die();

$payload = json_decode($_POST['payload']);
if(! (isset($payload->repository->url) && $payload->repository->url == 'https://github.com/hogehoge')){
    die();
}

chdir('../cap/hoge');
shell_exec('cap dev deploy');

githubから来てるものに限定するとかするともっとよい。あと、ブランチに応じて、開発サーバデプロイと、本番サーバデプロイを分けるとかできる。まあでも本番デプロイは手動でもいいか。さくらvpsだとapacheのドキュメントルートは/var/www/htmlでして、そこに上記phpファイルを置いております。chdirはつまり/var/www/cap/hogeに移動しており、hoge上にcapistranoフォルダを作っており、そこでcap dev deployをしております。githubのpostアクセスを受けているのはapacheですので、cap dev deployしているのもapacheになります。なので、apache君のssh pubkeyを作ったりしました。あとデプロイサーバのssh pubkeyもgithubに登録しました。僕のcapistranoはどこかで調べてconfig/deploy.rb以外に、config/deploy/dev.rbというのもありますので、それぞれ下記のような内容にしました。ちなみにデプロイサーバもサクラのレンタルサーバです。

config/deploy.rb

require "capistrano/ext/multistage"
require "capistrano_colors"
require "railsless-deploy"
require "rubygems"

ssh_options[:forward_agent] = false
set :normalize_asset_timestamps, false
set :use_sudo, false
default_run_options[:pty]   = true

#ステージ
set :stages, ["dev", "pro"]
set :default_stage, "dev"
# バージョン管理
set :scm, :git
set :scm_passphrase, "hogehogehoge"
# リポジトリ
set :repository, "git@github.com:hogeo/hoge.git"
# ブランチ
set :branch, "dev"
# デプロイ方式
#set :deploy_via, :remote_cache
#世代管理
set :keep_releases, 1 

# デプロイ対象外ファイル
set :copy_exclude, [".git", ".gitignore"]

config/deploy/dev.rb

# アプリケーション名
set :application, "hoge"
# デプロイ先ディレクトリ
set :deploy_to, "/home/hogeo/www/#{application}"

# デプロイサーバー
role :web, "hogeo@hogeo.sakura.ne.jp"
role :app, "hogeo@hogeo.sakura.ne.jp"

#ユーザアカウント
set:user, "hogeo"
set:password, "hogehogehoge"

set :scm_passphrase, "hogehoge"

namespace :deploy do
  before "deploy" do
    try_sudo "chown -R hogeo:users #{deploy_to}"
  end
end

after "deploy", "upload_config"

desc "各種セットアップ情報をアップロードします"
task :upload_config, roles => :web do
 run "cp -f /home/hogeo/www/hoge/database.php #{latest_release}/app/Config/."
 run "chmod -R 755 #{deploy_to}/current/"
 run "rm -rf #{latest_release}/app/tmp/cache/persistent/*"
 run "rm -rf #{latest_release}/app/tmp/cache/models/*"
 run "rm -rf #{latest_release}/app/tmp/logs/*"
end

参考
Webサイトをgithubで管理してpush時に自動的に同期する方法
GitHubとJenkins連動 自動デプロイ 開発環境設定編
githubにPushしたらwebhooksとSinatraを利用してサイトを自動的に更新する
GithubにあるプライベートリポジトリをCapistranoでデプロイ

git

subversionのような省略ワードはエイリアス設定すれば自分でつくれるようだ。

エイリアス設定
git config –global alias.st status
※–globalは個別リポジトリに限定しない全体的な設定
※configの場所は、.git/configにある。テキストファイル。

リポジトリつくる
git init

リポジトリにファイルを追加する
※addしてもaddしたときの内容がインデックスに反映されるだけらしい。
※add後に修正したらもう一回addしないといけない。
git add file

状態みる
git status

作業者の設定
git config –global user.name ‘名前’
git config –global user.email ‘Eメール’

コミット
git commit -m ‘コメント’ –author=’doraemon
※addもあわせて行う場合は、git commit -aとやる。こうすると作業ディレクトリの内容をインデックスに反映してからコミットするらしい。Untrakingファイルは-aとやっても勝ってに追加はされない。

エディターを設定する
export GIT_EDITOR=vim ※bashの場合

コミットログをみる
git log

コミットをみる
git show コミットID ※IDなしの場合は最新を表示

コミットの差分をみる
git diff コミットID コミットID

ファイルの削除
git rm ファイル名 ※システムからファイルが消える

ファイル名変更
git mv ファイル名 ファイル名 ※システムのフィアル名も変わる

リポジトリのコピーをつくる
git clone パス パス

コミットのグラフを表示する
gitk
※なんとWishとかいうGUIな画面が表示された。

二分探索で悪いコミットを探す
git bisect

ファイルの各行の最後にコミットした人とコミットIDを得る
git blame ファイル

ブランチをつくる
git branch ブランチ名 ベースのコミット
※ベースのコミットIDがない場合は、カレントブランチの最新コミットを使う
※コミットの代わりにブランチ名でもよい

ブランチの一覧を表示する
git branch

ブランチの詳細表示
git show-branch

ブランチを切り替える
git checkout ブランチ
※インデックスにコミット前の変更がある状態で、ブランチを切り替えても競合しなければエラーなく切り替わり、インデックスの変更内容は引き継がれる。

ブランチをつくって、その場で切り替える
git checkout -b ブランチ名 ベースのコミット

ブランチを削除する
git branch -d ブランチ名
※カレントブランチは削除できない
※カレントブランチにマージしていないブランチを削除はできない(削除するには-dではなく-Dにする)

マージする
git merge ブランチ名

競合を調査する1
git diff
※競合している箇所を表示する

競合を調査する2
git log –merge -left-right -p

mergeのリセット
git reset –hard HEAD ※mergeのコミット前に実施

bareリポジトリをクローンする
git clone –bare hoge hoge.git

originリモートを追加する
git remote add origin 場所

リモートを削除する
git remote rm リモート

pushする
git push origin

pullする
git pull

アップデートする
git remote update

おまけ(よさげなエイリアスを考えてみる)
status -> st
commit -> ci
commit -a -> ca
diff -> df
branch -> br
merge -> mg
checkout ->chk
とかかなー?