::: IT인터넷 :::

Scala 빌드 파이프라인 설정하기 (1) - 빌드 생성

곰탱이푸우 2023. 8. 28. 08:20
Jenkins와 연동한 Scala 빌드 머신을 활용하여 실제 Spark Application을 빌드하고 배포한다.
 
Scala 빌드머신을 Jenkins에 연동하는 방법은 아래 문서를 참고한다.
Scala 빌드머신을 생성하는 방법은 아래 문서를 참고한다.
빌드하고 배포하기 위한 Spark Application 코드가 필요하다.
아래 문서에서 설명했던 Application을 활용한다.
 

빌드 생성

Spark Application 빌드를 위해 Jenkins에 빌드 프로젝트를 생성한다.
Bamboo에서는 빌드 플랜이라고 하는데, Jenkins에서는 빌드 프로젝트라는 명칭을 사용한다.
Jenkins에서 좌측의 New Item을 클릭한다.
 
 
생성하려는 빌드 프로젝트의 이름을 입력하고, Freestyle project를 선택하고 OK를 클릭한다.
srtest-scala로 입력했다.
 
상단에 General, 소스 코드 관리, 빌드 유발, 빌드 환경, Build, 빌드 후 조치 탭이 있는데, 양이 많으므로 각각 나눠서 정리한다.
 
 

General 설정

기본 내용 입력

설명 부분에는 적당한 이름을 입력하고, GitLab Connection에 gitlab을 선택한다.
 
GitLab Connection 설정 방법은 아래 문서를 참고한다.

Git Parameter 설정

이 빌드는 매개변수가 있습니다 부분에 체크한다. 이 곳에서 설정한 매개변수는 Jenkins 빌드의 환경 변수로 사용된다.
매개변수 추가를 선택하고 Git Parameter를 클릭한다.
 
Git Paramter 도구 상자가 활성화 되면 아래와 같이 입력한다.
  • Name - BRANCH로 입력한다. 빌드할 프로젝트의 브랜치 이름을 저장하는 변수이다.
  • Parameter Type - Branch를 선택한다.
  • Default Value - main을 입력한다. 해당 브랜치가 기본으로 선택된다.
 
입력이 완료되면 Git Parameter 도구 상자의 고급 버튼을 클릭한다.
추가 입력 항목이 나타나면 다음과 같이 입력한다.
  • Branch - 빈칸 유지
  • Branch Filter - .*
  • Tag Filter - *
  • Sort Mode, Seleted Value - NONE 유지
 
위와 같이 입력하면 빌드 대상을 선택할때 빌드할 대상을 main, Branch, Tag 중에서 선택할 수 있다.
  • main - GitHub에서 master 브랜치라고 부르며, GitLab에서는 main 브랜치이다. (SVN의 trunk와 동일)
  • Branch - 개발 과정에서 코드 작업을 하기 위해 임시로 분기한 영역
  • Tag - 릴리즈 (배포)가 완료된 버전의 코드를 고정해두기 위해 태깅한 영역
 
 

사용할 빌드머신 지정

Restrict where this project can be run 항목에 체크한다.
Label Expression에는 이전에 생성한 Scala 빌드 에이전트의 Label인 scala-build01을 입력한다.
 

소스 코드 관리 설정

빌드를 수행할 GitLab의 대상 프로젝트의 git 파일 경로를 URL 형태로 입력한다.
주소를 입력하면 인증 정보가 없어 접근 거부 메시지가 출력된다.
Credentials의 -none-을 클릭하고 기존에 추가한 jenkinsbuild 계정을 선택한다.
 
GitLab과 계정 연동이 되지 않은 경우 아래 문서의 소스 코드 관리 설정 항목을 참고하여 계정 연동을 진행한다.
Branches to build 항목의 Branch Specifier에는 Git Parameter로 설정한 매개변수인 BRANCH를 지정한다.
기본 값은 */master 이며, 삭제하고 아래와 같이 ${BRANCH}로 입력한다.
 
 

빌드 유발 설정

다양한 조건의 자동 빌드 조건을 지정할 수 있다.
필요할 때에만 빌드를 수행할 것이라면 체크하지 않아도 된다.
아래는 매일 02시에 데일리 빌드를 수행하는 설정이다. 시간 설정은 크론탭과 상당히 유사하다.
 

빌드 환경 설정

Delete workspace before build starts에 체크한다.
Scala 빌드 에이전트에서 workspace 폴더에 파일이 있을 경우 전부 삭제한다.
다른 항목은 사용하지 않으므로 선택하지 않았다.
 
Scala 빌드 에이전트의 workspace는 /home/jenkins/workspace로 설정되어 있다.
Scala 빌드 에이전트 설정은 다음 문서를 참고한다.
 
 

Build 설정

이제 드디어 Build Step을 지정한다. 실제 빌드를 수행하는 부분이다.
 

업로드 URL의 환경 변수 등록

Add build step의 Inject environment variables를 클릭한다.
Properties File Path에는 /home/jenkins/.sbt/nexus-url을 입력한다.
 
생성된 jar 파일을 업로드할 저장소 URL을 Scala 빌드 에이전트의 환경 변수로 등록한다.
자세한 내용은 아래 문서를 참고한다.

테스트

예제로 사용한 Spark Application에 별도의 테스트 코드가 포함되지 않아 테스트는 생략했다.
그러나 향후 테스트 코드가 추가 될 경우 테스트를 진행해야 한다.
 
Add build step의 Execute shell을 추가하고 sbt test 명령으로 테스트를 실행한다.
테스트에 성공하면 빌드와 배포 단계를 진행하고 실패하면 종료한다.
 
 

빌드와 배포

빌드와 배포 과정은 크게 세 단계로 구분한다.
  • Spark Application의 버전 확인
  • Snapshot 여부 확인 후 배포 URL 지정
  • 실제 빌드와 배포
 
각 단계별 코드를 먼저 설명하고 설정 방법을 정리한다.
 
Spark Application의 버전 확인
build.sbt에서 verion := 항목에 기입 된 버전 정보를 가져온다.
#!/bin/bash

# build.sbt 파일에서 verison: = 항목의 값 추출
version=$(grep -oP 'version := "\K[^"]+' build.sbt)
echo "Version = ${version}"

# version 정보 추출에 실패한 경오 오류 발생 (빌드 중단)
if [[ -z "${version}" ]]; then
    echo "Failed to retrieve version information."
    exit 1
fi
 
sbt version 명령은 시간이 오래 걸리고, 추가적으로 출력에서 버전을 추출해야 한다.
위의 방법은 build.sbt 파일에서 version 정보를 직접 꺼내오기 때문에 훨씬 빠르고 편리하다.
 
버전 정보가 확인되지 않으면 저장소 지정을 할 수 없기 때문에 쉘 스크립트를 종료시켜서 빌드를 중단한다.
 
build.sbt 관련 내용은 아래 문서를 참고한다.
Snapshot 여부 확인 후 배포 URL 지정
추출한 버전 정보를 확인하고 -SNAPSHOT 문자열이 존재하면 maven-snapshots 저장소 주소를 지정한다.
해당 문자열이 없으면 maven-releases 저장소 주소를 지정한다.
# 버전 정보에 -SNAPSHOT이 있으면 SNAPSHOTS 저장소 지정
if [[ "${version}" == *"-SNAPSHOT"* ]]; then
    echo "Snapshot Version Deploy!!"
    publishToRepo="${OCEAN_SNAPSHOTS}"
# 없으면 RELEASE 저장소 지정
else
    echo "Release Version Deploy!!"
    publishToRepo="${OCEAN_RELEASES}"
fi

echo "Publish to = ${publishToRepo}"
 
주소 지정에 사용한 변수는 nexus-url 파일에 저장되어 있다.
Inject environment variables을 이용하여 환경 변수로 등록한 변수이다.
 
저장소 설정 관련 내용은 아래 문서를 참고한다.

 

실제 빌드와 배포
실제로 빌드를 수행하고 업로드하는 부분이다.
Nexus 인증 정보와 저장소를 지정하는 기능은 sbt pulish 명령의 옵션으로 전달한다.
# maven-snapshots, maven-releases 저장소 업로드의 덮어쓰기 허용
publishConf="set publishConfiguration := publishConfiguration.value.withOverwrite(true);"
# releases 또는 snapshots 저장소 주소 지정
publishTo="set publishTo := Some(\"maven-repo\" at \"${publishToRepo}\");"

# credentials.sbt 파일을 소스코드 경로로 복사
cp /home/jenkins/.sbt/credentials.sbt .
# 설정 값을 사용하여 빌드하고 maven 자장소로 업로드
sbt "${publishConf} ${publishTo} publish"
 
이 방법을 사용하면 별도의 sbt 플러그인을 사용하지 않아도 원하는 저장소에 배포할 수 있다.
 
전체코드
위에서 설명한 빌드 스크립트의 전체 코드는 다음과 같다.
#!/bin/bash
echo "======== Application Version =========="
version=$(grep -oP 'version := "\K[^"]+' build.sbt)
echo "Version = ${version}"

if [[ -z "${version}" ]]; then
    echo "Failed to retrieve version information."
    exit 1
fi

echo "======== Publish To =========="
if [[ "${version}" == *"-SNAPSHOT"* ]]; then
    echo "Snapshot Version Deploy!!"
    publishToRepo="${OCEAN_SNAPSHOTS}"
else
    echo "Release Version Deploy!!"
    publishToRepo="${OCEAN_RELEASES}"
fi

echo "Publish to = ${publishToRepo}"

echo "======== Build and Deploy =========="
publishConf="set publishConfiguration := publishConfiguration.value.withOverwrite(true);"
publishTo="set publishTo := Some(\"maven-repo\" at \"${publishToRepo}\");"

cp /home/jenkins/.sbt/credentials.sbt .
sbt "${publishConf} ${publishTo} publish"
 
설정 방법
Add build step의 Execute shell을 클릭한다.
 
위의 코드를 입력한다.
 
 

빌드 후 조치 설정

빌드 후 조치 추가 버튼을 클릭하고 Delete workspace when build is done 항목을 추가한다.
빌드가 완료되면 내려 받은 소스 코드와 빌드 산출물을 모두 지워야 한다.