[Heroku] Jenkins로 헤로쿠 어플리케이션 배포하기
Heroku에서 CI&CD 도구인 Jenkins를 설치하고, 젠킨스로 헤로쿠 어플리케이션을 배포합니다.
Environment
- heroku/7.59.2
- darwin-x64
- node-v12.21.0
Heroku에서 제공하는 무료 다이노(어플리케이션이 배포되는 Uninx 컨테이너)의 램 용량은 512MB로, Jenkins를 사용하기에는 매우 부족합니다.
Jenkins 메인 페이지에 가만히 있어도 메모리가 100%를 초과했다는 로그를 볼 수 있습니다.
그러므로
Free & Hobby
정책을 사용하고 계신 분들은 사용하지 않는 것이 좋아보입니다.
젠킨스 설치
Create new app
- 헤로쿠가 설치되어 있지 않다면 먼저 Heroku CLI를 설치합니다.
$ brew tap heroku/brew && brew install heroku
-
Jenkins를 설치할 Heroku App을 생성합니다.
# heroku apps:create <jenkins_app_name> $ heroku apps:create seed-jenkins
-
WAR file을 헤로쿠에 배포해주는
Heroku Java CLI Plugin
을 설치합니다.Heroku Java CLI Plugin
은 Tomcat Webapp Runner로 어플리케이션을 실행합니다.$ heroku plugins:install java
-
jenkins war 파일을 다운로드합니다.
https://www.jenkins.io/download/ 링크에서 jenkins.war 파일을 다운로드할 수 있습니다.
-
heroku에 jenkins를 배포합니다.
자바가 로컬에 설치되어 있다면, 다음 명령어로 배포할 수 있습니다.
Jenkins가 Java8보다는 Java11을 권장하기에
jdk 11
옵션을 추가합니다.# heroku war:deploy <path_to_war_file> --app <app_name> $ heroku war:deploy jenkins.war --app seed-jenkins --jdk 11
Jenkins Getting Started
https://<jenkins_app_name>.herokuapp.com
으로 접속합니다.-
Administrator password를 입력합니다.
터미널에서 다음 명령어를 입력합니다.
$ heroku logs --tail <jenkins_app_name>
길게 나오는 로그에서
Please use the following password to proceed to installation: <password> This may also be found at: /app/.jenkins/secrets/initialAdminPassword
<password>
를 찾고, 해당 password를 입력합니다.만약 로그에서 패스워드를 발견하지 못했다면, 헤로쿠에서 앱을 지우고 다시 설치해봅니다.
-
Admin 설정을 합니다.
Install suggested plugins
를 클릭합니다.
젠킨스로 헤로쿠 어플리케이션 배포
https://<jenkins_app_name>.herokuapp.com
에 접속하고, 설정한 Admin ID/PASSWORD로 로그인합니다.- 메인 페이지에서
새로운Item
을 클릭합니다. -
Item의 이름을 입력하고, Pipelne을 클릭한 후 OK를 눌러 Item을 생성합니다.
-
https://dashboard.heroku.com/account 에서 API Key 오른쪽에
Reval
을 누르고 나온 API Key를 복사합니다. -
자신의 설정에 맞게 파이프라인 스크립트를 작성합니다.
파이프라인 스크립트에는 다음 명령어가 들어가야 합니다.
- 헤로쿠 어플리케이션 깃 저장소 추가
git remote add <원격 저장소 이름> https://<username>:<헤로쿠에서 복사한 API-KEY>@<헤로쿠 어플리케이션 깃 주소>
- 원격 저장소 이름은 레포지토리에 이미 추가한 이름만 아니라면 어떤 것이든 괜찮습니다.
<username>
은 임의로 입력합니다.- 헤로쿠 어플리케이션 깃 주소는 https://dashboard.heroku.com/apps 에서 배포할 어플리케이션을 클릭한 후
Setting
메뉴를 들어가시면 있는Heroku git URL
입니다.
- 헤로우 깃 저장소에 코드 푸시
git push -f <원격 저장소 이름> `git subtree split --prefix <배포할 폴더 이름>`:master
push -f
가 아닌push
로 해도 괜찮습니다.-
다음과 같이 프로젝트 저장소에 프론트와 백엔드 폴더가 같이 있다면, 즉
.git
폴더가 배포할 어플리케이션 폴더에 없다면,❯ ls .git/ README.md backend/ frontend/
git subtree split
을 이용하여 백엔드 폴더만을 따로 분리하고 헤로쿠 저장소에 푸시해야 합니다.# git push -f <원격 저장소 이름> `git subtree split --prefix <배포할 폴더 이름>`:master # git subtree split --prefix <배포할 폴더 이름>: <배포할 폴더 이름>만을 가진 새로운 커밋 생성 # git push -f <원격 저장소 이름> <커밋>:<브랜치> # <원격 저장소>에 있는 <브랜치>에 <커밋>을 추가 ❯ git push -f heroku `git subtree split --prefix backend`:master
.git
폴더가 배포할 어플리케이션 폴더에 있다면 바로 저장소로 배포합니다.# git push <원격 저장소 이름> master git push heroku master
다음은 파이프라인 스크립트 예시입니다.
pipeline { agent any stages{ stage('SCM') { steps { git branch: "dev", url: "https://github.com/foo/bar.git" } } stage('Deploy') { steps { sh 'git remote add heroku https://foo:api-key@git.heroku.com/app-name.git' sh 'git push -f heroku `git subtree split --prefix backend`:master' } } } }
- 헤로쿠 어플리케이션 깃 저장소 추가
-
Item을 빌드합니다.
빌드 시
error: remote <원격 저장소 이름> already exists.
에러 문구를 만난다면, git remoteadd
를 git remoteset-url
로 변경하고 다시 빌드합니다.# 기존 git remote add <원격 저장소 이름> https://<username>:<헤로쿠에서 복사한 API-KEY>@<헤로쿠 어플리케이션 깃 주소> # 변경 후 git remote set-url <원격 저장소 이름> https://<username>:<헤로쿠에서 복사한 API-KEY>@<헤로쿠 어플리케이션 깃 주소>
Caution
헤로쿠는 다이노(Jenkins를 설치한 헤로쿠 앱)를 재시작하면 안에 설치된 모든 파일을 삭제하고 초기 상태로 돌아갑니다. 즉 재시작을 하면, 처음 비밀번호 설정부터 다시 시작해야 합니다. 그러므로 Jenkins를 설치한 이후 절대 재시작이 되지 않도록 해야합니다.
다이노 매니저는 다음 상황에서 다이노를 재실행하니 주의바랍니다.
- 새로운 커밋을 헤로쿠 저장소에 푸시했을 때
config vars
를 수정했을 때add-ons
를 추가하거나 삭제했을 때heroku restart
를 실행했을 때