[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

  1. 헤로쿠가 설치되어 있지 않다면 먼저 Heroku CLI를 설치합니다.
    $ brew tap heroku/brew && brew install heroku
    
  2. Jenkins를 설치할 Heroku App을 생성합니다.

    # heroku apps:create <jenkins_app_name>
    $ heroku apps:create seed-jenkins
    
  3. WAR file을 헤로쿠에 배포해주는 Heroku Java CLI Plugin을 설치합니다.

    Heroku Java CLI Plugin은 Tomcat Webapp Runner로 어플리케이션을 실행합니다.

    $ heroku plugins:install java
    
  4. jenkins war 파일을 다운로드합니다.

    https://www.jenkins.io/download/ 링크에서 jenkins.war 파일을 다운로드할 수 있습니다.

  5. 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

  1. https://<jenkins_app_name>.herokuapp.com 으로 접속합니다.
  2. Administrator password를 입력합니다. image

    터미널에서 다음 명령어를 입력합니다.

    $ 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를 입력합니다.

    만약 로그에서 패스워드를 발견하지 못했다면, 헤로쿠에서 앱을 지우고 다시 설치해봅니다.

  3. Admin 설정을 합니다. image

  4. Install suggested plugins를 클릭합니다. image

젠킨스로 헤로쿠 어플리케이션 배포

  1. https://<jenkins_app_name>.herokuapp.com에 접속하고, 설정한 Admin ID/PASSWORD로 로그인합니다.
  2. 메인 페이지에서새로운Item을 클릭합니다.
  3. Item의 이름을 입력하고, Pipelne을 클릭한 후 OK를 눌러 Item을 생성합니다. image

  4. https://dashboard.heroku.com/account 에서 API Key 오른쪽에 Reval을 누르고 나온 API Key를 복사합니다. image

  5. 자신의 설정에 맞게 파이프라인 스크립트를 작성합니다.

    파이프라인 스크립트에는 다음 명령어가 들어가야 합니다.

    • 헤로쿠 어플리케이션 깃 저장소 추가
      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'
             }
          }
       }
    }
    
  6. Item을 빌드합니다.

    빌드 시 error: remote <원격 저장소 이름> already exists. 에러 문구를 만난다면, git remote add를 git remote set-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를 실행했을 때
 Date: December 16, 2021
 Tags:  Heroku

Previous
⏪ [Heroku] Redis 사용하기

Next
[Spring Auto REST Docs] Section snippet 'auto-method-path' is configured to be included in the section but no such snippet is present in configuration ⏩