はじめて動いているCICDを見て感動した👏 at Gitlab

## CICDがよくわかってなかった🤔
いままでの私の中のCICDのイメージといえば、
「なんかいい感じに自動でリリースしてくれるやつでしょ～、しらんけど🥱」
くらいの、ただただ便利なナニカっていうイメージでしかなく、
恥ずかしながら、実際に動いているところ、実際にどんな感じで書いているのかなど何も知りませんでした。

少し前に「GitLabでCICD組んでみてよ～」とのことで、知ってる子に教えてもらいながら、いろいろ組んで動いているものをはじめて目の当たりにしました。
からっぽなイメージがだいぶクリアなイメージになって、「まじですごい」ってなることが多かったです。

Qiitaにいる大多数のみんなは、CICDなんて当たり前じゃんって方が多いかもですが、
今回はGitlabのCICDがどんなもんで*どんな画面で動くのか*だけ、簡単にお話ししたいと思います。
少しでもCICDのイメージがクリアになって、GitLabなどで試してみようかな～って思ってもらえると嬉しいです。

## 目次

* [CICDって？gitlabで結局何ができんの？](#cicdってgitlabで結局何ができんの)
* [.gitlab-ci.ymlにはどんなこと書くの？](#gitlab-ciymlにはどんなこと書くの)
* [動いたらどんなかんじになるの？](#動いたらどんなかんじになるの)
* [いろいろつくってみて思ったこと](#いろいろつくってみて思ったこと)
* [おしまい](#おしまい)


## CICDって？gitlabで結局何ができんの？
なんなんでしょう？ChatGPTに聞いてみました。
<img width="400"
 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/a0523790-0db1-d2bb-e0c2-9c41abf7b912.png">

**開発者がコードを書いたら、その変更を迅速かつ自動的にビルド、テストし、本番環境にデプロイできる仕組み**だそうです。

この仕組みは色んなサービスで整えることができますが、
gitlabだと、`.gitlab-ci.yml`という命令書にビルドテストデプロイをしてね～って書くと、gitlabくんはそれを見て書いてある命令を実行してくれて、CICDができたね～ってなる感じだとおもっています。

## .gitlab-ci.ymlにはどんなこと書くの？
どんな時に、何をするのかなどなどいろいろ書けます！

例
* コミットしたら、lintかけて規約に違反してないかチェックさせる
* マージリクエスト作成したら、単体テストを実行させる
* mainのブランチにマージされたら、デプロイして、本番環境更新しちゃう

いろんな命令を`.gitlab-ci.yml`にごにょごにょ書くわけですが、雰囲気はdockerfileに似てる感じでした。

### ymlに何がかいてあんのか
GitlabCIのHelloWorldサンプルを持ってきました。
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/24bdb5f4-3f37-c695-4f80-206d9320d6dc.png">

``` yml
stages:        # ステージ一覧 この順番で実行される
  - build
  - test
  - deploy

build-job:   
  stage: build        # buildステージで実行されるジョブ
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."

unit-test-job:   
  stage: test        # testステージで実行されるジョブ
  script:
    - echo "Running unit tests... This will take about 60 seconds."
    - sleep 60
    - echo "Code coverage is 90%"

lint-test-job:  
  stage: test        # testステージで実行されるジョブ（unit-test-jobと並列で実行）
  script:
    - echo "Linting code... This will take about 10 seconds."
    - sleep 10
    - echo "No lint issues found."

deploy-job:     
  stage: deploy      # testステージで実行されるジョブ
  script:
    - echo "Deploying application..."
    - echo "Application successfully deployed."

  ```
### ジョブとかステージとかってなんだい
ymlにコメント書きましたが、ジョブとかステージとか単語が出てきますが、こんなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/12bf0856-a2f8-39f3-b274-7b0c0700db4a.png)

#### ステージ
ジョブの集まりで、全体でどんな処理があるのかのカテゴリみたいなやつで
ビルド、テスト、デプロイとかの単位など、動作？のまとまりごとに分けます。


#### ジョブ
具体的にどんな処理をするのか書いてあるものたち
ymlの例の通りscriptにbashでかけるやつとかいろいろ書けます
今回の例には書いてないですが、どんな時に動かすのかの設定や、どんなimageで動かすのかなどもジョブにかけます。

#### 分かりやすい記事
ステージとかジョブのがナニモノなのか、お菓子作りにたとえられてわかりやすかったので、こちらの記事おすすめでした👇
[GitとCI/CDに関する知識ゼロのSEによる、GitLabのCI/CDパイプラインのキーワード解説 ～stages 編～](https://blogs.networld.co.jp/entry/2023/02/20/090000)

## 動いたらどんなかんじになるの？
私はここが全くイメージがついてなくて、動いてるのを見てワッ！！！となって感動しました

pushなどをして、Gitlabのパイプラインの画面を開くと、実行中になったものが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/690fe1e8-874d-b1c0-58eb-07c05e3dacb5.png)

現れたものを開くと、細かいステージ、ジョブが今どんな状況になっているのかが見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/fbffef10-a647-ddbf-a182-ab01c606fdae.png)

それぞれのジョブを開くと、ymlに書いたスクリプトが流れていることがわかります。
unit-test-jobのジョブの例(gifなのでガビガビですが。。。)↓
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/bf794fb8-be32-7e2a-33f3-432321804a6b.gif">


## いろいろつくってみて思ったこと
こんな感動を覚えつつ、Gitflowでの操作タイミングで、
lintや単体試験、総合試験、AWSにあげてる資材の更新や、環境の切り替えなどをするようなCICDができあがりました。
覚えている範囲での動き↓
* featureブランチでマージリクエストを作成したタイミングでlintと単体試験を実行
* developブランチが更新したときに、試験用の環境を更新する
* releaseブランチ作成時に新規でstaging環境を作成、総合試験を実施
* releaseブランチ作成時に新規でstaging環境を更新
* mainブランチ更新時に、staging環境と本番環境を切り替え、元の本番環境を削除する

CICDを組んでみて振り返りをしていて出てきた話をいくつか残しておこうと思います。

### 雰囲気掴んでからだと、理解がつかみやすい
わたしは、HelloWorld的なこと+αをして、だいぶCIの雰囲気をつかみました。
その後に最終系を作り始めたので、だいぶ一歩踏み出すのがらくだったようなきがします！！

初めての人は、echoしてなにか出したり、lintだけするようにしたり、
簡単なとこでいいので、先に軽いとこから触ってみた方がいいかなと思います。
また、GitlabCIを始めようとすると、サンプルがいっぱい推奨されるので、そこから雰囲気を感じとってもいいかも！？

### bashを結構書く
見ての通り、jobにはコマンドをいろいろ書けます。
ちょっとでも複雑なこと書こうとすると、がっつり触れてこなかったので、結構大変でした。
for文if文書いたり、jqコマンドでjsonを分解したり、bashでのやり方まったく知らなかったので、結構書くのにてこずりましたが、
途中で 「ChatGPTが役に立つよ！！」 と教えてもらい、いろいろChatGPTにコマンドを書くのを手伝ってもらい楽になりましたw
awsのコマンドも全部正確なわけではないけど、いろいろおしえてくれました。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/296e0241-024a-602f-ccf8-5909ef0dca73.png">


### いつどんなことをしたいのかをはやめにきめておいた方がいい
作り始めたころは、どのタイミングで何をするかは、ふわっと決めていたのですが、細かいところまで決められておらず、検討のし直しなどが発生しました。

それはそうなんですが、しっかりCICDするなら、
コミット、マージリクエストを作成、ブランチ作成、ブランチ更新など、gitでの操作ごとに何をしたいのか
そもそもどんな構成で環境を構成するのか、どう環境を切り替えるのか、ドメインはとるのか、DBはどうする？などなど、きっちり決めておくべきかなと思いました。

## おしまい！
見返したらだいぶざっくりになってましたが、誰かのGitlabでCICDをやってみる背中を押せてたら嬉しいです！
最終的に作ったものとかの話はまたいつかできたらいいな～～！

明日のアドベントカレンダー担当は一緒にGitLabでのCICDに取り組んだ@sayuyuyuさんです！
よろしくお願いします🥰