Customize Azure Pipeline YAML

2022. 7. 21. 16:39TIL💡/Others

요즘 DevOps 관련된 곳에서 YAML 파일을 자주 사용하는데, 여전히 방법을 잘 몰라서 조금씩 정리를 해보고 있다.

그리고 이번에 맡은 task가 파이프라인 상에서 코드 커버리지를 올리는 일이기에 익숙해져야 했다.

 

파이프라인은 YAML 파일을 통해 정의된다. 주로 이 파일은 azure-pipelines.yml이며, 레포의 root에 위치한다.

 

YAML 파일의 내용을 같이 보자.

trigger:
 - main

 pool:
   vmImage: 'ubuntu-latest'

 steps:
 - task: Maven@3
   inputs:
     mavenPomFile: 'pom.xml'
     mavenOptions: '-Xmx3072m'
     javaHomeOption: 'JDKVersion'
     jdkVersionOption: '1.11'
     jdkArchitectureOption: 'x64'
     publishJUnitResults: false
     testResultsFiles: '**/surefire-reports/TEST-*.xml'
     goals: 'package'

이 파이프라인은 팀이 change를 main 브랜치에 push하거나 PR을 생성할 때 언제든지 실행된다.

이는 Microsoft-hosted Linux machine에서 실행되고, 이 파이프라인 프로세스는 Maven task를 실행하는 하나의 step을 가지고 있다.

 

Change the platform to build on

우리는 이미 SDK와 도구들이 포함된 Microsoft-hosted agent에 프로젝트를 빌드할 수 있다. 아니면 self-hosted agent를 사용할 수도 있다.

 

 pool:
   vmImage: 'windows-latest'

 

Add steps

우리는 더 많은 scripts나 tasks를 pipeline에 step으로 추가할 수 있다.

task는 미리 패키징된 스크립트이다.

우리는 task를 사용해 어플리케이션을 빌드, 테스트, 퍼블리시, 그리고 배포까지할 수 있다.

Java에서 우리가 사용한 Maven task는 테스트하고 결과를 퍼블리시하며, 우리는 코드 커버리지 결과 또한 퍼블리시하는 데 task를 사용할 수 있다.

 

- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: "JaCoCo"
    summaryFileLocation: "$(System.DefaultWorkingDirectory)/**/site/jacoco/jacoco.xml"
    reportDirectory: "$(System.DefaultWorkingDirectory)/**/site/jacoco"
    failIfCoverageEmpty: true

Build across multiple platforms

우리는 프로젝트를 여러 플랫폼에 빌드하고 테스트할 수 있다. 이를 위한 방법 중 하나로 strategy와 matrix를 사용하는 방법이 있다.

우리는 variable을 사용해 편리하게 데이터를 다양한 부분에 입력시킬 수 있다. 예를 들어 아래와 같이 우리가 사용하고 싶은 image의 이름을 전달할 수 있다. 이렇게 실행하면 우리는 3개의 job을 각각 다른 플랫폼에서 실행해볼 수 있다.

strategy:
  matrix:
    linux:
      imageName: "ubuntu-latest"
    mac:
      imageName: "macOS-latest"
    windows:
      imageName: "windows-latest"
  maxParallel: 3

pool:
  vmImage: $(imageName)

Build using multiple versions

프로젝트를 언어의 다른 버전을 이용해 빌드하기 위해서는 matrix와 variable를 사용할 수 있다.

 

💡 NOTE
strategy를 하나의 context에서 여러 번 사용할 수 없다.

만약 하나의 플랫폼에서 여러 버전을 빌드하고 싶다면, vmImage 다음에 Maven task를 작성하기 이전에 matrix를 아래와 같이 입력하라.

 

strategy:
  matrix:
    jdk10:
      jdkVersion: "1.10"
    jdk11:
      jdkVersion: "1.11"
  maxParallel: 2

그리고 maven task를

jdkVersionOption: "1.11"

에서 아래와 같이 변경하라.

jdkVersionOption: $(jdkVersion)

만약 여러 플랫폼에서 각기 다른 버전을 빌드하고 싶다면, yml 파일의 전체 내용을 아래와 같이 교체하라.

trigger:
- main

strategy:
  matrix:
    jdk10_linux:
      imageName: "ubuntu-latest"
      jdkVersion: "1.10"
    jdk11_windows:
      imageName: "windows-latest"
      jdkVersion: "1.11"
  maxParallel: 2

pool:
  vmImage: $(imageName)

steps:
- task: Maven@3
  inputs:
    mavenPomFile: "pom.xml"
    mavenOptions: "-Xmx3072m"
    javaHomeOption: "JDKVersion"
    jdkVersionOption: $(jdkVersion)
    jdkArchitectureOption: "x64"
    publishJUnitResults: true
    testResultsFiles:"**/TEST-*.xml"
    goals: "package"

Customize CI triggers

파이프라인 트리거는 파이프라인이 실행하는 것을 유발한다.

우리는 브랜치에 업데이트를 push할 때마다 trigger:로 파이프라인을 실행한다.

 

YAML 파이프라인은 기본적으로 디폴트 브랜치에 트리거되도록 구성되어있다.

우리는 트리거를 특정한 브랜치나 PR 검증에 실행되도록 셋업 가능하다. PR 검증에는 단지 trigger:가 아니라 pr:로 교체하면된다.

기본적으로 파이프라인은 매 PR 변화때마다 실행된다.

pr:
  - main
  - releases/*

우리는 구체적으로 풀네임으로도 가능하고, 와일드카드로도 브랜치 지칭이 가능하다.

 

Pipeline settings

YAML 파일에서 관리되지 않는 파이프라인 설정이 있다. 예를 들어 YAML 파일의 위치나 파이프라인 활성화 상태 같은 것들이다.

이러한 설정들을 구성하기 위해서는 pipeline details page로 가서 More actions를 선택하면 된다.

 

https://docs.microsoft.com/en-us/azure/devops/pipelines/customize-pipeline?view=azure-devops 

 

Customize your pipeline - Azure Pipelines

Step-by-step tutorial to customize a pipeline

docs.microsoft.com

https://docs.microsoft.com/en-us/azure/devops/pipelines/ecosystems/python?view=azure-devops 

 

Build and test Python apps - Azure Pipelines

Automatically build and test Python apps with Azure Pipelines

docs.microsoft.com