[Jenkins] Jenkins Pipeline Artifacts 활용하기

Jenkins 에서는 Artifact 플러그인 기능을 사용하여 생성된 Artifact를 저장하거나 복사하여 필요한 프로젝트 및 빌드에서 사용할 수 있습니다. Jenkins Pipeline에서 Artifacts 기능을 활용하는 방법을 알아봅시다.

 

 

Artifacts 정의

우선 Artifacts 기능을 활용하기 전에 Artifacts에 대한 정의를 알아봅시다.

 

위키백과에서는 Artifacts를 소프트웨어 개발 과정에서 생성되는 다양한 유형의 부산물 중 하나라고 설명하고 있습니다. 일부 Artifacts(예: 사용 사례, 클래스 다이어그램 및 기타 UML(Unified Modeling Language) 모델, 요구 사항 및 디자인 문서)는 소프트웨어의 기능, 아키텍처 및 디자인을 설명하는 데 도움이 되고, 다른 Artifacts는 프로젝트 계획, 비즈니스 사례 및 위험 평가와 같은 개발 프로세스 자체와 관련이 있다고 설명하고 있습니다.

https://en.wikipedia.org/wiki/Artifact_(software_development)

 

Artifact (software development) - Wikipedia

From Wikipedia, the free encyclopedia An artifact is one of many kinds of tangible by-products produced during the development of software. Some artifacts (e.g., use cases, class diagrams, and other Unified Modeling Language (UML) models, requirements and

en.wikipedia.org

 

소프트웨어 개발 과정에서 생성되는 다양한 형태의 요소들을 모두 Artifacts로 정의하고 있으며 제 개인적인 생각으로는 소스 코드를 통해 생성되는 실행(바이너리) 파일 및 라이브러리들이 이와 같다고 생각됩니다.

 

 

Artifact 플러그인 설치

Artifact 기능을 사용하기 위해 Copy Artifact 플러그인을 설치해줍니다. 플러그인은 "Jenkins 관리 -> 플러그인 관리" 메뉴에서 설치가 가능합니다.

Copy Artifact 플러그인을 설치 완료하면 Pipeline에서 archiveArtifacts{} 구문과 copyArtifacts{} 구문을 사용할 수 있습니다.

 

 

Artifact 사용

Pipeline에서 archiveArtifacts{} 구문을 사용하여 실행(바이너리) 파일 및 라이브러리들을 저장하고, copyArtifacts{} 구문을 사용하여 저장되어있는 Artifact 파일들을 복사하여 필요한 프로젝트 및 빌드에서 사용할 수 있습니다.

 

Artifact 저장 (archiveArtifacts)

저장할 파일 경로 또는 패턴을 필수 값인 artifacts을 통해 지정할 수 있으며 optional을 통해 추가적인 옵션을 추가할 수 있습니다. 기본적인 구문은 아래와 같이 사용됩니다.

 

*.txt로 끝나는 파일들을 Artifact에 저장하는 설정입니다.

archiveArtifacts artifacts: '**/*.txt', (optional)

 

 

artifacts로 파일 및 디렉토리 지정 시 glob 형식의 패턴을 통해 아래와 같이 사용할 수 있습니다.

### target 디렉토리에 있는 main.jar 파일 지정
archiveArtifacts artifacts: 'target/main.jar'

### target 디렉토리에 있는 *.jar 파일 지정
archiveArtifacts artifacts: 'target/*.jar'

### target 디렉토리에 있는 *.jar 파일과 *.war 파일 지정
archiveArtifacts artifacts: 'target/*.jar, target/*.war'

### 모든 디렉토리에 있는 *.jar 파일 지정
archiveArtifacts artifacts: '**/*.jar'

 

여러 옵션을 사용하여 아래와 같이 사용할 수도 있습니다.

  • excludes: 디렉토리 경로 및 파일의 패턴을 지정하여 제외할 수 있습니다. 설정 패턴은 artifacts와 동일하게 사용 가능합니다.
  • allowEmptyArchive: 빌드 아티팩트가 없는 경우도 아카이브에 추가할지 여부를 결정합니다. 기본값은 false이며, true로 설정하면 아카이브가 빈 상태가 될 수 있습니다.
  • caseSensitive: 아카이브 내 파일 이름 검색시 대소문자를 구분할지 여부를 결정합니다. 기본값은 false이며, true로 설정하면 대소문자를 구분합니다.
  • defaultExcludes: 아카이브에서 기본적으로 제외할 파일을 결정합니다. 기본값은 true이며, false로 설정하면 Ant 파일 패턴을 사용하여 제외할 파일을 지정할 수 있습니다.
  • fingerprint: 빌드 아티팩트의 지문(fingerprint)을 생성하여 추적할지 여부를 결정합니다. 기본값은 false이며, true로 설정하면 빌드 아티팩트가 변경될 때마다 새로운 지문이 생성됩니다.
  • followSymlinks: 심볼릭 링크를 따라가서 링크가 가리키는 실제 파일을 아카이브할지 여부를 결정합니다. 기본값은 false이며, true로 설정하면 심볼릭 링크가 아닌 실제 파일이 아카이브됩니다.
  • onlyIfSuccessful: 빌드가 성공했을 때만 아카이브를 생성할지 여부를 결정합니다. 기본값은 false이며, true로 설정하면 빌드가 실패했을 때는 아카이브를 생성하지 않습니다.

 

 

Artifact 복사 (copyArtifacts)

archiveArtifacts{} 구문을 통해 저장된 파일을 copyArtifacts{} 구문을 통해 복사할 수 있습니다. 기본적인 구문은 아래와 같이 사용됩니다. projectName 필드 설정으로 가져올 빌드의 이름을 지정하여 파일을 복사하는 설정입니다. 다른 프로젝트 빌드에 저장되어 있는 Artifact를 복사하여 사용할 수도 있습니다.

 

copyArtifacts(
    projectName: 'pipeline-project-name'
    (optional)
)

 

여러 옵션을 사용하여 아래와 같이 사용할 수도 있습니다.

  • filter: 가져올 아티팩트를 필터링하는 방법을 지정합니다. glob 형식의 패턴을 사용할 수 있습니다. 예를 들어, */.jar는 모든 .jar 파일을 가져옵니다.
  • excludes: 가져오지 않을 아티팩트를 지정합니다. filter와 마찬가지로 glob 형식의 패턴을 사용할 수 있습니다.
  • fingerprintArtifacts: 가져온 아티팩트의 지문(fingerprint)을 생성합니다. 이 옵션을 true로 설정하면, Jenkins는 가져온 아티팩트의 지문을 계산하고, 이후 빌드에서 이 아티팩트가 사용될 때 지문을 검증합니다.
  • flatten: 가져온 아티팩트를 평면 구조로 저장합니다. 이 옵션을 true로 설정하면, 가져온 아티팩트가 현재 빌드의 루트 디렉토리에 직접 저장됩니다. 이 옵션을 false로 설정하면, 가져온 아티팩트가 원래의 디렉토리 구조를 유지합니다.
  • includeBuildNumberInTargetPath: 가져온 아티팩트를 저장할 때 빌드 번호를 포함시킵니다. 이 옵션을 true로 설정하면, 가져온 아티팩트가 현재 빌드의 루트 디렉토리 아래 buildNumber 디렉토리에 저장됩니다.
  • optional: 가져올 아티팩트가 없는 경우 처리 방법을 지정합니다. 이 옵션을 true로 설정하면, 가져올 아티팩트가 없는 경우 무시합니다. 이 옵션을 false로 설정하면, 가져올 아티팩트가 없는 경우 빌드가 실패합니다.
  • parameters: 가져올 빌드에 전달할 매개변수를 지정합니다. 이 옵션을 사용하면 가져올 빌드에서 정의된 매개변수를 사용할 수 있습니다.
  • resultVariableSuffix: 가져온 아티팩트의 변수 접미사를 지정합니다.
  • selector: 가져올 아티팩트를 선택하는 방법을 지정합니다

 

 

Artifact 테스트

archiveArtifacts{} 구문과 copyArtifacts{} 구문을 사용하여 테스트를 진행해봅시다. 우선 Golang 프로젝트의 패키지와 바이너리 파일을 저장하기 위해 vendor 디렉토리와 bin 디렉토리의 모든 파일을 저장하도록 설정하도록 하겠습니다.


'vendor/**, bin/**' 디렉토리를 지정하고 옵션을 통해 빌드가 성공했을 때만 Artifact를 저장하고, 생성된 Artifact가 없을 때에도 저장하고, fingerprint를 생성하여 Artifact를 구분할 수 있도록 설정하였습니다.

archiveArtifacts artifacts: 'vendor/**, bin/**', allowEmptyArchive: true, onlyIfSuccessful: true, fingerprint: true

 

 

이제 저장된 Artifact를 복사하여 사용하기 위해 아래와 같이 코드를 구성하였습니다.
pipeline-project-name 이름으로 저장된 빌드의 Artifact를 설정하고, 동일하게 'vendor/**, bin/**' 디렉토리를 지정하였습니다. 복사하는 Artifact는 build/ 디렉토리에 저장되도록 구성하였으며 복사할 Artifact가 없더라도 빌드가 실패하지 않도록 설정하였습니다.

copyArtifacts(
    projectName: 'pipeline-project-name',
    filter: 'vendor/**, bin/**',
    target: 'build/.',
    optional: true
)

 

 

테스트 코드 작성 후 빌드를 실행해보겠습니다.
빌드 완료 후 해당하는 빌드의 Workspace를 확인하면 아래와 같이 vendor 디렉토리와 bin 디렉토리의 파일을 확인하실 수 잇습니다.

 

 

Artifact 관리

Artifact를 계속 Jenkins에 저장할 수 없기 때문에 관리 정책을 추가할 수 있습니다. Jenkins 관리 웹 페이지에서는 pipeline -> Configuration -> General 설정에서 오래된 빌드 삭제 기능을 설정할 수 있습니다.

 

 

pipeline의 코드 상으로는 buildDiscarder를 사용하여 빌드를 자동으로 삭제하거나 유지하기위해 사용됩니다.

pipeline {
    options {
        buildDiscarder(logRotator(optional))
    }
}
  • numToKeepStr : 유지할 빌드의 수
  • artifactNumToKeepStr : 빌드 아티팩트(컴파일된 바이너리, 테스트 결과 등)의 유지할 개수
  • daysToKeepStr : 빌드 로그를 유지할 일수
  • artifactDaysToKeepStr : 빌드 아티팩트를 유지할 일수

 

예시)

buildDiscarder(logRotator(daysToKeepStr: '30'))
buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '5'))

 

 

 

지금까지 Jenkins 에서는 Artifact 플러그인 기능을 사용하여 생성된 Artifact를 저장, 복사, 관리하는 방법을 알아보았습니다...! 끝...!

 

 

[Reference]

+ Recent posts