yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

シェルスクリプトをGitlabにPushしたら自動でスクリプトを実行する環境を Docker on CentOS7/Virtualbox on Macに作成する

2021-01-30

シェルスクリプトをGitlabにPushしたら自動でスクリプトを実行する環境を
Docker on CentOS7/Virtualbox on Macに作成する

当初、Docker on Macを使おうと思ったが、が遅すぎるのでDocker on Virtualbox on Macという多重構造になった、、、

参考:DXを大幅に低下させるDocker for Macを捨ててMac最速のDocker環境を手に入れる

全体図

shellscript_gitlab_docker_centos_virtualbox_mac


  1. CentOS7をVirtualbox上に作成
  2. Docker環境を作る
  3. Gitlabコンテナ立てる
  4. Jenkinsコンテナを立てる
  5. Slack Webhook URL取得
  6. Gitlabでプロジェクトを作成
  7. Jenkinsジョブ作成
  8. 実行

CentOS7をVirtualbox上に作成

まずは、CentOS VMをVirtualbox上に作成する
VMはVagrantで自動作成する

※手動で作った時の記事:CentOS7+GUI環境を作るVagrantfile

※Macから操作する

必要プラグインをインストール
(VagrantfileからVMをリロードさせるためのプラグイン)

% vagrant plugin install vagrant-reload

適当な場所にVagrantfileを作成する

% vim Vagrantfile

Vagrantfileの中身は以下の通り

% cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provider :virtualbox do |vbox|
    vbox.name = "docker_work"
    vbox.gui = true
    vbox.memory = "8192"
  end
  config.vm.network "forwarded_port", guest: 8929, host: 8929
  config.vm.network "forwarded_port", guest: 8080, host: 8080


  config.vm.provision :shell, inline: <<-SHELL
    echo "root:password" | chpasswd
    sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config
    yum -y install vim
    yum -y upgrade grub2
    yum -y groupinstall 'GNOME Desktop'
    yum -y update
  SHELL

  config.vm.provision :reload
end

GUI環境に必要なものを一緒にインストールしている
rootのパスワードはpasswordで設定しているので、適宜変更ください

また、Macからもhttpアクセスできるようにポート設定を入れた
参考:vagrant上のdockerにapache立ててホストOSからポートフォワーディングでアクセス

同じ階層で以下のコマンドを打ってVM起動
VMなので数分かかる

% vagrant up

VM起動処理が終わったら、vagrant sshでログイン
Vagrantfileで設定したrootパスワードでrootログインできる

% vagrant ssh
[vagrant@localhost ~]$ su - root
Password:
#

ログインした後、ワークディレクトリ作っておき、その中で作業する(一応)

# mkdir jenkins_git_work
# cd jenkins_git_work/

GUIに入る時は、以下のコマンドで入ることができる
(Macのターミナルから入れないので、Virtualboxのコンソールから)

# startx

Docker環境を作る

こちらの手順を参考にVM上にDocker環境を構築する

※VM(rootユーザー)から操作する

参考:CentOS7にDocker環境を構築する

Gitlabコンテナ立てる

Docker環境まで完成したので、Gitlabコンテナを作成する

※VM(rootユーザー)から操作する

Gitlabのimageは公式イメージを使う
参考:GitLab Docker images

まずは、環境変数「GITLAB_HOME」を定義しておく

# export GITLAB_HOME=/srv/gitlab
# mkdir /srv/gitlab/

以下コマンドでdockerコンテナを作る

# docker run --detach \
>   --hostname localhost \
>   --publish 10443:443 --publish 8929:80 --publish 2224:22 \
>   --name gitlab \
>   --restart always \
>   --volume $GITLAB_HOME/config:/etc/gitlab \
>   --volume $GITLAB_HOME/logs:/var/log/gitlab \
>   --volume $GITLAB_HOME/data:/var/opt/gitlab \
>   gitlab/gitlab-ee:latest

※コピペ用

docker run --detach \
  --hostname localhost \
  --publish 10443:443 --publish 8929:80 --publish 2224:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ee:latest
当初docker-composeで作ろうと思ったが、ユーザー周りで以下のエラーが出るので、諦めた、、
参考:Dockerのvolumeでpermission deniedが発生した場合の解決法
gitlab_1   | Cleaning stale PIDs & sockets
gitlab_1   | cat: /var/opt/gitlab/gitlab-rails/VERSION: No such file or directory
gitlab_1   | cp: cannot create regular file '/etc/gitlab/gitlab.rb': Permission denied
gitlab_1   | Installing gitlab.rb config...
jenkins_git_work_gitlab_1 exited with code 1

docker-composeの場合は、以下の設定(Linux特有の問題なので、多分Macならできる)

# cat docker-compose.yml
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    environment:
      - USER_NAME
      - USER_ID
      - GROUP_NAME
      - GROUP_ID
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:80'
      - '443:443'
      - '2224:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'

コンテナ作成までは時間がかかるので、以下コマンドでログを確認できる

# docker logs -f gitlab
Thank you for using GitLab Docker Image!
Current version: gitlab-ee=13.8.0-ee.0
Configure GitLab for your system by editing /etc/gitlab/gitlab.rb file
And restart this container to reload settings.
To do it use docker exec:
  docker exec -it gitlab vim /etc/gitlab/gitlab.rb
  docker restart gitlab
For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
If this container fails to start due to permission problems try to fix it by executing:
  docker exec -it gitlab update-permissions
  docker restart gitlab
...

起動中はこの画面
git_setup

数分後、Macからアクセスできるようになった

http://localhost:8929/

パスワードを設定する
git_setup

何も設定を変えていなければrootユーザーと、先ほど設定したパスワードでログインできる
git_setup

git_setup

Jenkinsコンテナを立てる

最初はJenkins公式イメージを使おうと思ったが、
レビューにjenkins/jenkinsを使えとあったので、jenkins/jenkinsを使う

参考:jenkins/jenkins

※VM(rootユーザー)から操作する

docker runでコンテナを作成する

# docker run  --detach \
>    --publish 8080:8080 --publish 50000:50000 \
>    --name jenkins \
>    jenkins/jenkins:lts

コピペ用

docker run  --detach \
   --publish 8080:8080 --publish 50000:50000 \
   --name jenkins \
   jenkins/jenkins:lts

ログを見ると、初回ログインのパスワードが出ているので、コピーしておく
(以下の「xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx」の部分)
※直接「/var/jenkins_home/secrets/initialAdminPassword」を見てもOK

# docker logs -f jenkins
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
...

Gitlabと違って、割とすぐ1分立たずににMacからアクセスできるようになる
http://localhost:8080/

最初の画面では、先ほどコピーしたパスワードを入力して、「Continue」
jenkins_setup

こだわり無いので「Install suggested plugins」で始める
jenkins_setup

数分待つ
jenkins_setup

Username、Password、Full name、E-mail addressを設定し「Save and Continue」
jenkins_setup

Jenkins URLはすでに入力されているのでそのまま「Save and Finish」で進む
jenkins_setup

「Start using Jankins」をクリック
jenkins_setup

無事にログインできたらOK
jenkins_setup

Slack Webhook URL取得

Slackにメッセージを送るスクリプトを作るためにWebhook URLを入手する

手順は、こちら

参考:Slack Webhookを使ってコマンドラインからSlackメッセージを送る

Gitlabでプロジェクトを作成

GitlabでJenkinsと紐づけるプロジェクトを作成する

※Gitlab UI(http://localhost:8929/)から操作する

「New project」をクリック
git_push

「Create blank project」
git_push

Project nameを指定して、あとはデフォルトのまま「Create project」

※「You won’t be able to pull or push repositories via SSH until you add an SSH key to your profile」
と出てくるが、SSHではなく、HTTPで通信するのであれば不要なので無視
参考:git gitlab の初期設定について

これでProjectができた
git_push


次にGitlabクライアント側の設定
※VM(rootユーザー)から操作する

Gitクライアントのインストール

 
# yum -y install git
...
Complete!

Gitlab初期設定

# git config --global user.name "Administrator"
# git config --global user.email "admin@example.com"

作成していたリポジトリをVM上にダウンロード

# git clone http://localhost:8929/root/slack_test.git
Cloning into 'slack_test'...
warning: You appear to have cloned an empty repository.
[root@localhost jenkins_git_work]# ls
slack_test
[root@localhost jenkins_git_work]#

ダウンロードしてきたリポジトリの中へ移動し、スクリプト(slack_test.sh)を置く

# cd slack_test
# vim slack_test.sh

スクリプトの中身はSlackのWebhook URLを作る際にコピーしたものそのまま貼る

#!/bin/bash

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxx

作成したスクリプトをGitlabにプッシュしておく
ユーザー名とパスワードが聞かれるので、Gitlabし設定したパスワードを入れる

# git add slack_test.sh
# git commit -m "first commit"
# git push origin master
Username for 'http://localhost:8929': root
Password for 'http://root@localhost:8929':
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 376 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://localhost:8929/root/slack_test.git
 * [new branch]      master -> master
#

先ほどのページをリロードすると、Pushしたスクリプト(slack_test.sh)が表示される
git_push

クリックすると中身も確認できる
git_push

Jenkinsジョブ作成

Jenkinsで「Gitにプッシュされたらスクリプトを実行する」というJobを作成し、Jobを動かしてみる

※Jenkins UI(http://localhost:8080/)から操作する

「Create a job」からJobを作成
jenkins_config

Jobの名前を入力し、「Freestyle project」> 「OK」
jenkins_config

「General」タブの設定
「GitHub project」にチェックを入れ、「Project url」を入力する
Project urlは、Gitlabの画面からコピペできるが、ホスト名はlocalhostではなくGitlabコンテナのIPアドレスが入ることに注意

http://【GitlabコンテナのIP】/【Gitlabのユーザー名】/【プロジェクト名】.git

jenkins_config

GitlabコンテナのIPアドレスは以下のコマンドで調べることができる
※VMにて操作

# docker inspect gitlab | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

「Source Code Management」タブの設定
「Git」のラジオボタンをクリックし、Repository URLを入力
先ほど「General」タブで入力した「Project url」を入れる
※ここで正しく入力されないとエラーが出る
jenkins_config

「Build Triggers」タブの設定
「Poll SCM」にチェックを入れ、スケジュールの設定
いつでも良いので「*****」を入力する
jenkins_config

「Build」タブの設定
GitにPushしたシェルスクリプトを実行するスクリプトを書く
※chmnod777にしないと「./slack_test.sh: Permission denied」となってしまった
最後に「Save」を押して終了

chmod 777 ./slack_test.sh
./slack_test.sh

jenkins_config

実行

ここまでで構築設定が完了したので、設定したジョブがきちんと動くか実行する
※VM(rootユーザー)から操作する

スクリプトに適当に変更を加えて再度プッシュする
(以下はダミーのコメントを追加しているだけ)

# echo \#dummy >> slack_test.sh
# git add slack_test.sh
# git commit -m "dummy"
[master 3d8ea00] dummy
 1 file changed, 1 deletion(-)
# git push origin master
Username for 'http://localhost:8929': root
Password for 'http://root@localhost:8929':
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 271 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://localhost:8929/root/slack_test.git
   36c3b06..3d8ea00  master -> master

しばらくすると、Jenkinsの画面でジョブが実行されている様子がわかる
jenkins_config

ジョブが完了すると、
無事にPushをトリガーに、スクリプトが動いてSlackにメッセージが送られた!
jenkins_config

以上。