この記事のゴール
GitLabでmasterにマージしたときにConoHaのVPSに自動でデプロイされるようにする。
インフラ初心者の方にも簡単にできるように、できるだけコピペでできるようにする。
ただし、登録系は自分でやってね。
利用するサービス
-
GitLab
- 無料
- GitHubの代わり
- 無料でプライベートリポジトリが作れる
- GitHubより動作が遅い
- ConoHaのVPS
サーバの準備
サーバを立てる
ConoHaのVPSに行く。
↓
ダッシュボードにログインし、サーバを選択していく。
今回は一番安いプラン+CentOS7で作ります。
↓
ネームタグとかパスワードを設定。
ネームタグはただの識別用の名前なので、好きな名前をつけます。
パスワードは、パスワードです。
これでサーバが立ち上がりました。
サーバにログインする
先程の続きです。
サーバリストに今回のサーバが追加されているので、詳細に進みます。
↓
サーバの接続先IPを取得します。
↓
Windowsの場合は、Windows Subsystem for Linux(WSL。旧「Bash On Windows」)、
Macの場合はTerminalを起動し、
ssh root@さっき取得したIP
を実行。
Are you sure you want to continue connecting (yes/no)?
と聞かれるので、yes
をタイプし、Enter。
次にパスワードを聞かれるので、先程設定したパスワードを入力しEnter。
うまくいくと、以下のようにログイン後の画面が表示されます。
Webサーバの準備
サクサク進めていきましょう。
システムを最新に
sudo yum update -y
タイムゾーンを日本に
現在のサーバの時間を見てみる
date
時間をJSTに
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
確認
date
言語設定
UTF8で日本語に
echo "LANG=ja_JP.UTF-8" | sudo tee /etc/sysconfig/i18n
sshログイン時のメッセージを変える
sudo vim /etc/motd
とsudo vim /etc/update-motd.d/30-banner
を編集する。
するとSSHログイン後にメッセージが表示される。
git環境
sudo yum install -y git
etckeeper
# epelリポジトリを有効化
sudo rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# etckeeperのインスコ
sudo yum install -y etckeeper --enablerepo=epel
# etcフォルダ配下をgit管理
sudo etckeeper init
# 初期状態をコミット
sudo etckeeper commit "Initialize"
# ログ確認(qキーで抜けれます)
sudo etckeeper vcs log -p
Apacheを入れる
sudo yum install -y httpd
確認
apachectl -v
# Server version: Apache/2.4.6 (CentOS)
# Server built: Jun 27 2018 13:48:59
PHPを入れる
sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum-config-manager --enable remi-php72
sudo yum install php php-fpm
確認
php -v
# PHP 7.2.12 (cli) (built: Nov 6 2018 16:40:25) ( NTS )
# ↑2018/11/25現在
Webサーバとして公開する場所の作成
sudo mkdir -p /var/www/html
テストでなんか作ってみる
cd /var/www/html/
sudo vim index.php
↓
Vimが立ち上がるのでi
を押し、とりあえずこんな感じで入力し、
<?php
phpinfo();
Esc → :wq
とタイプ。
Apacheの設定
sudo vim /etc/httpd/conf.d/v-host.conf
を実行し、以下の情報を追加
<Directory />
Require all granted
AllowOverride All
Options -Indexes
</Directory>
<VirtualHost *:80>
ServerAdmin 自分のメアド
DocumentRoot /var/www/html/
<Directory "/var/www/html/">
AllowOverride All
</Directory>
</VirtualHost>
Apacheの起動
sudo apachectl start
php-fpmのスタート
sudo systemctl start php-fpm
とりあえずFirewallを切る
sudo systemctl stop firewalld
URLにアクセス
http://取得したIPアドレス/
↓
いい感じ。
GitLabの準備
登録は頑張って。
GitLab Runnerをサーバにインストール
このページに書かれているコマンドを実行していきます。
cd ~/
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start
GitLab RunnerにHook情報を登録
まず、トークンの確認をGitLab上で行います。
↓
次に登録を開始します。
gitlab-runner register
↑コレを実行すると対話型のやり取りが始まります。
最初の問
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
↓
https://gitlab.com/
を入力してEnter
次の問
Please enter the gitlab-ci token for this runner:
さっき確認したトークンを入力してEnter
次の問
Please enter the gitlab-ci description for this runner:
好きな説明
例:for test
次の問
Please enter the gitlab-ci tags for this runner (comma separated):
認識用のタグ(後で使うので適当に決めると後悔する)
例:testdeploy
次の問
Please enter the executor: docker-ssh, shell, virtualbox, docker+machine, docker-ssh+machine, docker, parallels, ssh, kubernetes:
shell
これで終わるかと!
.gitlab-ci.ymlを作る
.gitlab-ci.yml
ファイルをGitLabリポジトリの一番上の階層に置きます。
(.gitフォルダと一緒の階層)
中身はこんな感じ
stages:
- master
deploy:
stage: master
script:
- echo "hello!"
tags:
- さっき設定したタグ(例:testdeploy)
GitLabにPush
↓
設定が正常に反映されていると、
GitLab上に先程設定した内容が表示されていると思います。
↓
コレで準備は完了です!
GitLab CIを使ってmasterにPush(またはmerge)時にデプロイする
AWSのCode Deployのように、GitLab CIはいい感じにごにょごにょはしてくれません。
全部書かなければいけないのが、良いところでもあり悪いところでもありますね!
でもまあ、仕組みを知らずに楽するより全然いいのでやっていきましょう。
その前に、GitLabにSSHキーを登録しておいてください。
鍵の作成はgitlab-runner
ユーザで行います。(sudo su gitlab-runner
を実行してから作る)
参考:SSH認証キーをGitLabに登録・設定手順 覚書
Hook時のブランチ名が$CI_COMMIT_REF_NAME
という変数に格納されることを利用します。
.gitlab-ci.yml
ファイルを以下のように書き直します。
stages:
- master
deploy:
stage: master
script:
- if [ $CI_COMMIT_REF_NAME = 'master' ]; then
- rm -Rf ~/testdeploy/
- mkdir ~/testdeploy/
- cd ~/testdeploy/
- rm -Rf repository/
- rm -Rf site/
- mkdir repository
- mkdir site
- git clone --mirror git@gitlab.com:GitLabのURL ./repository
- cd ./repository
- git --work-tree=../site/ checkout -f master
- cd ../site/
- rsync -rlOzv --delete --checksum ./ /var/www/html/
- cd /var/www/html/
- else
- echo 'master以外なので何もしない'
- fi
tags:
- testdeploy
何やってるか……ちょっと複雑ではありますが、
GitLabからリポジトリをクローンし、変更があるファイルを全て更新していく……というbashの内容になってます。
/var/www/html
フォルダをgitlab-runner権限にする。
sudo chown gitlab-runner:gitlab-runner -R /var/www/html/
先に、鍵認証を通しておきます(known_hostにGitLabを登録しとく)
sudo su gitlab-runner
git clone git@gitlab.com:GitLabのURL
# 鍵を登録するか?と聞かれるので、yesと答える。
ついでにわかりやすいようにindex.phpも変更します
hello test!
いざ、Push!!
↓
自動デプロイ成功!!!!(index.phpの内容が変わった!)