오늘 진짜 좌충우돌 우당탕탕 하루였다. 아침엔 RestTemplate을 이용해 스포티파이 api를 사용할 기초 setup을 하려고 했는데, 이것보다 ci/cd 환경을 조성하는 게 먼저라고 생각이 들었다. 그래서 github action을 이용해 ci를 구성하고자 한다.
[CI]
CI는 Continuous Integration 한글로는 지속적 통합. 협업을 할 때 같은 소스코드에 여러명이 작업을 할 때가 있다. 이때 머지를 할때 conflict가 정말 많이 나겠지? 그렇다면 이 conflict를 다루려면 어떻게 하면 좋을까? 바로 commit과 push를 아주 잘게 잘게 잘라서 하면 conflict를 더 대응하기 쉬워지겠지?
MSA(Micro Service Archietecture) 환경: 작은 기능 단위로 쪼개서 개발 하는 개발 환경! 따라서 기능 추가가 빈번히 발생한다. 하지만 기능단위가 작기 때문에 버그 발견을 빠르게 알 수 있고 그만큼 대응도 빨라진다는 장점. 하지만 단점은??? 기능 추가가 빈번한 만큼 merge를 자주 해줘야 겠지? 그렇다면? 이 merge를 자동으로 해주는 방법을 택하면 되는거 아니야? 이게 흐름인 것 같다.
ci가 프로젝트 merge의 자동화라면? cd는 배포의 자동화. 아직 배포는 조금 미뤄두고 생각하자!
그렇다면 ci는 어떻게 해야 하는건데? 여러 툴이 있다 jenkins, githubAction 등등! 우리는 우선 githubAction을 이용해서 구현해보자. jenkins는 ci속도가 더 빠르다고 한다. 하지만 이를 다루기 위해서 공부를 좀 많이 해야 수월히 다룰 수 있게 된다고 한다. 우리는 시간이 많지 않으니, 학습 시간을 줄이는 방식을 택했다.
githubAction에서 workflow를 만들어 보자!
여기서 나는 두번째. Java with Gradle을 이용해서 만들어 봤다. 그런데 이걸 그대로 가져다 쓰면 제대로된 기능을 못한다.
그 이유는 바로 gradle 권한이 없다고 뜬다. 따라서
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
//이부분을 추가해주면 권한이 부여된다!
- name: Add permission
run: chmod +x gradlew
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
- name: Add permission
run: chmod +x gradlew
이 부분을 추가해서 권한을 부여하면 잘 작동하게 된다. 내 첫 github Action이다. 이 간단한 action은 push 또는 PR을 할 때, 빌드가 실패하면 PUSH와 PR을 막아준다! 가끔 실행을 시켜서 문제가 없는지 확인을 안하고 PUSH, PR을 넣을 때가 있는데, 이를 막아주는 아주 효자.
우선 CI의 첫걸음을 뗐다.
보면 빨간색 X가 떠 있는 것들은? 바로 PUSH를 자동으로 막아준 것. 왜냐하면? 사실... 왠지는 모름... 지금 다시 보고 있는데 이거만 풀고 자야겠다!
run: ./gradlew clean build --stacktrace
아 보니까 호환 문제였다.문제가 됐던ㄷ 부분은 바로 이부분인데, 이부분은 빌드를 할 때 clean을 한번 하고 하는것.근데 이 바로 java 11만 호환된다는 것! 우리는 java17을 사용중이니 호환이 안됐던 문제 같다.
아 뭔가 이런 오류를 찾고, 이걸 해결하는게 재밌다. 시간이 좀 오래 걸리긴 하는데, 오늘 준영님이 또 말씀하셨다. 시간을 많이 박는만큼 오래 남을 것. 서두르지 말자. 조바심 내고 빠르게 가려고 하는 만큼 남는게 없는건 사실 나도 알고 있었잖아
아 그리고 추가! 우리는 그동안 너무나 당연히 spring web을 gradle에 추가를 했다. 그런데 이거 추가를 안하면 그냥 java파일처럼 main을 run시키고 서버가 바로 꺼진다. web 의존성을 추가했기 때문에 서버를 spring이 내가 끌때까지 유지시켜줬나보다!