깃랩과 헤로쿠를 이용한 배포환경 구축하기

Dev-Whale·2022년 8월 13일
0
post-thumbnail

글에 앞서 이 글은 해당 방법을 많이 써보고 하는게 아닌 블로그들을 보고 직접 해본 결과를 정리하기위해 쓴 글이며 부족함이 있을 수 있습니다.
(+ git, gitlab, github 등의 git 명령어는 사용할 수 있다는 기준하에 작성된 글이므로 git의 명령어등은 기술하지 않았습니다)

깃랩과 헤로쿠 선정이유

졸업프로젝트를 진행함에 따라서 프로젝트 배포를 위한 서버가 필요하게 되었습니다.

사이트의 서버를 구축하는 방법은 여러가지가 있겟지만

  • 직접 서버를 구축하기
  • AWS를 활용해서 서버 구축하기
  • heroku(이하 헤로쿠)를 활용하기
  • 이외 서비스 이용하기

등등의 여러 방식이 있겟지만

학생의 신분으로 비용이 많이드는 방식은 힘들었습니다.
AWS 프리티어를 사용하다 실수로 20만원의 비용을 더 내게 된 경험이 있던 필자로서는 비용에 더 민감 할 수 밖에 없었고 무료로 대부분이 해결이 가능한 헤로쿠를 사용하게 되었습니다.
(하지만 이것도 곧 무료 플랜 종료 ㅜㅜ 서버는 koyeb으로 갈아탈 것 같습니다.)

개인프로젝트가 아닌 팀프로젝트이기에 헤로쿠뿐이 아니라 협업툴이 필요했고 그 해결책으로 협업과 동시에 ci/cd 구축을 위해 GitLab을 사용하였습니다.

우리 프로젝트 같은 경우에는 공유된 깃랩저장소 하나와 메인 헤로쿠 앱 하나 그리고 팀원들 개개인의 미러 헤로쿠앱을 만들어서 테스트는 미러 저장소로 테스트하고 성공하면 메인 저장소에 업로드하는 식으로 구축을 하였습니다.

배포환경 구축

배포 구축 과정은 다음의 순서로 진행 하였습니다.
1. 깃랩 프로젝트 생성
2. GitLab-Runner 지정
3. heroku app 생성
4. GitLab 미러링 저장소 지정
5. 프로젝트 push
6. 파이프라인 생성(Update .gitlab-ci.yml file)

1. 깃랩 프로젝트 생성

먼저 깃랩에서 프로젝트를 생성한다.

새프로젝트 또는 Create new project 선택

배포테스트만 할것이므로 blank project 선택

간단하게 프로젝트 이름은 HerokuTest로 정하고 넘어가도록 하겟습니다.

2. GitLab-Runner 지정

프로젝트가 생성되었으면 깃랩 러너를 지정해주어야 합니다.
(자동배포를 위한 과정)

참고한 사이트
위 블로그에 자세하게 나와있듯이 간단한 과정입니다.

본인의 C 드라이드에 GitLab 을 설치할 디렉토리를 하나 만듭니다.(C:/GitLab-Runner)
GitLab Runner bleeding edge releases 에 접속하여 본인 사양에 맞는 바이너리 버전을 다운로드 받습니다.
GitLab Runner bleeding edge releases

저 같은 경우에는 윈도우를 쓰기 때문에 윈도우 64비트 버전으로 받아서 폴더에 넣어주었습니다.

다운받아서 저장하였으면 깃랩에 들어가서
프로젝트에서 설정 -> CI/CD -> Runners선택

여기에서 URL과 토큰을 가지고 cmd창에서 입력

cmd창에서 해당 runner실행파일 넣은 곳으로 이동
실행파일.exe register 입력
1. url 입력
2. token 입력
3. runner 설명 입력
4. tag입력 (나중에 .gitlab-ci.yml 에서 파일에서 tag로 구분)
5. 위 tag 를 .gitlab-ci.yml 에서 사용할 때 설계한 script 를 실행할 실행 프로그램을 설정

성공적으로 러너 등록에 성공하면 아래 그림처럼 뜨게됩니다.

3. Heroku app 생성

이제 러너 등록 까지 완료했으니 heroku 프로젝트를 생성할 차례입니다.

heroku사이트에서 create app을 통해 프로젝트를 생성하고

헤로쿠 앱에서 settings쪽으로 들어간다.
여기서 해야할 것은
먼저 buildpack을 설정해야한다.
필자 같은 경우에는 gradle을 선택하였다.

4. GitLab 미러링 저장소 지정

이제 깃랩 에서 미러 저장소를 지정해야한다.

이전에는 깃허브에 프로젝트를 올리고 헤로쿠와 깃허브를 연동해서 사용하는 것이 되었지만 이번에 보안이슈가 터지면서 해당 방법은 사용하지 못하게 되었고 heroku git을 활용하여 프로젝트를 관리해야 하지만 해당 글은 깃랩과 헤로쿠 배포환경 구축에 관한 글이고 이 부분은 넘어가도록 하겟다.

헤로쿠 앱에서 settings로 가면 Heroku git URL 이라고 친절하게 헤로쿠 프로젝트가 저장된 git 저장소 주소가 나온다. 일단 이부분을 기억하고 오른쪽 위의 프로필 사진을 누르고 Account Settings로 들어갑니다.

스크롤을 내리다보면 API Key가 있습니다.

이제 다시 깃랩으로 돌아가서
설정 -> 저장소 -> 미러링 저장소에 들어갑니다.

Git 저장소 URL에는 아까찾은 Heroku git URL을 넣어주고 패스워드 부분에는 API Key를 넣어주면 됩니다.

여기서 git URL을 넣을 때는 주의해야할 점이 있는데 주소 앞에 닉네임을 넣어주어야 한다는 점입니다.
깃허브라면 닉네임, heroku git 이라면 헤로쿠 계정명을 넣어주어야한다.
ex) heroku : https://git.heroku.com/heroku-test-dev-whale.git 가 저장소 주소이고 헤로쿠 계정명이 abcd@gmail.com일때 -> https://abcd@gmail.com@git.heroku.com/heroku-test-dev-whale.git
이런식으로 넣어주어야 합니다.

성공적으로 미러링 저장소가 설정이 되면 이런식으로 나오게 된다.

여기에서 에러가 뜨는 경우가 많은데 대부분 계정명을 잘못 넣었거나 이 다음에 진행해야할 프로젝트 설정을 하지 않았을 경우입니다.

(ex - 헤로쿠 앱에서 gradle로 프로젝트를 설정하였는데 그 형식대로 프로젝트가 올라와있지 않아서 헤로쿠측에서 에러를 낸 것)

5. 프로젝트 push

저는 gradle과 java buildpack 외에 헤로쿠 저장소에서 빌드해보지 않았기 때문에 해당 글에서는 gradle로 프로젝트 설정하는 것만들 다루도록 하겟습니다.

Procfile 추가

우선 루트 폴더에 확장자 없이 Procfile 파일을 만듭니다.
Procfile에는 jar 파일이 있는 곳을 지정해주어야 합니다.

저는 build폴더를 .gitignore파일로 지정해서 jar파일을 따로 target폴더를 만들어서 지정하여 주었습니다.

web: java -Dserver.port=$PORT $JAVA_OPTS -jar target/testproject-0.0.1-SNAPSHOT.jar

build.gradle에 아래 코드 추가

bootJar {
	destinationDirectory = file("./target")
}

system.properties 추가

heroku gradle은 기본적으로 java 8버전을 지원하고 다른 버젼의 자바를 사용하고 싶으면 system.properties에 아래 코드를 추가한다.
(저는 11버전을 사용하였기 때문에 아래 내용처럼 작성하여 주었습니다.)

java.runtime.version=11

여기까지 진행 한 후 깃랩 메인 리포지토리에 올리면 배포환경은 완성되었습니다.

레포지토리에 push를 진행 한 뒤 mirror 저장소에 push를 진행하게 되면 해당 미러저장소에 메인리포리토리 내용이 올라가게 됩니다.

다음에는 이 과정을 push만 하면 자동으로 진행하도록 하겟습빈다.

6. 파이프라인 생성(Update .gitlab-ci.yml file)

(참고로 gitlab에 크레딧 카드를 등록하지 않으면 인증되지 않아서 배포과정에서 에러가 나게 됩니다)

이제 깃랩 레포지토리에 글을 올리면 자동으로 미러 저장소에 연동하도록 하겟습니다.

먼저 두가지 변수를 만들어야 합니다.

설정 -> CI/CD -> 변수에서
HEROKU_API_KEY, HEROKU_APP_NAME 변수를 만들어 줍니다.
(이름은 크게 상관 없습니다)

HEROKU_API_KEY 에 넣을 내용은 이름 그대로 HEROKU_API_KEY를 넣어야 합니다.

API_KEY를 가져오는 방법은 HEROKU 사이트에서 계정의 Account Setting에서 API KEY 정보를 가져오면 됩니다.

HEROKU_APP_NAME의 내용은 해당 헤로쿠 어플리케이션 이름을 넣어주면 됩니다.
(application name : spmis)

두가지 변수를 만들고나서 아래 코드를 CI/CD -> edit 쪽에 만들어 주면 환경 설정 종료입니다!!

# This file is a template, and might need editing before it works on your project.
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Gradle.gitlab-ci.yml

# This is the Gradle build system for JVM applications
# https://gradle.org/
# https://github.com/gradle/gradle

image: gradle:alpine

# Disable the Gradle daemon for Continuous Integration servers as correctness
# is usually a priority over speed in CI environments. Using a fresh
# runtime for each build is more reliable since the runtime is completely
# isolated from any previous builds.
variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

before_script:
  - GRADLE_USER_HOME="$(pwd)/.gradle"
  - export GRADLE_USER_HOME

build:
  stage: build
  script: gradle --build-cache assemble
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle

test:
  stage: test
  script: gradle check
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle
      
deploy:
  image: ruby:latest
  stage: deploy
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY

해당 글은 직접 사용하기 위해 공부한 내용을 정리한 내용입니다.
그렇기에 틀린내용이 있을 수 있습니다.
틀린내용이 있거나 수정할 내용이 있다면 댓글로 알려주시기 바랍니다!

해당 기능을 사용하기위해 많이 찾아보고 겨우 해냈는데 곧 헤로쿠 무료 서비스 종료라니 마음이 너무 아프네요ㅜㅜ

배포는 koyeb를 사용해볼 예정인데 클라우드 DB는 아직 찾아보는 중이네요... 좋은 클라우드 DB 서비스를 아시는분 있으시면 알려주시면 감사하겟습니다ㅜㅜ

profile
개발하는 고래

0개의 댓글