シェルスクリプトをGitlabにPushしたら自動でスクリプトを実行する環境を Docker on CentOS7/Virtualbox on Macに作成する
シェルスクリプトをGitlabにPushしたら自動でスクリプトを実行する環境を
Docker on CentOS7/Virtualbox on Macに作成する
全体図
- CentOS7をVirtualbox上に作成
- Docker環境を作る
- Gitlabコンテナ立てる
- Jenkinsコンテナを立てる
- Slack Webhook URL取得
- Gitlabでプロジェクトを作成
- Jenkinsジョブ作成
- 実行
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ユーザー)から操作する
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の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 ...
起動中はこの画面
数分後、Macからアクセスできるようになった
パスワードを設定する
何も設定を変えていなければrootユーザーと、先ほど設定したパスワードでログインできる
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」
こだわり無いので「Install suggested plugins」で始める
数分待つ
Username、Password、Full name、E-mail addressを設定し「Save and Continue」
Jenkins URLはすでに入力されているのでそのまま「Save and Finish」で進む
「Start using Jankins」をクリック
無事にログインできたらOK
Slack Webhook URL取得
Slackにメッセージを送るスクリプトを作るためにWebhook URLを入手する
手順は、こちら
参考:Slack Webhookを使ってコマンドラインからSlackメッセージを送る
Gitlabでプロジェクトを作成
GitlabでJenkinsと紐づけるプロジェクトを作成する
※Gitlab UI(http://localhost:8929/)から操作する
「New project」をクリック
「Create blank project」
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ができた
次に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)が表示される
クリックすると中身も確認できる
Jenkinsジョブ作成
Jenkinsで「Gitにプッシュされたらスクリプトを実行する」というJobを作成し、Jobを動かしてみる
※Jenkins UI(http://localhost:8080/)から操作する
「Create a job」からJobを作成
Jobの名前を入力し、「Freestyle project」> 「OK」
「General」タブの設定
「GitHub project」にチェックを入れ、「Project url」を入力する
Project urlは、Gitlabの画面からコピペできるが、ホスト名はlocalhostではなくGitlabコンテナのIPアドレスが入ることに注意
http://【GitlabコンテナのIP】/【Gitlabのユーザー名】/【プロジェクト名】.git
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」を入れる
※ここで正しく入力されないとエラーが出る
「Build Triggers」タブの設定
「Poll SCM」にチェックを入れ、スケジュールの設定
いつでも良いので「*****」を入力する
「Build」タブの設定
GitにPushしたシェルスクリプトを実行するスクリプトを書く
※chmnod777にしないと「./slack_test.sh: Permission denied」となってしまった
最後に「Save」を押して終了
chmod 777 ./slack_test.sh ./slack_test.sh
実行
ここまでで構築設定が完了したので、設定したジョブがきちんと動くか実行する
※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の画面でジョブが実行されている様子がわかる
ジョブが完了すると、
無事にPushをトリガーに、スクリプトが動いてSlackにメッセージが送られた!
以上。