Jenkins는 가장 널리 사용되는 CI(Continuous Integration) 시스템입니다.
저의 경우에는 프로젝트 초기에 Jenkins를 이용하여 빌드 환경을 구축하여 프로젝트 수행 기간 내내 빌드가 깨지지 않도록 하고 있습니다.
Jenkins에서는 여러가지 타입의 항목(Item)들을 생성할 수 있는데 이번에는 Pipeline 항목을 생성하고 설정하는 부분에 대해서 알아보도록 하겠습니다.
새로운 Item 버튼을 눌러 Item 이름 및 타입을 선택합니다.
이제부터는 Pipeline script를 이용하여 빌드 절차를 작성하면 됩니다.
빌드를 위한 Pipeline script에 익숙해져야 합니다.
여기서 Pipeline script 문법에 대한 좋은 정보를 얻을 수 있습니다.
빌드 절차는 아래와 같습니다.
1. 소스 저장소에서 소스를 받아옵니다.
- // git에서 소스 얻어오기
- stage('Checkout') {
- steps {
- git branch: 'master', credentialsId: 'UID', url: 'http://REPOSITORY/TS.git'
- }
- }
2. 빌드 환경을 구축합니다.
빌드할 프로젝트가 Angular 프로젝트이기 때문에 프로젝트에 관련된 패키지들을 쉘 명령어를 통하여 설치한 후에 마찬가지로 쉘 명령어로 프로젝트를 빌드합니다.
- stage('Install') {
- steps {
- sh 'npm install' }
- }
- stage('Build') {
- steps{
- sh 'npm run build --prod=true'
- }
- }
3. 빌드 결과물을 패키징합니다.
빌드 결과물들을 압축하여 파일로 생성합니다.
BUILD_NUMBER는 Jenkins의 환경 변수입니다.
빌드 결과물들을 압축하여 파일로 생성합니다.
BUILD_NUMBER는 Jenkins의 환경 변수입니다.
- stage('Zip'){
- steps{
- powershell """
- Compress-Archive -Path ./rest-api/app/* -DestinationPath ./rest-api/restapi-${BUILD_NUMBER}.zip
- Compress-Archive -Path ./dist/board/* -DestinationPath ./dist/board-${BUILD_NUMBER}.zip
- """
- }
- }
4. 패키징 파일을 배포합니다.
패키징 파일을 Artifactory에 배포합니다.
패키징 파일을 Artifactory에 배포합니다.
- stage('Depoly') {
- steps {
- powershell """
- cmd.exe /c ${CURL} -uID:PASSWORD -X PUT "http://URL/artifactory/FlaskApp/rest-api-${BUILD_NUMBER}.zip" -T "./rest-api/rest-api-${BUILD_NUMBER}.zip"
- cmd.exe /c ${CURL} -uID:PASSWORD -X PUT "http://URL/artifactory/FlaskApp/board-${BUILD_NUMBER}.zip" -T "./dist/board-${BUILD_NUMBER}.zip"
- """
- }
- }
- def BUILD_NUMBER = "$BUILD_NUMBER"
- pipeline {
- agent any
- environment {
- BUILD_NAME = "1.0.0.0"
- }
- stages {
- // git에서 소스 얻어오기
- stage('Checkout') {
- steps {
- git branch: 'master', credentialsId: 'UID', url: 'http://URL/AViewer.git'
- }
- }
- // PyInstaller으로 빌드 실행하기
- stage('Build') {
- steps {
- powershell """(get-content ${WORKSPACE}/version.rc) | % {\$_ -replace 'BUILD_NUMBER',\${env:BUILD_NUMBER}} | Out-File \${WORKSPACE}/version.rc -Encoding ASCII"""
- powershell """virtualenv ${WORKSPACE}/.venv"""
- bat "./build.bat"
- }
- }
- // Create a package file by using WIX
- stage('Package') {
- steps {
- powershell """
- \$version=(get-item ./dist/App/AViewer.exe).VersionInfo.FileVersion
- Out-File -FilePath ./propfile -InputObject "BUILD_NAME=\$version" -Encoding ASCII
- (get-content ./AViewer.wxs) | % {\$_ -replace '{VERSION}',\$version} | Out-File ./AViewer.wxs -Encoding ASCII
- cmd.exe /c package.bat \$version
- """
- script{
- env.BUILD_NAME = "1.0.0.0"
- }
- }
- }
- stage('Depoly') {
- steps {
- powershell """
- \$version=(get-item ./dist/App/AViewer.exe).VersionInfo.FileVersion
- cmd.exe /c deploy.bat \$version
- """
- }
- }
- stage('Notification') {
- steps {
- script {
- // send to email
- def mailRecipients = "Email"
- def jobName = currentBuild.fullDisplayName
- env.BUILD_NAME='1.0.0.0'
- emailext body: '''${SCRIPT, template="AViewer_html.template"}''',
- mimeType: 'text/html',
- subject: "[Jenkins] ${jobName}",
- to: "${mailRecipients}",
- replyTo: "${mailRecipients}",
- recipientProviders: [[$class: 'CulpritsRecipientProvider']]
- }
- }
- }
- }
- post {
- always {
- echo 'This will always run'
- emailext body: "${currentBuild.currentResult}: Job ${env.JOB_NAME} build ${env.BUILD_NUMBER}\n More info at: ${env.BUILD_URL}",
- recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']],
- subject: "Jenkins Build ${currentBuild.currentResult}: Job ${env.JOB_NAME}",
- to: "Email"
- }
- success {
- echo 'This will run only if successful'
- }
- failure {
- emailext body: '''${SCRIPT, template="AViewer_html.template"}''',
- subject: "[Jenkins] REPORT",
- to: "Email"
- }
- unstable {
- echo 'This will run only if the run was marked as unstable'
- }
- changed {
- echo 'This will run only if the state of the Pipeline has changed'
- echo 'For example, if the Pipeline was previously failing but is now successful'
- }
- }
- }
댓글
댓글 쓰기