Gitlab CI/Runner + Java のCI/CD環境をDockerで作ってみた
Gitlab CI 環境をJavaで構築してみたくて試してみました
今回はできるだけ簡単に作りたくて、ローカルのWindowsのDocker上に全部建てしました
動作環境
- OS: Windows10 Home
- ソフトウェア:
- DockerToolBox
- VirtualBox
Gitlab CIとは
Gitlabに統合されているCI/CDの仕組み
動作させるためには、ビルドアプリケーションであるGitlab-Runnerを別サーバにインストールして、
GitlabとAPI連携させる必要があります。
テストを実行するためには、少なくとも、 1つの GitLabサーバー と1つの GitLab Runner が必要です。
概要図
1つのDocker-Machineに、GitlabもGitlabRunnerも載せて作成していきます
構築手順
Docker-Machineの作成
Gitlab/Gitlab Runnerを入れるための仮想マシンを作成していきます。
# 現在のDocker-Machineの状態を確認
docker-machine ls
# Docker-Machine生成 メモリとCPUをデフォルトより多めにとっておく
docker-machine create gitlab-ci-vm \
--virtualbox-cpu-count "2" \
--virtualbox-memory "3072"
# 作成したDocker-Machineが存在することを確認
docker-machine ls
# 作成したDocker-MachineのIPアドレスを取得して、控えておく
docker-machine ip gitlab-ci-vm
# 作成したDocker-MachineをActiveにしておきます(任意)
## Activeにしておけば、Docker-MachineにSSHで入らなくてもActiveなMachine上でDockerコマンドが扱えます。お好みで
eval $(docker-machine env gitlab-ci-vm)
# 作成したDocker-MachineがActiveであることを確認
docker-machine ls
Gitlabコンテナの立ち上げ
# Docker-MachineにSSH接続
docker-machine ssh gitlab-ci-vm
# Gitlabコンテナでマウントするディレクトリを作成しておく
sudo mkdir /srv
sudo mkdir /srv/gitlab
sudo mkdir /srv/gitlab/config
sudo mkdir /srv/gitlab/logs
sudo mkdir /srv/gitlab/data
# ディレクトリが作成されていることを確認
ls -lR /srv
# Gitlabコンテナの立ち上げ(Hostネットワークで起動します)
## 控えていたIPアドレスを設定する
docker run --detach \
--network host \
--hostname xxx.xxx.xxx.xxx \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
# ここでしばらく待ちます.... 5分くらい?
- 完全に立ち上がったら、ローカルのブラウザで接続確認
- http://xxx.xxx.xxx.xxx ※起動しているDocker-MachineのIPアドレスを指定
- 完全に立ち上がる前にアクセスした場合、接続できない、またはGitlab上で502エラー画面が出ます
Gitlab root初期パスワードを設定してログイン
- rootアカウントでログインします
- ログインができました
Gitlab 任意のプロジェクトを作成、Tokenを取得
- 任意のプロジェクトを作成しておきます
- 作成したプロジェクトトップ画面から、Settings>CI/CD>Runners>Specific Runnersを開きトークンを控えます
Gitlab-Runnerをインストール/セットアップ
# Binaryダウンロード
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm"
# ダウンロードしたモジュールをインストール
sudo rpm -i gitlab-runner_amd64.rpm
# セットアップ
sudo gitlab-runner register
> prompt
url : http://xxx.xxx.xxx.xxx/
token: ※Gitlabで控えたTOKEN
description : test
tag : test
runner : docker
image : openjdk:latest
Gitlab-Runnerをバックグラウンドで起動しておく
sudo gitlab-runner run &
Gitlab CI設定
- ActivateされたRunnerが存在することを確認
- ✐マークを押下して、Runnerの編集を行う
- Run untagged jobs:Indicates whether this runner can pick jobs without tags にチェックをつけて保存
シンプルなJavaプロジェクトをプッシュ!
今回はシンプルなGradleプロジェクトを作成して、
.gitlab-ci.yml
を追加しプッシュします-
Javaプロジェクト
のサンプルはこちらを参照して下さい。- cloneだとremoteとつながってしまうのでZipでダウンロードして試していただければと思います。
- gitlab-ci-java-sample
-
.gitlab-ci.yml
はstages
を一般的な構成に区切ってみます- gradleはWrapperを使用します。実行権限がないため明示的にbashで起動しています。
- 単体テスト(
unit_test
),結合テスト(integration_test
)でgradleからテストを起動しています。 -
build
,deploy
は空回しにしてます
image: openjdk:latest
variables:
# if you should define env variables
ENVIRONMENT: DEFAULT
cache:
# if you should shared file across jobs
stages:
- unit_test
- integration_test
- build
- deploy
unittest:
stage: unit_test
script:
- bash gradlew test
integrate_test:
stage: integration_test
script:
- bash gradlew test
services:
variables:
ENDPOINT_URL: http://localhost
build:
stage: build
script:
- bash gradlew jar
artifacts:
paths:
- build/libs/test-project.jar
deploy_dev:
stage: deploy
script:
# you should write any code to deploy develop environment.
- echo dummy script
only:
- develop
environment:
name: develop
deploy_prd:
stage: deploy
script:
# you should write any code to deploy production environment.
- echo dummy script
only:
- master
when: manual
environment:
name: production
JavaプロジェクトをGitlab環境にPushしてみます
# Javaプロジェクト配置ディレクトリに移動しておきます
cd # Javaプロジェクト配置ディレクトリ
pwd
# gitlabにpushします
git add .
git commit -m "initial commit"
git push
Gitlabコンソール確認
- 実行中
※初回はopenjdkのDockerイメージをpullする時間がかかります。
- うまく流れています!
-
deploy_prd
のみ手動実行にしているため待ちになっています。
まとめ
- これでGitlabのCI/CDのテスト実行が完了しました!
実際に運用する際は、Dockerイメージではない場合が多いのかなと思います。
また、アカウント登録用のメール設定など他にもすべきことがありますが、
いったんはパイプラインが無事流せたということで、、勉強になりました。