GitLabのCI/CDでらくらくスケジューリング


## はじめに

スケジューリングされた処理の実装・・・例えば「毎日動いて売上計上するバッチ作ろう」ありふれたお話です。
しかし、実際作るとなると
・どこで動かす？
・何を使ってスケジューリングする？
は常について回りますよね。
この記事ではそれらを解決してくれる
「GitLab のCI/CDを用いたスケジューリング」
についてご紹介します。

- GitLabを最近使い始めて、機能について知りたい方
- GitLabでソース管理を行っていて、スケジューリングされたバッチ処理を実装してみたい方

を主な対象としています。

## 必要なもの

- GitLabがインストール済み、使用可能な状態のサーバー

## GitLab CI/CDについて
GitLabは広く使われているプロジェクト管理ツールの一つですが、ソース管理以外にも多くの機能を持っています。
そのうちの一つがGitLab CI/CDです。

> GitLab CI/CDはGitLabに組み込まれた強力なツールで、サードパーティ製のアプリケーションやインテグレーションを必要とせず、すべての継続的な開発手法（継続的インテグレーション、デリバリー、デプロイメント）をソフトウェアに適用できます。
https://gitlab-docs.creationline.com/ee/ci/introduction/

Q.CI/CDとか継続的な開発手法って何？（初見時の私)
A.ざっくり言うと「アプリケーションに変更が加わると、その都度、自動でテストを行いリリース可能な状態に揃える・・・」といった開発手法のことです。

GitLab CI/CDはその名の通り、この開発手法をサポートするGitLabの機能で、
「ジョブ」　（コードのコンパイルやテストなどといった、処理内容の定義）
「ステージ」（実行タイミングの定義）
からなる「パイプライン」と呼ばれる単位で処理を実行していきます。


## Hello,World! してみよう
（GitLabがインストールされているサーバーが既にある前提です。 ない場合、新しく用意する必要があります）

まず新しいプロジェクトを作成しましょう。

![0748273066a9a556ca9f339296a54013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/ed9445da-e7bc-6c1a-8e8e-8f04cee1da23.png)


作成したらgit cloneしてローカルへ持ってきます。

git cloneしましたら、まず"Hello,World"を出力させてみましょう。

プロジェクトルートに「gitlab-ci.yml」を作成し、下記のように記述します。

```
# パイプラインを動作させるイメージを指定する。
# 今回は文字を出すだけなのでとりあえずalpine
image: alpine

# ジョブの設定
# ジョブ名>ステージ、実行内容・・・といった構造
hello-world-job:
  stage: build
  script:
    - echo "Hello, World!"
```

作成したら、コミット→プッシュしましょう。

プッシュし終わったら、ジョブが実行されているかを確認しましょう。

GitLabの左メニューから、CI/CD→Jobs を選択します。

![22a58a2e2303ca4be618c491a78df367.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/3bcc97bb-689d-10e7-9fe9-ed12c2902a79.png)


すると設定した通り、hello-world-jobという名前のジョブが実行され、Passed（成功）ステータスになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/7a00cc6f-598b-1c66-647b-f3b38b39a9f2.png)

ジョブを選択すると、実行内容を確認することが出来ます。

![98892ba8f04e823479dc98559d7b6511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/606b44e9-d010-8e2a-cd71-baa09e8fb3ac.png)


Dockerイメージの構築などを経て、最終的に echo "Hello,World!"が実行されていることが確認できればOKです。


## スケジュールを設定する
現在の設定では、hello-world-jobは「プッシュされたタイミングで実行」されます。
実行タイミングを変更したい場合、「rules」キーワードを追記することで対応します。

まずgitlab-ci.ymlのhello-world-jobに、rulesを追記します。

```
image: alpine

hello-world-job:
  stage: build
  # CI_PIPELINE_SOURCEの値をチェックする。
　　　　# パイプラインがスケジュールで呼ばれた時にのみジョブが実行される。
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule"
  script:
    - echo "Hello, World!"

```

次に、GitLabのCI/CDにスケジュールを設定します。
CD/CI > Schedulesを選択し、「create new schedule」を押下しましょう。
するとスケジュールの設定画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/bc696066-90b7-62df-c814-d81820fad757.png)


設定項目は以下の通りですので、今回は「毎時10分ごと」で設定しましょう。

- Description: 説明文。
- Interval Pattern: 間隔の設定。 「Custom」の場合はCronの記法で指定する。
(参考：https://qiita.com/nemutas/items/3f5816eabbf0eda5e6a9)
- Cron Timezone: タイムゾーンの設定。 今回はTokyoを選択している。
- Target Branch: 実行対象のブランチを指定している。
- Variables: 環境変数を定義できる。 時間以外にも条件を設けたい場合などに使用できるが、今回は設定しない。
- Activated: 有効か無効かを切り替えられる。

スケジュールを設定すると、スケジュール一覧に追加され次回の実行時間などが確認できるようになります。
動確が必要な場合などは、▶︎ボタンを押下することで直ちに実行させることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/bd1ff563-21c1-9122-8b88-19d996a60e69.png)

設定が終わったら再度プッシュします。
プッシュしてもジョブが実行されないことを確認してください。

これで、10分ごとに任意のスクリプトを実行する処理が実装できたことになりますね。

しばらく置いて、10分ごとにジョブが実行されていることを確認できたら完了です。
お疲れ様でした！

![229c74ecd359fd41cd9b0e9aec4a4ddb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952529/89e16cfe-fa0c-9441-c4b3-98a4e711653b.png)


## おわりに
実行するスクリプトを変えれば、バッチ処理や定期的なテストなどを簡単に実装できます。
GitLab CI/CDでは今回ご紹介した内容以外にも細やかな設定が可能なので、今後も追っていき、実際にバッチ実装・運用もしていきたいところです！