ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jenkins pipeline에 Slack 연동하기
    Devops/jenkins 2020. 6. 9. 12:38

    들어가며

    Jenkins 파이이프라인에 Slack 을 연동하는 방법에 대해 알아보자. Slack은 커뮤니케이션 도구로 프로젝트 팀내에서 협업용 툴로 널리 사용되고 있다. Slack 은  workspace라는 하나의 작업 공간을 생성 할 수 있다. 여기에 멤버들을 초대하여 공동 작업을 하게 된다. 멤버를 선택하여 1:1 대화를 할 수 도 있고  channel 이라는 별도의 채팅방을 열어서 공동 채팅도 가능하다. Channel 사용시 전체 멤버들 뿐만 아니라 일부 멤버들만 초대하여 비공개로 톡을 할 수 있는 기능도 제공한다.

    jenkins 와 연계를 하기 위해서는 별도의 기능이 필요하다. 다행히도 Slack은 jenkins-ci라는 플러그인 앱을 제공한다. 이 앱을 이용하면 jenkins 와 통합을 손쉽게 할 수 있게 된다. 슬랙과 연동하기 위해서는 jenkins 에도 또한 추가적인 plug-in을 설치해야 한다.

     

    대부분의 연동 문서는 jenkins 설정으로 빌드 단계 후킹을 통해 알람 메시지를 slack 채널에 전송하는 방법에 대한 가이드이다. 하지만 여기서는 jenkins 파이프라인에 직접 코딩하여 메시지를 전달하는 방법을 소개할 예정이다. 이와 같이 할 경우 소스코딩을 통해 슬랙에 전달할 메시지를 제어하는 장점이 있게 된다. 다시말해, 젠킨스 설정과 무관하게 Slack 과 메시지 통합이 가능하게 되는 것이다.

     

    [단계]

    • Slack channel 추가하기 ( Slack 설정)
    • Jenkins 플러그인 설치 및 슬랙 연동 설정하기 (Jenkins 설정)
    • Jenkins 파이프라인 스크립트 작성하기 (Pipeline 코드 작성)
    • 결과 확인하기

     

    Slack channel 추가하기 (Slack 설정)

    Slack  설정을 진행해 보자. 연계에 필요한 App을 설치하고 메시지를 받을 channel를 선택하게 되면 필요한 토큰 정보가 생성된다.

    1. Slack App 추가하기

    슬랙 메신저는 왼쪽에 워크스페이스가 있고 그 다음에는 채널과 대화를 나누는 멤버들의 목록이 나온다. 그리고 3번째 항목에 대화 내용을 확인할 수 있는 UI구조로 되어 있다. 두번째 항목의 상단에 보면 Apps 라는 메뉴가 있는데 이를 클릭한다.

    Apps 항목의 상세 화면이다. 하단에 'Browse App Directory'라는 버튼을 클릭하면 슬랙 설정 화면으로 이동할 수 있다. 화면은 웹 브라우저에서 열리게 된다.

    기본으로 설정된 웹 브라우저 화면이다. 오른쪽 상단을 보면 워크스페이스를 선택 할 수 있다. 연동을 원하는 워크 스페이스를 선택한다. 화면 중앙에 앱을 검색할 수 있는 검색창이 보인다. 여기에 'jenkins'라고 입력 하면 'Jenkins CI' 앱이 검색 된다. 앱을 선택 한다.

     

      Jenkins CI이 앱이 선택된 상세화면이다. 'Add to Slack' 버튼을 클릭하여 Jenkins CI 의 설정 페이지로 이동한다.

    2. 채널 추가하기(Jenkins CI Configuration)

    Jenkins CI 설정화면이다. 화면 중앙에 있는 셀렉트 박스에서 jenkins와 연계할 채널을 선택한다. 아직 채널을 만들기 전이라면 슬랙 메신저에서 연계할 채널을 생성한 후 다시 이 과정을 진행 한다. 채널을 선택 하였으면 'Add Jenkins CI integration'  버튼을 클릭하여 다음 과정을 진행 한다.

    3. 슬랙 연계 정보 (토큰정보)

    Integration 설정 정보 페이지 이다. Jenkins와 어떻게 연계하는지에 대한 가이드 정보를 제공한다. 그리고 토큰 정보와 설정된 정보를 보여준다. Step 3에 보면 2가지 중요한 정보가 있다. 

    • Team Subdomain : 워크스페이스 명
    • Integration Token Credential ID : 젠킨스에서 사용할 슬랙 토큰 정보

     

    토큰 정보를 별도의 텍스트 파일에 복사한다. 향후 토큰 정보를 갱신하거나 채널을 변경할 경우 이 페이지에서 수정할 수 있다.  설정을 변경 한 후 하단의 '저장' 버튼을 클릭하여 변경된 사항을 저장한다.

     

     

    Jenkins 플러그인 설치 및 슬랙 연동 설정하기 (Jenkins  설정)

    jenkins 설정을 진행한다. Slack과 연계를 위해 plug-in을 설치한다. Slack 에 접속 하기 위한 인증정보(Credential)을 생성하고 설치된 plug-in 기능을 이용하여 접속 테스트를 진행한다. 

     

    1.  슬랙 연동용 플러그 인 설치

    슬랙과 연계하기 위해 연계 플러그인을 설치 하여야 한다. Jenkins에 관리자로 로그인을 한다. 왼쪽 메뉴에서 'Manage Jenkins'를 클릭한다. Manage Plugins를 클릭한 후 'Available' Tab 에서 'Slack Notification Plugin'을 검색하여 설치한다.

    2. 슬랙용 Crendential 생성하기

    슬랙에 접속하기 위한 인증정보를 생성한다. Manage Jenkins > Configuration System 메뉴로 이동 한다. 

    Configuration System의 Slack 섹션으로 이동한다. Credential 항목란에 'Add' 버튼을 클릭하면 jenkins라는 서브 항목이 출력된다. 이를 클릭하여 인증생성 창으로 이동한다.

    인증 생성 창이다. Kind항목에서 'Secret text'를 선택한다. 'Secret' 항목에 슬랙에서 생성한 토큰 정보를 복사하여 넣는다. ID는 슬랙용임을 알려주는 아이디로 작성한다. Description도 슬랙 연동용 아이디임을 나타내도록 작성 한다. 'add' 버튼을 클릭하여 슬랙용 인증 정보를 생성한다.

    3. 슬랙 정보 설정 및 연계 테스트

    Credential 항목에서 생성한 인증 정보를 선택한다. Workspace에는 슬랙에서 사용할 워크스패이스 명을 넣는다. Default channel/member id 항목에는 연계할 채널명을 넣도록 한다. 'Test Connection' 버튼을 클릭하여 연계가 잘 되는지 확인한다. 'Success' 메시지가 나와야 한다.

     

     

    Jenkins 파이프라인이 스크립트 작성하기 (Pipeline 코드 작성)

    Jenkins 파이프라인 코드를 작성해 보자. 공통으로 사용할 Slack 전송 메소드를 글로벌 영역에 선언한다. Stage 단계별 필요한 시점에 공통함수를 호출하여 메세지를 전달하도록 코딩한다.

     

    1. Slack 호출 함수 정의

    제일 먼저 작성하는 스크립트는 jenkins 파이프라인 상단에 슬랙을 호출하는 함수이다. 본 예제에서는 notifySlack이라는 명으로 작성 하였다.  status  와 color 를 인자값으로 하는 함수 이다. status 에는 'SUCCESS' or 'FAILED' or 'STARTED' 등의 문자열을 전달할 예정이다. color에는 RGB 값으로 상태에 따라 다른 색을 표현할 계획이다.

    함수 내부에 있는 channel 속성 값에는 연계를 위해 slack에 추가한 채널명을 기입한다. tokenCredentialId에는 좀전에 생성한 젠킨스 인증 정보를 넣는다. 여기에서는 'slack-id'로 작성 하였다.  teamDomain에는 슬랙 채널이 소속된 워크스페이스(workspace)명을 넣으면 된다.

    slackSend라는 메소드는 위의 정보를 참조하여 슬랙채널에 메시지를 보내게 된다. 제일 먼저 슬랙채널에 접속하여 생성된 정보로 인증을 받는다. 인증이 실패된 경우 에러 메시지가 출력된다. 이때, 파이프라인은 계속 진행되게 된다.

     

    팁) 인증이 실패된 경우는 '슬랙정보 연계 및 테스트' 에서 제시한 가이드를 다시 수행한다.  접속 테스트 결과 '성공' 이라는 메시지가 리턴되어야 정상적인 인증이 이루어 지게 되었음을 확인할 수 있다.


    인증에 성공하면  설정된 채널에 메시지를 전송하게 된다.

    def notifySlack(STATUS, COLOR) {
        slackSend channel: '#채널명', 
    	message: STATUS+" : " + "${env.JOB_NAME}[${env.BUILD_NUMBER}] (${env.BUILD_URL})", 
    	color: COLOR, tokenCredentialId: '젠킨스에서 작성한 Slack용 Credential', 
    	teamDomain: 'slack 워크스페이스명'
    }

     

    2. Stage별 메시지 전송

    빌드 메시지를 전송하는 코드를 작성한다. 본 예제에서는 빌드가 시작될때 시작을 알리는 메시지와 성공/실패시 각각 상태를 알리는 메시지를 작성할 예정이다.  예제 코드에서는 제일 먼저 파이프라인이 시작 되었음을 알리는 시작 메시지를 전송한다. 다음에는 try ~ catch  문을 사용하여 에러 발생시에 실패 메시지를 전송하고, 각 과정이 정상적으로 완료 되었을 경우 성공 메시지를 보내도록 작성 하였다.

     

    node(label) {
    	try {
            // 빌드 시작을 알리는 메시지
            notifySlack("STARTED", "#0000FF")
    
            // 빌드 과정
            stage('빌드') { ... }
            stage('도커라이징') { ... }
            stage('배포') { ... }
    
            // 빌드 성공시
            notifySlack("SUCCESS", "#00FF00")
     	} catch(e) {
        	// 빌드 실패시
            notifySlack("FAILED", "#FF0000")
    	}
    }
            
    

     

    결과 확인하기

    1. Slack 메지시 확인 하기

    젠킨스에서 파이프라인을 실행 시키면 제일 먼저 시작을 알리는 메시지가 전송되고 슬랙은 설정된 채널에 메시지를 보여준다. 시작시 RGB 색을 파란색으로 설정하였는데 STARTED 문구 앞에 해당 색이 보여진다. 작업이 성공적으로 완료 되었으면 완료됨을 알리는 메시지가 다시 전송 된다.

     

    맺음말

    Jenkins 파이프라인에 slack을 연동하여 파이프라인 빌드별 메세지를 전송 하도록 구현했다. 슬랙과 젠킨스에 각각 연동 플러그 인을 설치하고 몇개의 설정만으로 jenkins와 slack는 쉽게 연계된다. 슬랙의 토큰은 설정 화면에서 언제든지 재설정 가능하며, 채널 또한 변경 할 수 있다. 슬랙의 토큰 정보를 이용하여 jenkins 관리 화면에서  slack용 인증 아이디를 만든다.  이를 이용하여 jenkins에서 slack에 접속한다. 슬랙 인증이 성공하면 다음에는 jenkins 파이프라인의 장점인 자유로운 코드 작성으로 원하는 메시지를 언제든 슬랙 채널에 전송할 수 있게 된다. 

    댓글

Designed by Tistory.