Gitlab CI + Gitlab Runner + Java のCI/CD環境をDockerで作ってみた


# 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 が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/92b07e59-e9f4-8527-b265-fbcfbfdf1641.png)

> 引用：[GitLabの継続的インテグレーション(CI)と継続的デリバリー(CD)](https://www.gitlab.jp/stages-devops-lifecycle/continuous-integration/)

---

## 概要図

1つのDocker-Machineに、GitlabもGitlabRunnerも載せて作成していきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/1ecc3aad-4a4d-8796-347a-ca458c73a785.png)

---

## 構築手順

---

### Docker-Machineの作成

Gitlab/Gitlab Runnerを入れるための仮想マシンを作成していきます。

```bash

# 現在の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コンテナの立ち上げ

```bash
# 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エラー画面が出ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/40945a64-12ba-c539-cb41-423719923bdf.png)


---

### Gitlab root初期パスワードを設定してログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/6f1ee4e9-0f17-9d97-9e73-3208381b660c.png)

- rootアカウントでログインします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/b1005090-a913-6284-6284-629396e67287.png)

- ログインができました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/a5185693-550b-b871-9b85-3fb3dfa8f11b.png)

---

### Gitlab 任意のプロジェクトを作成、Tokenを取得

- 任意のプロジェクトを作成しておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/5393593c-b65a-245e-0b79-6c7ff1148b9f.png)

- 作成したプロジェクトトップ画面から、Settings>CI/CD>Runners>Specific Runnersを開きトークンを控えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/489eb19e-08eb-9980-729d-ce116d189803.png)

---

### Gitlab-Runnerをインストール/セットアップ

```bash
# 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をバックグラウンドで起動しておく

```bash
sudo gitlab-runner run &
```

---

### Gitlab CI設定

- ActivateされたRunnerが存在することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/30aa5e00-2649-b035-3fe2-aea69f5de6d9.png)

- ✐マークを押下して、Runnerの編集を行う
    - Run untagged jobs：Indicates whether this runner can pick jobs without tags　にチェックをつけて保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/3419cd03-fb77-41fd-e928-de62c289fd5b.png)


---

### シンプルなJavaプロジェクトをプッシュ！

- 今回はシンプルなGradleプロジェクトを作成して、`.gitlab-ci.yml`を追加しプッシュします

- `Javaプロジェクト`のサンプルはこちらを参照して下さい。
    - cloneだとremoteとつながってしまうのでZipでダウンロードして試していただければと思います。
    - [gitlab-ci-java-sample](https://github.com/tutttuwi/gitlab-ci-java-sample)

- `.gitlab-ci.yml`は`stages`を一般的な構成に区切ってみます
    - gradleはWrapperを使用します。実行権限がないため明示的にbashで起動しています。
    - 単体テスト（`unit_test`）,結合テスト（`integration_test`）でgradleからテストを起動しています。
    - `build`,`deploy`は空回しにしてます

```yml:.gitlab-ci.yml
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してみます

```bash

# Javaプロジェクト配置ディレクトリに移動しておきます
cd # Javaプロジェクト配置ディレクトリ
pwd

# gitlabにpushします
git add .
git commit -m "initial commit"
git push

```

---

### Gitlabコンソール確認

- 実行中

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/9e26cb20-fbdc-0b22-e586-c37505709f65.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/89b23d79-1a71-76cf-a617-311134178215.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/75a22573-22f9-b67c-3c57-915f45fecc84.png)

※初回はopenjdkのDockerイメージをpullする時間がかかります。


- うまく流れています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108839/857d1bcd-8040-8780-076e-81c90ccfed93.png)

- `deploy_prd`のみ手動実行にしているため待ちになっています。

---

### まとめ

- これでGitlabのCI/CDのテスト実行が完了しました！

実際に運用する際は、Dockerイメージではない場合が多いのかなと思います。
また、アカウント登録用のメール設定など他にもすべきことがありますが、
いったんはパイプラインが無事流せたということで、、勉強になりました。