やりたいこと
- GitLabのmasterブランチにpushすると、自動的にXServerの特定のフォルダにアップロードする
- GitLabのmaster以外のブランチにpushすると、XServerにフォルダを作ってアップロードする
やりかた
GitLab CIを使ってpushしたときにスクリプトを実行する。
XServerにgitは入れず、rsyncでファイル同期を行う。
下準備
SSH接続用の鍵を生成する
$ ssh-keygen -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[ユーザー名]/.ssh/id_rsa): /Users/[ユーザー名]/Decktop/gitlab
(Windowsなら「C:/Users/[ユーザー名]/Desktop/gitlab」)(保存場所、ファイル名を指定する。他の場所を指定しても良い。)
Enter passphrase (empty for no passphrase): (何も入力せずにEnter)
Enter same passphrase again: (何も入力せずにEnter)
Your identification has been saved in /Users/[ユーザー名]/.ssh/gitlab.
Your public key has been saved in /Users/[ユーザー名]/.ssh/gitlab.pub.
The key fingerprint is:
SHA256:*******************************************
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| |
| |
| |
| |
| |
| |
| |
+----[SHA256]-----+
公開鍵を登録
↑すでにONになっている場合は、飛ばしてOK
生成した公開鍵(gitlab.pub)を開き、中身をコピペ。
すでに登録されている場合は、改行区切りで追記する。
秘密鍵を登録
生成した秘密鍵(gitlab)を開き、中身をコピペ。
青で示したところは、特定のブランチなどのみで秘密鍵が使えるようにするときはON、全てのブランチで使用できるようにするときはOFFにする。
ONにしたときは、対象のブランチを「保護ブランチ」として指定する。詳しくはこちら
GitLab CI の設定
gitリポジトリのルートに「git-ci.yml」をおいて、以下を記述。
variables:
STAGE_HOST: [サーバーID].xsrv.jp
STAGE_USER: [サーバーID]
STAGE_PATH: /home/[サーバーID]/[ドメイン名]/public_html/[アップロード先のフォルダまでのパス]
STAGE_REVIEW_PATH: $STAGE_PATH-$CI_COMMIT_REF_SLUG
# $CI_COMMIT_REF_SLUGはブランチの名前を表す
# ここでは、本番用のディレクトリと同じ場所にレビュー用のディレクトリを作成する
# $STAGE_PATH/$CI_COMMIT_REF_SLUGにすれば、本番用のディレクトリの中にレビュー用のディレクトリが作成される
stages:
- review
- deploy
review_start:
stage: review
before_script:
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- touch ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh-keyscan -p 10022 $STAGE_HOST >> ~/.ssh/known_hosts
# ここまで、SSH接続用の鍵の取得。
# 秘密鍵を設定したときに「Protect Variable」をONにした場合、
ブランチが保護ブランチでないと秘密鍵が取得できないので注意
- apt-get update
- apt-get install -y rsync
script:
- ssh -p 10022 $STAGE_USER@$STAGE_HOST mkdir -p "$STAGE_REVIEW_PATH"
# アップロード先のディレクトリを作成する
- time rsync -av --exclude='.gitlab-ci.yml' --exclude='.git/' -e "ssh -p 10022" --delete --checksum ./ $STAGE_USER@$STAGE_HOST:"$STAGE_REVIEW_PATH"
# 実際にファイルを転送するコマンド
# 「.gitlab-ci.yml」と「.git/」は除外する
# timeはかかった時間を出力するコマンド。不要ならrsyncから書く。
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://[ドメイン名]/[アップロード先のフォルダまでのパス]-$CI_COMMIT_REF_SLUG
# XServerへアクセスするURL
# httpsに対応していないのであればhttp
on_stop: review_stop
rules:
- if: '$SSH_PRIVATE_KEY && $CI_COMMIT_REF_NAME!="master" && $CI_COMMIT_MESSAGE=~/^review.*/'
# 秘密鍵が取得可能で、ブランチの名前が「master」でなく、コメントが「review」から始まる場合に実行する
review_stop:
stage: review
variables:
GIT_STRATEGY: none
before_script:
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- touch ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh-keyscan -p 10022 $STAGE_HOST >> ~/.ssh/known_hosts
script:
- ssh -p 10022 $STAGE_USER@$STAGE_HOST rm -r "$STAGE_REVIEW_PATH"
# アップロード先のディレクトリを削除する
interruptible: true
# 中断可能(このジョブが実行される前に他のpushがあったら中断)
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
rules:
- if: '$SSH_PRIVATE_KEY && $CI_COMMIT_REF_NAME!="master" && $CI_COMMIT_MESSAGE=~/^review.*/'
when: manual
# 手動(自動では実行しない)
deploy:
stage: deploy
before_script:
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- touch ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh-keyscan -p 10022 $STAGE_HOST >> ~/.ssh/known_hosts
- apt-get update
- apt-get install -y rsync
script:
- time rsync -av --exclude='.gitlab-ci.yml' --exclude='.git/' -e "ssh -p 10022" --delete --checksum ./ $STAGE_USER@$STAGE_HOST:$STAGE_PATH
rules:
- if: '$SSH_PRIVATE_KEY && $CI_COMMIT_REF_NAME=="master"'
カスタマイズ
以下の記事を参考にしてください。
GitLab CI/CDパイプライン設定リファレンス(日本語訳:GitLab CI/CD Pipeline Configuration Reference)
GitLab CI/CD Variables を翻訳しました。
参考にした記事
.gitlab-ci.yml ジョブ事例集
【Review Apps】GitLab CI を使って、自動デプロイ・自動レビュー環境作成を実現する
GitLab CI/CDパイプライン設定リファレンス(日本語訳:GitLab CI/CD Pipeline Configuration Reference)
GitLab CI/CD Variables を翻訳しました。