<目次>
以下を構築する。また、リポジトリをMainにマージする際、GitlabPagesで静的なページを作成し公開する。
- Gitlab
- Gitlab Runner
手順作成はEC2インスタンス構築から、レポジトリのMainへのマージによりGitlabPagesでトップページが参照できるところまでとする。
インターネットに接続した環境で動作検証を行っているため、インターネットを経由しての構築・運用を前提とする。
EC2インスタンス上に環境を構築する。
AWSは管理者権限を所有したユーザ、GitlabやGitlabRunnerの作業は管理者権限のrootで行う。
クライアントPCからGitlab、GitrabPagesの名前解決ができることとする。
以下のテーマを使用する。
https://github.com/alex-shpak/hugo-book
GitlabやGitlabPages、Runner特有の設定にフォーカスした手順を提示する。
手順の中にEC2へのログイン、gitやgitlabの使用方法、terraformやansibleを使用する際のクライアント設定方法等は含まない。
たとえば、EC2へのログインは秘密鍵を使ってsshクライアントから接続するような方法があるが、そのような作業手順は対象外としている。
可能な限りterraformやansibleを利用し、環境構築の自動化を図る。
以下のEC2を構築する。
- リージョン:ap-northeast-1
- EC2インスタンス:t3.large
- AMI:GitlabのAMIを使用
- Gitlab,Gitlab runnner:14.8.2-ee
以下より4 cores、4GBメモリが必要とのことなので余裕を持ってt3.largeを選択
GitLab installation minimum requirements | GitLab
このリポジトリをcloneする。
terraform
ディレクトリに移動し、以下のコマンドを入力する。
terraform init
terraform plan
terraform apply -auto-approve
参考:環境の削除コマンド
なお、以下のコマンで構築したEC2を含めてVPCなどを削除する。
terraform destroy -auto-approve
Marketplaceに登録していないと、指定しているAMIを利用できない可能性がある。AMIの指定でエラーになる場合は、Marketplaceに登録すること。
terraformのapplyを実行すると、以下のメッセージが表示される。
省略
instance_id = "i-050d6e5dea47c0196"
public_dns = "ec2-13-230-166-17.ap-northeast-1.compute.amazonaws.com"
server_public_ip = "13.230.166.17"
出力結果にEC2インスタンスのID、public dns、IPアドレスが表示されるのでメモる。それぞれの使用用途は以下となる。
- instance_id・・・Gitlabのrootパスワードに使用する
- public_dns・・・後に出てくるpages_external_urlに使用する
- IPアドレス・・・GitlabのログインURLやansibleのEC2のログイン時に使用する
URLに上記のIPアドレスを指定し、HTTPでログイン画面を開く。
例:http://xxx.xxx.xxx.xxx
ユーザIDとパスワードは以下を入力する。
- ユーザー:root
- パスワード:上記でメモしたインスタンスID
admin > Runnersから「Register an instance runner」のボタンでからtokenをコピーする。
ansible
ディレクトリに移動する。
以下のように書き換える
hosts
に記述されている対象ホストのIPアドレス及びreg_tokenを書き換える。
[targethost]
13.230.166.17 ←書き換える
[targethost:vars]
reg_token=ipeyyPiyijD7f8-Zi3mj ←書き換える
ansible_ssh_port=22
・・・
省略
以下のコマンドでansibleのplaybookを起動する。
このplaybookにより、Gitlab Runnerがインストールされる。また、GitlabとGitlab Runnerを関連づける。
ansible-playbook -i hosts site.yml
ansibleでのログインが最初のログイン時、以下のように接続有無をを聞かれる。yesを入力する。
Are you sure you want to continue connecting (yes/no)?
sshでEC2にログインする。sshコマンドは以下を参考にして、適宜書き換える。
ssh -i /etc/ansible/pemfile/radio.pem [email protected]
GitlabPagesを有効にするため、以下を編集する。
/etc/gitlab/gitlab.rb
external_urlは以下のようにホスト部分をIPアドレスに書き換える。httpの最後の/(スラッシュ)
は不要。
external_url "http://13.230.166.17"
Gitlab Pagesに関連する定義として、以下を追記する。pages_external_url
はメモしていたFQDN形式で記述する。
pages_external_url "http://ec2-13-230-166-17.ap-northeast-1.compute.amazonaws.com"
gitlab_pages['enable'] = true
gitlab_pages['dir'] = "/var/opt/gitlab/gitlab-pages"
gitlab_pages['log_directory'] = "/var/log/gitlab/gitlab-pages""
編集した内容を以下のコマンドで有効にする。
sudo gitlab-ctl reconfigure
なお、このコマンドの反映には時間がかかる。
プロンプトが返ってきても、Gitlabのページにアクセスできない場合がある。プロンプトが返った後でも5分程度は待つこと。
Hugoのドキュメント構成である以下のリポジトリをコピーする。
import project > Repo by URL
https://github.com/yamadatt/gitlabmydoc
コピーしたリポジトリのconfig.tomlについて、baseURLを以下の形式に書き換える。
baseURL = 'http://root.ec2-13-230-166-17.ap-northeast-1.compute.amazonaws.com/gitlabmydoc/'
以下の形式でページが作成されるため、ブラウザでアクセスする。
http://root.ec2-13-230-166-17.ap-northeast-1.compute.amazonaws.com/gitlabmydoc/
DNSのワイルドカード機能を使用できない場合は、クライアントのhostsに記述する。
動作確認をした環境は以下。
cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
aws --version
aws-cli/1.14.28 Python/2.7.5 Linux/3.10.0-693.21.1.el7.x86_64 botocore/1.8.35
terraform --version
Terraform v1.1.3
on linux_amd64
$ ansible --version
ansible 2.10.9
config file = None
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
このリポジトリのCIはGitHub actionsを使用している。(actionsのタブを参照)
terraformはvalidを含めて、initとplan。applyを入れればCDまでは可能。
ansibleはlintを使用。
CIの発火はmainへのマージのタイミングとしている。
GitHub runnerについて、使用しているansibleのバージョンが古くモジュールを使用できないため冪等になっていない。
ansibleを複数回実行すると、sharedのランナーが複数構築される。複数構築されたら場合は、手動で削除する。
from anyで80番ポートに通信許可している。
また、sshはterraformを起動したpcのグローバルipアドレスにfromを制限している。(ある人はsshできるが、他の人がsshできないという場合はこれを疑うこと)
鍵ペアのファイルを以下で設定した場所に格納する。
下の例だと、/etc/ansible/pemfile/radio.pem
ansible_ssh_private_key_file=/etc/ansible/pemfile/radio.pem
キーペアは事前に作成しておく
ここではradioという名前で作成している。
ダウンロードしたキーファイルはchmod 600
しておく。