🔔 지난글
https://velog.io/@asdf-dev/spring-boot-rest-template
https://velog.io/@asdf-dev/spring-boot-open-api
이전에 만든 AI 이미지 생성 웹사이트를 Heroku에 배포하고, GitLab과 연동하여 배포 자동화까지 수행해 보았다.
Windows 10
docker desktop
예전엔 Heroku가 무료였는데... 최근에 다시 찾아보니 유료로 완전 전환했네? 그래서 그냥 결제했다...
GitLab도 30일 무료 체험판 써서 끝나기 전에 빨리 블로그 써야함
GitLab과 Heroku 가입 절차는 생략하겠다. 하단의 좋은 글들을 참고합시다.
내 프로젝트를 업로드할 저장소까지 만들었다고 가정하고 다음 과정들을 진행한다.
프로젝트 저장소를 생성했다면, Setting > CI/CD > Runners 를 클릭하여 다음과 같이 Instance runners를 꺼주도록 하자. 유료 플랜이기 때문에 push 시 카드 등록하라고 에러난다.
계정 등록 후, 카드 등록까지 해주어야 사용 가능하다.
New > Create new app으로 앱 생성 후, Setting에서 빌드팩을 설정해준다.
내 프로젝트 환경은 Gradle 8.5, java17
이어서 heroku/gradle
로 설정해주었다.
Heroku에 Java 프로젝트를 배포하려면, Procfile(확장자 없음)을 다음과 같은 형식으로 작성해주어야 한다.
반드시 프로젝트 루트 경로에 생성해주자.
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/<artifactId>-<version>.jar
터미널에서 ./gradlew build 실행 후 생성된 build/libs 하위의 jar파일명을 적는다.
이런식으로 쓴다.
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/rest-0.0.1-SNAPSHOT.jar
java 17 사용하는 경우 system.properties
에 다음을 명시해주어야 한다. 마찬가지로 프로젝트 루트 경로에 생성한다.
java.runtime.version=17
Heroku 관련 설정은 끝났다. 이제 GitLab 파이프라인 작성을 위해 GitLab-Runner를 설치하자.
https://docs.gitlab.com/runner/
https://somaz.tistory.com/201
간단하게 GitLab에서 CI/CD를 위해 제공하는 도구이다.
파이프라인에 작성된 스크립트나 작업을 수행한다고 이해하면 쉬울듯 하다.
내 노트북에서 사용할거라 Windows 버전으로 다운받았다.
실행파일을 곧바로 다운받을 수 있다. 다운받은 실행파일을 원하는 폴더 경로에 옮겨놓는다. 예제에 적힌대로 C:\GitLab-Runner
경로에 옮겨두었다.
다시 저장소의 Setting > CI/CD > Runners 로 이동해 New project runner를 클릭한다.
누르면 이렇게 태그를 입력하라는 창이 뜨는데, 그냥 아무거나 입력하고 하단의 Create runner 클릭
Runner가 생성되었으니, 직접 관련 정보를 등록해주어야 한다.
하단에 Step1,2,3 으로 친절하게 기술되어 있다.
token 정보는 복사하여 사용하면 된다.
CMD를 관리자 권한으로 실행시켜 다음 명령어들을 차례로 입력한다.
실행자를 docker로 수행할 것이다. 왜냐하면 docker가 제일 쉬워보였기 때문에
GitLab Runner implements a number of executors that can be used to run your builds in different environments.
결국 Job을 실행할 환경이란 뜻임. 파이프라인을 구성하는 각 단계들을 Job이라고 한다.
관리자 권한으로 CMD를 실행하고, 다음 명령어를 차례로 입력한다.
cd C:\GitLab-Runner
gitlab-runner-windows-amd64.exe register
https://gitlab.com
{복사한 토큰}
{Runner 이름}
docker
등록이 끝나면 config.toml
파일을 열어 volumes
를 다음과 같이 수정한다.
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
Runner 등록이 정상적으로 끝났다면 사진처럼 활성화 되어있을 것이다.
파이프라인에서 사용할 환경변수를 등록한다. Setting > CI/CD > Variables 화면에서 Add variable 선택 후 key와 value 설정
1. HEROKU_API_KEY
해당 페이지에서 아래로 스크롤하여 API KEY를 찾는다.
API KEY가 로그에 노출되지 않도록 Masked를 체크해주자.
2. HEROKU_APP_NAME
Heroku 앱 정보에 있는 App Name
3. HEROKU_GIT_URL
https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git
로 설정
이제 파이프라인을 작성하면 된다. 프로젝트 루트 경로에 .gitlab-ci.yml
을 생성한다. 등록한 환경변수는 $변수명
과 같은 형태로 사용한다.
image: gradle:8.9.0-jdk17-alpine
stages: # 배포 단계 구성
- build
- deploy
build: # Job 이름
stage: build
script:
- chmod +x ./gradlew # gradlew 실행 권한 부여
- ./gradlew clean build -x test
artifacts:
paths:
- build/libs/*.jar
deploy:
stage: deploy
before_script:
- apk add --no-cache npm nodejs curl bash # bash, curl, nodejs 설치
- curl https://cli-assets.heroku.com/install.sh | bash # Heroku CLI 설치
- echo "$HEROKU_API_KEY" | heroku auth:token # API 키 설정
- heroku auth:whoami # 접속한 사용자
- git remote -v # 연결된 저장소 확인
- heroku git:remote -a $HEROKU_APP_NAME
script:
- git branch # 로컬 브랜치 확인
- git switch main # main으로 변경
- git pull origin main # git pull
- git fetch --unshallow # 모든 이력 확인
- git push $HEROKU_GIT_URL main # push
environment: production
only:
- main
실행 단계를 build, deploy로 구성한다. Heroku는 배포 시 내부적으로 빌드를 수행하지만, 파이프라인에서 먼저 빌드하여 문제가 없는지 체크하도록 한다.
배포 시점에선 Heroku CLI를 설치 후 Heroku git에 연결한다. 로컬 브랜치(docker)의 main 브랜치와 원격 저장소 main 브랜치의 이력을 맞추고 Heroku 서버에 배포한다.
위 프로세스를 각 Job마다 반복한다.
이제 GitLab 저장소에 코드를 업로드하기만 하면, Heroku 서버 배포까지 자동으로 수행한다. 개꿀!😋
👇 여기서 확인 가능하다