[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)
소프트웨어 개발 과정에서 생성되는 다양한 형태의 요소들을 모두 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]
'CI-CD > Jenkins' 카테고리의 다른 글
[Jenkins] AWS EC2에 컨테이너 배포하기 (0) | 2023.06.30 |
---|---|
[Jenkins] AWS ECR에 컨테이너 이미지 업로드하기 (2) | 2023.06.13 |
[Jenkins] Cannot run program git.exe 에러 (0) | 2023.04.19 |
[Jenkins] Jenkins Window 환경에서 설치하기 (0) | 2023.04.17 |
[Jenkins] Jenkins GitLab 프로젝트 연동하기 03 (0) | 2023.04.14 |