-
ktlint와 Github Action을 활용한 CI프로젝트/미디어 스트리밍 서버 프로젝트 2022. 8. 17. 21:57728x90
ktlint란?
Kotlin 언어의 공식 사이트에서는 코딩 컨벤션 가이드를 제공합니다.
ktlint는 공식 가이드의 규칙을 포함하여 코드 스타일을 검사하고 맞춰주는 도구입니다.
ktlint를 통해 팀원들과 정해진 포맷팅을 맞추어 개발할 수 있게 되고 코드 가독성이 향상되는 효과를 볼 수 있습니다.
ktlint gradle 설정하기
plugins { id("org.jlleitschuh.gradle.ktlint") version "<current_version>" }
.editorconfig 설정하기
코드 포맷에 대한 문서의 역할을 수행하는 파일입니다.
ktlint가 버전이 올라가면서 규칙의 디폴트 값이 변경될 경우를 대비할 수 있습니다.
Kotlin 공식 코딩 컨벤션에 명시되지 않은 규칙까지 일치시킬 수 있습니다.
.editorconfig 파일 작성법은 Editorconfig를 참조했습니다.
editorconfig는 여러 개발자가 일관된 코딩 스타일을 유지하도록 합니다.
다음은 파일 예시입니다.
root = true [*] charset = utf-8 end_of_line = lf indent_style = space indent_size = 4 insert_final_newline = true max_line_length = 120 tab_width = 4 disabled_rules = no-wildcard-imports,import-ordering,comment-spacing
테스트를 해보면 기본적인 컨벤션 이외에 .editorconfig에 설정한 max_line_length=120 line 이 넘는 error도 올바르게 검사하는 것을 알 수 있습니다.
ktlintCheck
코드의 스타일을 검사하거나 자동으로 틀린 부분을 수정해주기도 합니다.
# 코드 스타일 검사 $ ./gradlew ktlintCheck
ktlintFormat
스타일에 맞게 코드를 수정해줍니다.
./gradlew ktlintFormat
build gradle
만약 ktlint에 어긋나는 코드의 스타일로 빌드를 진행하면 자동으로 fail 됩니다.
./gradlew build
CI/CD란?
애플리케이션 개발 단계를 자동화하여 애플리케이션을 보자 짧은 주기로 제공하는 방법입니다.
CI/CD 는 지속적인 통합, 지속적인 배포의 약자입니다.
이때 Github Action을 이용하여 Kotlin 컨벤션을 검사해 주는 도구인 ktlint를 CI에 적용하여, PR시 자동으로 적용될 수 있도록 구현할 예정입니다.
Github Action이란?
소프트웨어 workflow를 자동화할 수 있도록 도와주는 도구입니다.
Github에서의 workflow는 하나 이상의 작업을 실행시키는 자동화 프로세스를 의미합니다.
job 단위로 구성되어 있으며 특정한 Event에 의해 트리거 됩니다.
이를 정의하는 workflow파일은 .yml으로 작성되고 이에 대한 기본적인 템플릿은 Github에서 제공합니다.
Event는 예를 들어 다음과 같은 상황을 사용할 수 있습니다.
- 특정 브랜치로 Push
- 특정 브랜치로 PR
- 특정 시간대에 반복(cron)
- Webhook을 사용해 외부 이벤트를 통해 실행
./github/workflows/main.yml 파일을 다음과 같이 작성하면 됩니다.
name: PR Test on: pull_request jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11 - name: Cache Gradle packages uses: actions/cache@v2 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Test with Gradle run: ./gradlew --info test - name: ktlint with Gradle run: ./gradlew ktlintCheck - name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v1 if: ${{ always() }} with: files: build/test-results/**/*.xml - name: Cleanup Gradle Cache # Remove some files from the Gradle cache, so they aren't cached by GitHub Actions. # Restoring these files from a GitHub Actions cache might cause problems for future builds. run: | rm -f ~/.gradle/caches/modules-2/modules-2.lock rm -f ~/.gradle/caches/modules-2/gc.properties
파일을 분석하면 다음과 같습니다.
on: pull_request
pull_request event가 발생할 때마다
runs-on: ubuntu-latest
ubuntu 환경에서 실행
- name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11
JDK 11 버전으로 설치
- name: Cache Gradle packages uses: actions/cache@v2 with: path: | ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle-
gradle cache를 통해 속도 향상
- name: Grant execute permission for gradlew run: chmod +x gradlew
gradlew를 실행하기 위해 권한 부여
- name: Test with Gradle run: ./gradlew --info test
gradle test수행 실패 시 fail
- name: ktlint with Gradle run: ./gradlew ktlintCheck
ktlint를 수행하여 포맷팅이 알맞은지 검사 실패시 fail
- name: Publish Unit Test Results uses: EnricoMi/publish-unit-test-result-action@v1 if: ${{ always() }} with: files: build/test-results/**/*.xml
테스트 후 Result를 보기 위해 Publish Unit Test Results step 추가
테스트가 실패하여도 Report를 보기 위해 'always'로 설정
- name: Cleanup Gradle Cache # Remove some files from the Gradle cache, so they aren't cached by GitHub Actions. # Restoring these files from a GitHub Actions cache might cause problems for future builds. run: | rm -f ~/.gradle/caches/modules-2/modules-2.lock rm -f ~/.gradle/caches/modules-2/gc.properties
캐시 지우기 -> 추후에 빌드시 문제가 발생할 수 있기 때문
추후에 github 브랜치 설정을 통해 GithubAction 에 실패하면 Merge 자체가 불가능하게 막아 버릴 수도 있습니다.
출처
https://msyu1207.tistory.com/entry/깔끔한-포맷팅을-위한-ktlint-적용하기-feat-kotlin
https://blog.benelog.net/ktlint.html
'프로젝트 > 미디어 스트리밍 서버 프로젝트' 카테고리의 다른 글
ffmpeg install (Mac OS, Amazon Linux) (0) 2022.08.22 JPA Paging 적용하기 (0) 2022.08.20 Json with MultipartFile (0) 2022.08.19 [Spring + Kotlin]Kotest와 MockK를 활용한 테스트 코드 작성 (0) 2022.08.19 스트리밍 서버란? (0) 2022.08.16