0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-07-26

はじめに

  • 注意点
    この記事では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 タスクを実行するのみ
.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環境に必要な依存関係
この他にも必要な依存関係があれば追加しても○

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配下,プロダクトコードのパッケージと同じに配置
以下のテストコードはサンプルです。
⚠︎今回はテスト結果を成功にするためだけの意味のないテストコードですが、本来は実装に合わせたテストコードに置き換えてください。

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
⚠︎テスト動いてるか?と思った方はテストコードのactualの値を適当なものにし再度pushしてCIが落ちるか試してください

まとめ

GithubActionsは初学者でも簡単に扱えるので個人開発ではサクッと使えて良いですね
よりGithubActionsを賢く使いたい方は公式ドキュメントがあるので参考にしてください

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?