3. Jenkins Job 생성 - woowacourse-teams/2021-drop-the-code GitHub Wiki

3. 배포 과정

빌드/배포

  • 빌드/배포 과정은 일반적으로 다음과 같다.
  1. Github, S3 등 코드 저장소로부터 코드를 가져온다.
  2. 코드를 빌드/테스트 한다.
  3. 빌드된 파일을 실제로 배포하려는 서버 또는 s3로 옮긴다.
  4. 빌드된 파일을 실행하는 스크립트를 실행한다.(Cloudfront의 경우 별도의 실행 필요없이 캐시 Invalidation 명령어 실행)

Jenkins Job 또는 Project 또는 Item

위에서 언급한 빌드/배포 작업들을 Jenkins에서 정의해야 하는데 정확한 용어를 모르겠음 각 Jenkins 페이지마다 사용하는 용어가 다름...ㅜㅜ 일단 여기서는 Jenkins Job이라고 통일

아래 새로운 Item(Job)을 클릭하면 여러가지 형태의 Jenkins Job 리스트가 나옴

여기서 내가 주로 사용하는 두 가지

Frestyle Project

  • 왠만한 모든 빌드/배포 과정은 이 항목으로 만들 수 있음
  • 대부분의 설정들이 클릭 또는 계정 인증 정보나 디렉토리 경로만 입력만 하면 돼서 편리함!
  • 단점이라면 아래 pipeline은 각각의 작업들을 stage로 분리하면 각각의 작업 성공/실패 여부 로그들을 바로 확인할 수 있는데 이건 모든 로그를 한꺼번에 봐야한다.

Freestyle Project Log

Pipeline Log

Pipeline

  • Freestyle Project와 달리 다음과 같이 코드로 모든 작업에 대한 정의를 해줘야한다.
  • 처음에 진입장벽이 좀 있긴 하지만 쓰다보면 금방 익숙해짐
  • Freestyle이든 Pipeline이든 설정 과정에서 디버깅을 할 일이 많은데 개인적으로 pipeline은 단계별 상태를 바로바로 보여줘서 더 편했음
pipeline {
    agent any

    tools {
        // Install the Maven version configured as "M3" and add it to the path.
        maven "M3"
    }

    stages {
        stage('Build') {
            steps {
                // Get some code from a GitHub repository
                git 'https://github.com/jglick/simple-maven-project-with-tests.git'

                // Run Maven on a Unix agent.
                sh "mvn -Dmaven.test.failure.ignore=true clean package"

                // To run Maven on a Windows agent, use
                // bat "mvn -Dmaven.test.failure.ignore=true clean package"
            }

            post {
                // If Maven was able to run the tests, even if some of the test
                // failed, record the test results and archive the jar file.
                success {
                    junit '**/target/surefire-reports/TEST-*.xml'
                    archiveArtifacts 'target/*.jar'
                }
            }
        }
    }
}

일단 Freestyle Project로 빌드 배포 Job 만들어보자!

Publish over SSH 플러그인 설치

  • 아까 위에서 언급한 플러그인인데 빌드된 파일을 원격지 서버로 옮기기 위한 플러그인이다.
  • Jenkins 관리에 Plugin 관리로 이동
  • "설치 가능" 탭 클릭 후 "Publish over SSH" 검색
  • 재시작하면 귀찮으니까 "install without restart"

Publish over SSH 플러그인 설정

  • 설치가 다 됐다면 다시 Jenkins 관리로 돌아가 "시스템 설정"에서 접속 설정을 해줘야 함
  • 이 접속 설정은 Jenkins ec2 서버에서 배포용 ec2 서버로 파일을 옮기기 위한 설정
  • 만약 배포 서버에 Jenkins를 설치했다면 필요 없음! 근데 생각보다 빌드 과정이 메모리를 많이 잡아먹어서 따로 하는걸 추천!

원격지 서버 접속을 위한 Private Key 설정

  • 아래로 쭉쭉 내리다보면 Publish over SSH 탭이 있음
  • 이제 여기에 "배포 서버"에 접속하기 위한 Private Key를 넣어야함
  • 당황하지 말고 EC2로 만들었다면 ec2에 접속할 때 사용하는 ec2-key.pem "Key" 항목에 직접 넣어주면 된다.(나머지는 무시)
  • pem 파일을 vim이나 cat으로 까봤을때 볼 수 있는 위아래 문자도 같이 넣어줘야함
-----BEGIN RSA PRIVATE KEY-----

.....

-----END RSA PRIVATE KEY-----

Private Key를 직접 만들었다면?

  • Key를 직접 만들었다면 만들 때 입력한 Passphrase를 Passphrase와 Private Key를 입력
  • Key를 Jenkins 서버에 파일로 갖고 있다면 "Path to key" 입력

원격지 서버 정보 설정

  • Name - 원격지 서버 이름(나중에 Job에서 사용할 때 쉽게 구분할 수 있도록 정의)
  • Hostname - 원격지 서버 IP(Jenkins이 배포 서버와 같은 VPC라면 private IP도 가능)
  • Username - EC2 접속할 때 사용하는 Username 보통 Ubuntu는 "ubuntu", 아마존 AMI는 "ec2-user"
  • Remote Directory - 원격지 서버에 접속한 순간 처음 위치하는 경로 (나중에 jar 파일을 위치시킬때 사용하기 때문에 잘 설정해야함, 보통 user의 홈 디렉토리 사용)
  • 마지막 아래 Test Configuration을 눌러 접속이 잘 되는지 확인, Success가 뜬다면 성공!

Job을 만들어보자 (진짜...)

Job 생성

  • Job 이름 입력 - 왠만하면 영어로 만들자
  • job을 만드는 순간 jenkins workspace 경로에 이름을 기준으로 디렉토리가 만들어진다.
  • Freestyle project를 클릭하고 ok!

Job 설정