엔지니어링/CI-CD

[AzureDevops] CI-CD Pipeline 구축 테스트

joon95 2022. 12. 6. 21:08
반응형

11월 3주간 Github Actions 과 AzureDevops 두 개의 CI-CD Pipeline 구축테스트를 진행하였고

Rest API 호출 방법까지 케이스를 정리해보았다.

 

AzureDevops 도 GHES와 같이 Private 용도의 Server를 제공하며,

별도의 Self-Hosted Runner를 이용할 수있다.

 

AzureDevops URL은 dev.azure.com/{Organization}/{Project} 로 들어갈 수 있다.

 

기초적인 파이프라인 생성방법

Pipelines 메뉴에 들어가 repository, 배포위치 등을 손쉽게 선택하여 파이프라인의 뼈대를 쉽게 생성할 수 있다.

pipeline Create Git Repository Target
repository select
Choice Deploy Target

사용자의 구독에 운영중인 자원들을 손쉽게 선택할 수 있다.

필자는 AKS 에 배포할 것으로 Deploy to Azure Kubernetes Service 를 선택한 뒤, 구독정보, 클러스터이름, 네임스페이스 지정, 이미지이름 등을 선택을 하면, Review 화면에서 자동생성된 pipeline을 볼 수 있게된다.

Auto Configuration Pipeline

이렇게 기본적으로 소스 빌드/푸쉬가 프로세스를 확인할 수 있다.

이제 입맛에 맞게 수정해보자.

 

파일 위치

생성을 하면 기본적으로 최상단('/')에 azure-pipelines.yml 이라는 파일명으로 생성하게 된다.

 

실행 조건 (trigger)

소스 코드 상단에 trigger 옵션이 자동으로 지정되어 main 브랜치에 소스변경 이벤트가 감지되면 자동으로 파이프라인이 실행된다.

 

추가적으로 save를 한 뒤 Edit Pipeline을 누른 후, 우측 상단에 [...] 버튼을 클릭하여 Triggers 를 눌러보면,

기본적으로 Triggers가 활성화 되어 있기 때문에 불필요하면 여기서 Disable 해주면된다.

Trigger Disable

 

 

실행시 변수 입력

파이프라인 실행 당연히 배포할 태그명이나 브랜치정보들을 변수화하여 받아와야하니 설정해보자.

우측 상단에 Variables 버튼을 누르면 변수를 정의할 수 있는 우측 창이 하나 나온다.

New variable 을 클릭해 변수를 생성해보자.

변수명은 'MY_TAG'

default 값은 sample-001 로 주었다.

그리고 Let users override this value when running this pipeline 버튼을 클릭해 파이프라인 실행시 값을 덮어쓸 수 있게 해주자.

추가로 밑에 script에서 사용할 수 있는 방법이 나오니 변수 확인용으로 찍어봐도 된다.

 

CI pipeline (Spring App)

이후 파이프라인 구성은 정말 쉽게 할 수 있도록 되어있다.

예를 들면 필자가 maven 기반의 Springboot Application 을 git에 올려두어서 소스를 package 하는 명령어를 사용하고 싶다면, 우측 Tasks에서 검색해보면 거의 모든(?) 파이프라인이 이미 구성되어있어 이름만 맞춰주면 된다.

AzureDevops Pipelien Tasks

# 만들어진 샘플

resources:
- repo: self

variables:
  dockerRegistryServiceConnection: '*************'
  imageRepository: 'spring-app'
  containerRegistry: '**********.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  imagePullSecret: '************acr34208459-auth'
  vmImageName: 'ubuntu-latest'
  branch: 'spring'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    
    - task: Maven@4
      displayName: Maven Build
      inputs:
        mavenPomFile: 'pom.xml'
        publishJUnitResults: true
        testResultsFiles: '**/surefire-reports/TEST-*.xml'
        javaHomeOption: 'JDKVersion'
        mavenVersionOption: 'Default'
        mavenAuthenticateFeed: false
        effectivePomSkip: false
        sonarQubeRunAnalysis: false
        
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(MY_TAG)

 

파이프라인 실행

이제 파이프라인을 실행해보자!

run 즉시엔 클라우드서버의 image를 사용하기에 잠시 Not started 상태였다가 기다리면 시작된다.

Stage를 클릭하여 들어가보면 각 job마다 log가 찍힌다.

필자가 변수에 집어넣은 값으로 실제 이미지가 ACR(Azure Container Registry)에 푸쉬되었다.

 

Rest API

azureDevOps api 버전이 변경되기 때문에 rest api 사용시 꼭 버전을 지정해야한다.

 

PAT(Personal Access Token)

먼저 PAT(Personal Access Token)을 발급 받아야 한다.

토큰을 발행 해준다. pipeline 쪽 권한을 부여하였다.

 

호출 Data 작성

URL : dev.azure.com/{조직}/{프로젝트명}/_apis/pipelines/{pipeline_id}/runs?api-version=7.0

Header Authorizationbasic 방식으로 username:password base64 인코딩한 값이다.

body 에는 branch, variable 을 json 규격에 맞게 보내면 된다.

curl --location --request POST \
'https://dev.azure.com/joon95/**************-poc/_apis/pipelines/4/runs?api-version=7.0' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ***************************' \
--data-raw '{
    "resources": {
        "repositories": {
            "self": {
                "refName": "refs/heads/main"
            }
        }
    },
    "variables": {
        "MY_TAG": {
            "isSecret": false,
            "value": "AZ-DEVOPS-POSTMAN-22.11.28"
        }
    }
}'

이렇게 작성하여 요청을해보면 내가 요청한 MY_TAG 값으로 이미지가 빌드/푸쉬 되는걸 확인할 수 있다.

 

마치며.

이번 설명엔 azureDevops 캡처 이미지가 너무 많아서

파이프라인 중간에 사용자가 개입하여 승인/거절 (approve) 프로세스는 다음 포스팅에 정리하려 한다.

Blue/Green 배포도 잘 정리해 두었으니 곧 포스팅하겠다.

반응형