SpringBoot + GithubActions + Gradle + Spockで、CI環境をサクッと構築してみた

# はじめに
* 注意点  
この記事ではCI環境を構築する手順を主に取り扱い、ワークフロー構文などの説明は省かせていただいていますのでご了承くださいmm
* なぜ書いたか  
SpringBoot + GithubActions + Gradle +JUnitでのCIの記事はよく出てきたが、JUnitではなくSpockを使用した記事がヒットしずらいこともあり備忘録的に書いてみました
* 開発環境  
macOS Catalina  
java 11  
SpringBoot 2.4.2  
Gradle 6.8.3
* 前提  
Spring Initializrなどを用いり、BuildツールをGradleとしたSpringBootアプリを作成し、Github上のリモートリポジトリへpushできる状態であること

# 1. ワークフローの定義
ルート直下に .github/workflows/ のディレクトリを作成し、その中にワークフローを記述したymlファイルを用意

今回用意したymlファイルで以下のワークフローが定義されています。
- masterブランチに対しPRを作成、またはPushされた場合にCIを実行
- やってることは gradle の build タスクを実行するのみ

```yml:.github/workflows/gradle.yml
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle

name: Java CI with Gradle

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      - name: Build,Test with Gradle
        run: ./gradlew build
```

# 2. 依存関係定義
コメントアウトした部分が今回のCI環境に必要な依存関係
この他にも必要な依存関係があれば追加しても○

```gradle:build.gradle
plugins {
    id 'org.springframework.boot' version '2.4.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id 'groovy'
    // テストリトライに必要なプラグイン
    id 'org.gradle.test-retry' version '1.1.6'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

// 一時的にテスト環境に負荷が掛かってテストケースが落ちる場合があるのでリトライをかける
// CI環境で落ちると原因の切り分けができなくコストがかかるのでリトライする
test {
    retry {
        failOnPassedAfterRetry = false
        maxFailures = 10
        maxRetries = 3
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    //spockのテストを実行するには以下の依存関係などが必要（他に必要であれば順次追記可）
    testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test'
    testImplementation 'org.springframework.boot:spring-boot-starter-groovy-templates'
    testImplementation 'org.codehaus.groovy:groovy-all:2.5.14'
    testImplementation "org.spockframework:spock-core:1.3-groovy-2.5"
}

```

# 3. Spockテストファイル作成
testディレクトリ配下へgroovyディレクトリを作成し、配下へテストファイルを作成
テストファイルはgroovy配下,プロダクトコードのパッケージと同じに配置  
以下のテストコードはサンプルです。
⚠︎今回はテスト結果を成功にするためだけの意味のないテストコードですが、本来は実装に合わせたテストコードに置き換えてください。

```groovy:test/groovy/com/example/ciTest/CiTestApplicationSpec.groovy
package com.example.ciTest

import org.springframework.boot.test.context.SpringBootTest
import spock.lang.Specification

@SpringBootTest
class CiTestApplicationSpec extends Specification {

    def "helloテスト"() {
        when:
        final expected = "hello"
        final actual = "hello"

        then:
        actual == expected
    }
}
```

# 3. pushしCI動作確認
今までのソースコードを「master」へpush
（gradle.ymlにてCIのトリガーをmasterへのpushにしている為）
Githubページへ行き、リポジトリのページを開いたらActionsタブを押し正しく動作しているか確認
以下の画像のように全てチェックマークがついていれば成功しています。
![スクリーンショット 2021-08-05 19.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1807565/10dc17f9-4bc3-0b1b-b54f-715c5b96c11f.png)
⚠︎テスト動いてるか？と思った方はテストコードのactualの値を適当なものにし再度pushしてCIが落ちるか試してください


# まとめ
GithubActionsは初学者でも簡単に扱えるので個人開発ではサクッと使えて良いですね
よりGithubActionsを賢く使いたい方は[公式ドキュメント](https://docs.github.com/ja/actions/learn-github-actions)があるので参考にしてください

お読みいただきありがとうございましたmm