Azure와 함께 하는 DevOps

57. Jenkins CI를 위한 CD 파이프 라인 구성하기 2편

zerobig-k8s 2020. 11. 9. 07:46

<참조> https://azuredevopslabs.com/labs/vstsextend/Jenkins/

 

 

 

 

 

접근 방식 1 : Azure DevOps에서 service hook를 통해 CI 트리거하기

이 접근 방식에서는 코드 커밋시 Jenkins 빌드를 트리거하도록 Azure DevOps에서 service hook가 구성된다. service hook를 사용하면 Azure DevOps Services 프로젝트에서 이벤트가 발생할 때 다른 서비스에서 태스크를 수행 할 수 있다.

1. service hook를 구성하려면 Azure DevOps 프로젝트 설정 페이지로 이동하고 General에서 Service hooks을 선택한다. + Create subscription를 선택한다.

 

 

2. New Service Hook Subscriptions 화면에서 Jenkins 옵션을 선택하고 다음 버튼을 누르십시오. Jenkins 서비스는 Build completed, Code Pushed, Pull request merge attempted 및 Release deployment completed 등 네 가지 이벤트를 지원한다. 코드 푸시 이벤트에만 관심이 있으므로 Trigger for this type event 필드에서 Code pushed를 선택한다. MyShuttle 리포지토리를 선택하고 Next를 누른다.

 

 

3. Select and configure the action to perform 화면에서 다음 세부 정보를 제공한다.

a. Trigger generic build 옵션을 선택한다.

b. Jenkins 기본 URL을 Http://{ip address}:8080 형식으로 제공한다.

c. 빌드를 트리거하려면 User name User API Token을 제공한다. 사용자 이름과 토큰은 Jenkins 사용자의 자격 증명이다. 토큰 사용을 위해 Jenkins에서 이전에 생성 된 API 토큰을 사용한다.

d. Jenkins에서 생성한 Build 잡을 선택한다 (이미 되어있음).

 

 

4. Test 버튼을 클릭하여 구성을 확인한 다음 Finish를 클릭한다. 그러면 소스 코드 변경이 저장소에서 커밋 될 때마다 Jenkins CI 빌드를 시작하는 트리거가 설정한다.

 

5. 코드에 대한 커밋을 시도한다. src/main/webapp/index.jsp가 좋은 후보가 될 것이다. \

 

그러면 Jenkins에서 MyShuttle 빌드가 트리거 된다. 

 

 

(Azure DevOps의) Jenkins service hook의 내역 탭을 확인하여 확인할 수 있다.

 

 

 

 

접근 방식 2 : Azure Pipelines 내에서 Jenkins 잡 래핑하기

이 접근 방식에서 Jenkins CI 잡은 Azure CI 파이프라인 내에 중첩된다. 이 접근 방식의 주요 이점은 작업 항목에서 소스 코드에 이르는 종단간 추적성을 통해 파이프라인을 빌드 및 릴리즈할 수 있다는 것이다.

시작하려면 Azure DevOps와의 통신을 위해 Jenkins 서버에 대한 엔드포인트가 구성된다.

1. 프로젝트 설정으로 이동하십시오. Pipelines  Service connections을 선택하고 New service connection을 클릭한 다음 드롭 다운에서 Jenkins를 선택한다.

 

2. 연결 이름, Jenkins 서버 URL을 http://[server IP address]:8080 형식으로 제공하고 Jenkins 사용자 이름에 암호를 입력한다(Jenkins User API 토큰을 암호로 사용). Verify Connection을 선택하고 구성의 유효성을 확인한다. 성공적이면 Ok을 선택한다.

 

다음 단계는 빌드 파이프라인을 구성하는 것이다.

 

 

3. Pipelines | Pipelines로 이동하여, New Pipeline을 클릭하여 새 빌드 정의를 만든다.

 

4. Use the classic editor를 사용하여 YAML 없이 파이프라인 생성을 선택한다.

 

 

5. Myshuttle 프로젝트, 저장소를 선택하고 Continue을 클릭한다.

 

6. 아래로 스크롤하여 표준 Jenkins 템플릿을 선택한 다음 Apply를 클릭한다.

 

 

7. 에이전트 사양으로 vs2017-win2016을 선택하고 잡 이름 (Jenkins에서 생성된 빌드 정의의 이름)으로 MyShuttle을 제공한 다음 이전에 생성된 Jenkins 서비스 엔드포인트를 선택한다.

 

 

8. 다음으로 Get Sources 단계를 선택한다. Jenkins는 빌드에 사용되고 있기 때문에 빌드 에이전트에 소스 코드를 다운로드할 필요가 없다. 에이전트와의 동기화를 건너뛰려면 Don’t sync sources 옵션을 선택한다.

 

9. 다음으로 Queue Jenkins Job 단계를 선택한다. 이 태스크는 Jenkins 서버에서 잡을 대기열에 넣는다. 서비스 엔드포인트와 잡 이름이 올바른지 확인한다. 이 단계에서 사용할 수 있는 Capture console output  및 Capture pipeline output 옵션이 선택된다.

Capture console output and wait for completion 옵션이 선택되면 Azure 빌드 파이프라인이 실행될 때 Jenkins 빌드 콘솔의 출력을 캡처한다. 그 빌드는 젠킨스 잡이 완성될 때까지 기다릴 것이다. Capture pipeline output and wait for pipeline completion 옵션은 매우 유사하지만 젠킨스 파이프라인(함께 두 개 이상의 잡이 중첩된 빌드)에 적용된다.

 

10. Jenkins Download Artifacts 태스크는 Jenkins 잡에서 스테이징 디렉토리로 빌드 아티팩트를 다운로드 한다.

 

11. Publish Artifact drop은 Azure Pipelines에 게시된다.

 

12. Save & queue 버튼을 클릭하여 새 빌드를 저장하고 시작한다.

 

 

 

CD 파이프라인에서 배포를 위해 빌드 아티팩트 연결하기

다음으로, Azure CD 파이프라인을 구성하여 빌드에서 만들어진 아티팩트을 가져오고 배포한다. Azure에 배포가 수행되고 있으므로 Azure에 대한 엔드포인트가 구성될 것이다. 이전에 구성되지 않은 경우 Jenkins 서버의 엔드포인트도 구성될 것이다.

1. 엔드포이트를 만든 후 Azure Pipelines Releases 탭으로 이동한다. +New를 클릭하고 New release pipeline을 선택하여 새 릴리즈파이프라인을 만든다.

 

2. Azure App Service Deployment 템플릿을 선택한다.

 

 

3. 배포를 위한 기본 환경은 Dev로 이름이 지정될 것이다.

 

 

4. Pipeline 탭의 Artifacts 섹션에서 + Add 링크를 선택하여 빌드 아티팩트를 선택한다.

a. 첫 번째 접근 방식을 사용한 경우, Jenkins를 Source type으로 선택하고 이전에 구성된 Jenkins 엔드포인트를 선택한 후 Source(Job)에 MyShuttle을 제공한다. 소스(Job)는 Jenkins에 구성된 프로젝트 이름에 매핑되어야 한다.

Jenkins 서버와 소스 위치가 올바르게 구성된 경우 아티팩트 게시가 완료되면 출력 파일 이름이 myshuttledev.war인 메시지가 표시된다.

 

b. 그렇지 않으면 Jenkins CI가 실행되는 Azure CI 빌드 파이프라인을 가리킨다.

 

 

5. 이제 아티팩트가 배포를 위해 연결되었다. Azure App Service에 WAR 파일을 배포하려면 Azure에 Java 기반 톰캣 애플리케이션 배포하기를 참조한다. 

 

실습1 부터 실습2까지  진행하여 다음 리소스를 생성하여 준비한다.

 

 

실습 3에서는 스텝4의  Release 파이프라인 구성부터 진행하면 된다.

 

먼저 기존 artifact을 삭제 후 Jenkins로 설정한다. 

 

 

Execute Azure MySQL : SqlTaskFile 태스크에서 다음과 같이 DB 서버관련 정보를 선택 및 입력하고 MySQL Script 파일의 위치를 찾아 선택한다.

 

 

 

Deploy Azure App Service 태스크에서 다음과 같이 웹 앱 관련 정보를 선택 및 입력하고 myshuttledev.war 파일의 위치를 찾아 선택한다.

 

 

Save를 클릭한 다음 +Release | Create Release를 클릭하여 새 릴리즈를 시작한다.

 

릴리즈가 완료되면 웹 앱의 URL에 /myshuttledev을 붙여 접근한다.

 

https://jenkinsintdemo.azurewebsites.net/myshuttledev/

 

 

로그인을 선택하고 다음 자격 증명 중 하나로 사이트에 로그인 해본다.

Username Password
fred fredpassword
barney barneypassword

 

 

문제가 없다면 다음과 같은 화면을 확인할 수 있다.

 

 

랩을 마무리 하면 리소스를 정리하여 과금 발생을 방지한다.