Jenkins 자동 빌드 및 알람 이메일 설정

GitLab으로 운용되는 프로젝트와 Jenkins를 연동하여 자동으로 빌드 및 결과를 이메일로 발송하도록 설정해 보았다.


협업하여 프로젝트를 진행 중일때에는 가끔 빌드에 문제가 생기는 경우가 있다. 특히 자신이 추가한 파일을 리모트 저장소에 올리지 않거나, 자신이 수정한 파일 중에 일부만 올리거나, 전체 빌드를 해보지 않고 올리는 경우 등에서 발생할 수 있다.


나도 진행 중인 사내 프로젝트 중에서 이런 경우가 종종 발생하였고, 심지어 빌드에 문제가 생겼는데도 정작 본인은 인지하지 못하고 있어서 계속 이 상태가 유지되는 경우도 있었다. 🚩
이 문제에 대한 대책으로 팀 서버에 Jenkins를 설치한 후에 Git push가 될 때마다 자동으로 Jenkins에서 전체 빌드 및 빌드 결과를 메일로 발송하게 하였다. (프로젝트 참여원 전체에 빌드 결과가 발송되도록 하였고, 특히 빌드가 실패한 경우에는 해당 committer에게 메일로 빌드 로그 등이 포함된 상세 내역이 발송되도록 함)
이렇게 운용한지 얼마 지나지 않아서 빌드에 문제가 생기는 경우가 많이 줄었고, 문제가 발생한 경우에도 빠르게 수정되어 대부분 clean 빌드 상태를 유지할 수 있게 되었다. 🌞


아래에 Git push 하면 GitLab에서 Jenkins로 push 이벤트를 보내도록 설정하는 방법과 Jenkins에서 이 trigger를 받으면 빌드 및 결과를 이메일로 발송하도록 설정하는 방법을 정리하였다.

GitLab, Jenkins 기본 설정

  1. GitLab에서 Jenkins에서 사용할 수 있도록 API token을 생성해야 한다.
    GitLab에서 로그인 한 후, 유저의 Settings -> Access Tokens 클릭하여 Name에 이름을 주고 (예: “Jenkins”), Scopes에서는 api 항목에 체크를 한다.
    “Expires at” 항목에 날짜를 지정하지 않으면 expire가 never로 세팅된다. 이후 Create personal access toke 버튼을 누르면 token이 생성된다.
    결과로 “Your New Personal Access Token”에 token 값이 표시된다. 이 값은 이후 다시 확인이 불가하므로 따로 저장한다.
  2. Jenkins에서 GitLab 플러그인이 아직 설치되지 않은 상태이면, 먼저 관리자로 로그인한 후 GitLab 플러그인을 설치한다.
  3. Jenkins에서 관리 -> 시스템 설정 -> Gitlab 항목으로 이동하여 사용할 GitLab 서버에 대한 Connection nameGitlab host URL을 입력한다.
    이후 Add 버튼을 누르면 Jenkins Credentials Provider: Jenkins 팝업이 뜬다. Kind에서 GitLab API token을 선택하고 위의 GitLab에서 얻은 access token 정보를 입력한 후, Add 버튼을 누르면 팝업이 닫힌다.
    Test Connection 버튼을 눌러서 “Success” 메시지가 뜨면 성공이다.
  4. 이제 Jenkins에서 GitLab push 이벤트를 받을 수 있도록, Jenkins의 해당 프로젝트에서 구성 -> 빌드 유발 -> “Build when a change is pushed to GitLab.” 항목을 체크한다. 이때 바로 옆에 GitLab webhook URL 정보가 출력된다.
    “고급” 버튼을 눌러서 Secret token 항목에서 “Generate” 버튼을 누르면 Secret Token이 생성된다.
    이 2가지 정보는 다음 단계의 GitLab 해당 프로젝트에서 webhook 설정시 이용된다.
  5. GitLab에서 해당 프로젝트에서 Settings -> Webhooks 항목으로 들어가서 webhook을 설정한다.
    Jekins에서 얻은 URL과 Secret Token 값을 각각 URLSecret Token 란에 입력한 후, Add webhook 버튼을 누른다.

    이때 만약 “Url is blocked: Requests to the local network are not allowed” 메시지가 뜨면서 실패하는 경우에는 관리자로 로그인한 후, Settings -> Network -> Outbound Requests -> Allow requests to the local network from web hooks and services 항목을 체크를 켠 후, Save changes 버튼을 누른 후, 다시 시도해 본다.

    에러 메시지가 출력되지 않았으면 Test 버튼을 눌러서 사전 테스트할 수 있는데, 정상 동작하는 경우 Jenkins에서 빌드가 진행되는 것을 확인할 수 있다.

    혹시 빌드시에 ANSI color를 사용하는 경우에 Console Output으로 색깔이 제대로 표시되게 하려면, AnsiColor 플러그인을 설치한 후, Jenkins 관리에서 System 항목으로 들어가서 “ANSI Color” 섹션에서 “Global color map for all builds” 값을 디폴트 “xterm”으로 세팅하면 된다.

  6. 빌드 후에 이메일로 알림을 발송하려면 해당 프로젝트에서 구성 -> 빌드 후 조치 항목으로 이동하여 E-mail Notification 항목을 체크하면 빌드가 실패한 경우에 해당 committer에게 메일을 발송한다.
    빌드가 성공한 경우에도 메일을 발송하게 하려면, 바로 아래에 있는 Editable Email Notification 항목을 추가하면 된다.
    메일 수신인은 플러그인 설정에서 설정한 $DEFAULT_RECIPIENTS 리스트나 “Project Recipient List”에 설정된 주소를 사용한다. 또 “Triggers” 항목에서 메일을 발송하는 경우와 수신인을 세부 설정할 수 있다.

빌드시 clean 팁

빌드 시스템이 제대로 작성되지 않은 경우에는 기존에 빌드하였던 파일들이 남아 있는 상태에서는 빌드가 성공하고, 새로 git clone을 받은 상태에서는 (기존에 빌드하였던 파일들이 없는 상태) 빌드가 실패하는 경우가 있을 수 있다.
이런 경우에도 Jenkins에서 빌드 에러를 잡아낼 수 있으려면 빌드를 시작하기 전에 아래와 같이 clean을 추가해주면 된다.

git clean -xf > /dev/null

Jenkins 이메일 세부 설정

위 과정까지는 구글링을 해보면 많은 자료가 있는 편이라서 쉽게 따라할 수 있는데, 이메일의 내용을 세부 설정하는 방법은 찾기가 힘들어서 많은 삽질을 하였다. 😅

  • 이메일 제목 수정: Editable Email Notification에서 Default Subject 항목을 아래 예와 같이 수정한다. (즉, 디폴트 제목 뒤에 Git push 된 브랜치 이름을 추가했음)
    $DEFAULT_SUBJECT (branch: $GIT_BRANCH)
    
  • 이메일 내용 수정: Editable Email Notification에서 Default Content 항목을 아래 예와 같이 수정한다. (즉, 디폴트 내용 뒤에 Git push 된 브랜치 이름과 commit ID를 추가했음)

    <font style="font-family: 'Malgun Gothic'; font-size: 10pt;"><font color='#1f4e79'>
    $DEFAULT_CONTENT<br>
     - Git branch: $GIT_BRANCH<br>
     - Git commit: $GIT_COMMIT<br>
    </font>
    
  • 참고로 위에서 사용한 환경 변수들은 “Content Token Reference” 항목을 클릭하면 볼 수 있다. 또는 “빌드 유발” 섹션에서 “Build”에 있는 “the list of available environment variables” 항목을 클릭하면 볼 수 있다.
  • 그런데 위에서 메일 발송시에 Git push 된 commit의 로그 메시지도 보내게 하는 것이 까다로웠다. 플러그인에서 commit 로그 메시지를 갖는 variable을 제공하지 않기 때문인데, 일단 찾은 방법은 Environment Injector 플러그인을 이용하는 것이다. 이 플러그인을 설치한 후에, 아래와 같이 하면 된다.
    1. 처음 “Execute shell”에 아래 내용을 추가한다.
      echo COMMIT_MESSAGE=$(git show -s --format=%s) > ./temp.properties
      
    2. “Add build step” 버튼을 눌러서 Inject environment variables을 추가한 후, “Properties File Path”에 아래와 같이 추가한다.
      ./temp.properties
      
    3. 이제 Editable Email Notification에서 아래 예와 같이 Default Contnet 내용을 작성하면 된다.

      <font style="font-family: 'Malgun Gothic'; font-size: 10pt;"><font color='#1f4e79'>
      $DEFAULT_CONTENT<br>
       - Branch: $GIT_BRANCH<br>
       - Commit: $GIT_COMMIT<br>
       - Log: $COMMIT_MESSAGE<br>
      </font>
      

Jenkins pipeline 이용

빌드 및 이메일 발송을 위에서 기술한 방법과 같이 하는 것이 간단한 방법이긴 하지만, pipeline을 이용하여 Groovy 스크립트로 작성하면 좀 더 유연하고 확장성있게 구성할 수 있다.
Jenkins에서 새로운 item을 생성할 때, Pipeline이나 Multibranch Pipeline을 선택하면, Pipeline 항목에서 아래 2가지 중의 하나를 선택할 수 있다.

  • Pipeline script
  • Pipeline script from SCM

둘 다 Groovy 스크립트로 pipeline 내용을 기술하는 것인데, 전자는 Jenkins에 그 내용을 입력하는 것이고, 후자는 Git 저장소에 Jenkinsfile 파일을 유지하는 차이만 있다.

아래는 내가 위의 경우와 유사하도록 구성한 예제이다. (Groovy 문법을 몰라서 불편하였는데, VS Code의 Jenkins Doc 익스텐션을 이용하니 도움이 되었다.)

node {
    stage('Checkout') {
        checkout scm
    }    
    stage('Build') {
        sh `git clean -xf > /dev/null`
        sh 'make clean'
        sh 'make'
    }
    stage('Email') {
        def emailBodyPre = "<font style=\"font-family: 'Malgun Gothic'; font-size: 10pt;\"><font color='#1f4e79'>"
        def emailBodyPost = "</font>"
        def commitId = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%H'").trim()
        def commitLog = sh(returnStdout: true, script: "git show -s --format=%s").trim()
        emailext (
            mimeType: "text/html",
            recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']],
            subject: '${DEFAULT_SUBJECT}',
            body: "$emailBodyPre" + ' ${DEFAULT_CONTENT}<br>Commit: ' + "$commitId" + '<br>Log:' + "$commitLog" + "$emailBodyPost",
        )
    }
}

Pipeline으로 구성하면 각 stage 별로 상태와 로그를 쉽게 확인할 수 있었다.

TeamCity

참고로 JetBrains 사에서 Jinkins 보다 훨씬 더 예쁘고 편리한 TeamCity를 Professional 버전에 대하여 무료로 공개하였다.
Linux 소스를 다운받아서 압축을 푼 다음에 TeamCity/bin/ 디렉토리로 이동한 후, 아래와 같이 실행시키기만 하면 된다. (Jenkins에 비해 dependency 이슈 없음)

$ sudo sh runAll.sh start &

웹페이지에 접속하여 계정 생성한 후, 프로젝트 생성하고 Email 발송되도록 세팅하는데까지 시간이 얼마 소요되지 않을만큼 기능이 좋고 편리하였다. (예를 들어 빌드 중에 ANSI color를 사용할 때 색깔이 제대로 나오게 하려면 Jenkins에서는 AnsiColor 플러그인을 설치했어야 되었는데, TeamCity에서는 그냥 디폴트로 제대로 표시되었다)

기존에 Jenkins를 사용 중이었다면 TeamCity로 이전하는 것도 고려할만한 것 같다.

카테고리:

업데이트: