[AzureDevops] CI-CD Pipeline 구축 테스트
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, 배포위치 등을 손쉽게 선택하여 파이프라인의 뼈대를 쉽게 생성할 수 있다.
사용자의 구독에 운영중인 자원들을 손쉽게 선택할 수 있다.
필자는 AKS 에 배포할 것으로 Deploy to Azure Kubernetes Service 를 선택한 뒤, 구독정보, 클러스터이름, 네임스페이스 지정, 이미지이름 등을 선택을 하면, Review 화면에서 자동생성된 pipeline을 볼 수 있게된다.
이렇게 기본적으로 소스 빌드/푸쉬가 프로세스를 확인할 수 있다.
이제 입맛에 맞게 수정해보자.
파일 위치
생성을 하면 기본적으로 최상단('/')에 azure-pipelines.yml 이라는 파일명으로 생성하게 된다.
실행 조건 (trigger)
소스 코드 상단에 trigger 옵션이 자동으로 지정되어 main 브랜치에 소스변경 이벤트가 감지되면 자동으로 파이프라인이 실행된다.
추가적으로 save를 한 뒤 Edit Pipeline을 누른 후, 우측 상단에 [...] 버튼을 클릭하여 Triggers 를 눌러보면,
기본적으로 Triggers가 활성화 되어 있기 때문에 불필요하면 여기서 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에서 검색해보면 거의 모든(?) 파이프라인이 이미 구성되어있어 이름만 맞춰주면 된다.
# 만들어진 샘플
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 Authorization은 basic 방식으로 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 배포도 잘 정리해 두었으니 곧 포스팅하겠다.