::: IT인터넷 :::

Jenkins에서 파이썬 빌드 구성하기

정보보안썰문가 곰탱이푸우 2021. 9. 9. 08:20
반응형

이전 포스팅에서 Jenkins에서 사용할 Python 빌드 에이전트를 만들고, SSH로 Jenkins에 에이전트로 등록했다.

 

Python 빌드 에이전트를 Docker 이미지로 만들고, SSH로 Jenkins 에이전트로 연결하는 방법은 다음 포스팅을 참고한다.

 

Docker로 Jenkins의 Python 빌드 에이전트 만들기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com

 

 

리눅스 Docker 컨테이너를 Jenkins 에이전트로 연결하기 (via. SSH)

이전 포스팅에서 jenkins/ssh-agent의 Dockerfile에 Anaconda를 추가하여 Python 빌드를 위한 리눅스 Docker 이미지를 생성하고 배포했다. 자세한 내용은 아래 포스팅을 참고한다. Docker로 Jenkins의 Python 빌드..

www.bearpooh.com

 

이제 마지막 단계인 Jenkins에서 파이썬 빌드를 구성한다.

 

다음 과정으로 진행한다.

  • Jenkins 플러그인 설치
  • 배포에 사용할 Nexus 계정 생성
  • 빌드에 사용할 GitLab 계정 생성
  • GitLab Access Token 발급
  • Jenkins에 GitLab Access Token 등록
  • Nexus3 설정
  • 빌드 생성
  • 빌드 수행
  • 빌드와 배포 결과 확인

 

이전에 Visual Studio 빌드를 구성하는 방법을 다룬 적이 있다.

 

Jenkins에서 Visual Studio 빌드 구성을 위한 사전 준비는 다음 포스팅을 참고한다.

사전 준비 사항은 해당 포스팅에서 MSBuild 설정과 Nexus3 설정을 제외하고 동일하다.

 

Jenkins에서 윈도우 에이전트를 이용한 Visual Studio 빌드 구성 (1)

이제 Jenkins에 등록한 윈도우 에이전트를 이용하여 Visual Studio 빌드를 구성한다. Jenkins와 Nexus에 추가로 설정할 것들이 있기 때문에 사전 준비와 빌드 설정을 나눠서 포스팅한다. 빌드 구성에 필요

www.bearpooh.com

 

Jenkins에서 Visual Studio 빌드를 구성하는 방법은 다음 포스팅을 참고한다.

 

Jenkins에서 윈도우 에이전트를 이용한 Visual Studio 빌드 구성 (2)

이전 포스팅에서 Jenkins의 빌드 구성을 위한 사전 작업을 진행했다. Jenkins에서 윈도우 에이전트를 이용한 Visual Studio 빌드 구성 (1) 이제 Jenkins에 등록한 윈도우 에이전트를 이용하여 Visual Studio 빌

www.bearpooh.com

 

본 포스팅에서는 이전 포스팅과 중복되는 내용은 최대한 배제하고, 빌드 생성과 수행, 결과 확인을 중심으로 진행한다.

 

 

빌드 구성을 위한 준비 사항

위에 언급한대로 아래 포스팅을 참고한다.

 

Jenkins에서 윈도우 에이전트를 이용한 Visual Studio 빌드 구성 (1)

이제 Jenkins에 등록한 윈도우 에이전트를 이용하여 Visual Studio 빌드를 구성한다. Jenkins와 Nexus에 추가로 설정할 것들이 있기 때문에 사전 준비와 빌드 설정을 나눠서 포스팅한다. 빌드 구성에 필요

www.bearpooh.com

 

MSBuild 설정은 필요하지 않고, Nexus3 설정은 아래를 참고한다.

 

Nexus3 설정

Nexus3에 생성한 파이썬 패키지를 배포하기 위한 로컬 pypi 저장소 (host)가 생성되어 있어야 한다.

 

생성 방법은 다음 포스팅을 참고한다.

 

Nexus3를 이용한 PyPi 사설 저장소 구축

Nexus3를 이용한 PyPi 사설 저장소 구축은 3개의 저장소가 필요하다. hosted (Local) - 내부에서 작성한 Python 패키지인 Wheel (Whl) 파일을 배포한다. proxy (Remote) - 외부의 PyPi 저장소의 패키지를 저장하고..

www.bearpooh.com

 

또한 빌드 에이전트에 생성한 파이썬 패키지를 배포하기 위한 .pypirc 파일을 설정이 되어 있어야 한다.

 

해당 내용은 아래 포스팅을 참고한다.

 

Docker로 Jenkins의 Python 빌드 에이전트 만들기

시놀로지 NAS는 리눅스 기반의 운영체제를 기반으로 한 DSM으로 동작한다. 시놀로지 NAS에 Docker를 기반으로 셋팅한 Jenkins 역시 리눅스 기반이다. 시놀로지 NAS에 Jenkins 구축하기 현재 근무 중인 회

www.bearpooh.com

 

 

빌드 생성

모든 준비를 마쳤으면 파이썬 빌드를 위해 Jenkins에 빌드 프로젝트를 생성해야 한다.

Bamboo에서는 빌드 플랜이라고 하는데, Jenkins에서는 빌드 프로젝트라는 명칭을 사용한다.

 

Jenkins에서 좌측의 새로운 Item을 클릭한다.

 

생성하려는 빌드 프로젝트의 이름을 입력하고, Freestyle project를 선택하고 OK를 클릭한다.

srtest-python으로 입력했다.

 

OK 버튼을 클릭하면 상세 구성 페이지로 이동한다.

상단에 General, 소스 코드 관리, 빌드 유발, 빌드 환경, Build, 빌드 후 조치 탭이 있는데, 양이 많으므로 각각 나눠서 정리한다.

 

 

General 설정

이 빌드는 매개변수가 있습니다 부분에 체크한다. 이 곳에서 설정한 매개변수는 Jenkins 빌드의 환경 변수로 사용된다.

 

하단에 매개변수 추가 버튼을 클릭하고 Git Parameter를 클릭한다.

  • Name - BRANCH로 입력한다. 빌드할 프로젝트의 브랜치 이름을 저장하는 변수이다.
  • Parameter Type - Branch를 선택한다.
  • Default Value - main을 입력한다. 해당 브랜치가 기본으로 선택된다.

 

GitLab 설정할 때 master 브랜치 이름 변경을 안해서 main이 master 브랜치이다.

 

Restrict where this project can be run에 체크하고, 기존에 생성한 파이썬 빌드 에이전트의 Label을 입력한다.

  • 실제 빌드 수행은 파이썬 빌드 에이전트에서 수행한다.
  • Label 이름을 입력하면 해당 에이전트가 표시된다.

 

파이썬 빌드 에이전트가 표시되지 않는다면 다음 포스팅을 참고한다.

 

리눅스 Docker 컨테이너를 Jenkins 에이전트로 연결하기 (via. SSH)

이전 포스팅에서 jenkins/ssh-agent의 Dockerfile에 Anaconda를 추가하여 Python 빌드를 위한 리눅스 Docker 이미지를 생성하고 배포했다. 자세한 내용은 아래 포스팅을 참고한다. Docker로 Jenkins의 Python 빌드..

www.bearpooh.com

 

 

소스 코드 관리 설정

빌드를 수행할 GitLab의 대상 프로젝트의 git 파일 경로를 URL 형태로 입력한다.

주소를 입력하면 인증 정보가 없어 접근 거부 메시지가 출력된다.

Credentials의 -none-을 클릭하고 기존에 추가한 buildman 계정을 선택한다.

 

GitLab 계정 정보가 입력되지 않은 경우 Add - Jenkins 버튼을 누르고 계정 정보를 입력한다.

  • Kind - Username and password를 선택한다.
  • Username - GitLab의 ID를 입력한다. GitLab에 buildman 계정을 생성했기 때문에 buildman을 입력한다.
  • Password - Username에 입력한 계정의 비밀번호를 입력한다.

 

계정 정보가 정상적으로 입력되면 인증 실패 메시지는 사라진다.

Name에는 해당 프로젝트의 이름을 입력한다. 빌드 에이전트에서 소스코드를 Clone 할 때 해당 이름의 폴더를 생성한다.

 

Branch Speifier에는 General 탭에서 Git Parameter로 설정한 매개변수인 BRANCH를 지정한다.

Jenkins에 환경 변수로 등록되어 있으므로 ${BRANCH} 형태로 입력해야 한다.

 

 

빌드 유발 설정

다양한 조건의 자동 빌드 조건을 지정할 수 있다.

필요할 때에만 빌드를 수행할 것이므로 체크하지 않았다.

 

빌드 환경 설정

Delete workspace before build starts에 체크한다.

파이썬 빌드 에이전트에서 workspace 폴더에 파일이 있을 경우 전부 삭제한다.

다른 항목은 사용하지 않으므로 선택하지 않았다.

 

파이썬 빌드 에이전트의 workspace는 /home/jenkins/workspace로 설정되어 있다.

 

파이썬 빌드 에이전트 설정은 다음 포스팅을 참고한다.

 

리눅스 Docker 컨테이너를 Jenkins 에이전트로 연결하기 (via. SSH)

이전 포스팅에서 jenkins/ssh-agent의 Dockerfile에 Anaconda를 추가하여 Python 빌드를 위한 리눅스 Docker 이미지를 생성하고 배포했다. 자세한 내용은 아래 포스팅을 참고한다. Docker로 Jenkins의 Python 빌드..

www.bearpooh.com

 

 

Build 설정

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

 

Add build step의 Execute shell을 클릭한다.

 

conda 가상 환경 생성, 가상 환경 활성화, 테스트에 필요한 라이브러리를 설치하는 코드를 작성한다.

  • conda 가상 환경을 생성하여 사용하면, 해당 가상 환경에 필요한 라이브러리가 설치 된다.
  • 빌드를 마치고 해당 가상 환경을 삭제하면 설치한 라이브러리도 모두 삭제 된다.
  • 테스트에 필요한 라이브러리를 설치한 이유는 코드의 테스트 결과가 정상일 때만 빌드하기 위함이다.

 

사용한 쉘 스크립트 코드는 다음과 같다.

빈 줄이 발생하면 Jenkins는 별도의 sh 파일로 나눠서 전송하므로 빈줄이 없어야 한다.

#!/bin/bash
source /opt/anaconda3/etc/profile.d/conda.sh
conda create -n dist_py38 python=3.8 -y
conda activate dist_py38
pip install -r test_requirements.txt

 

conda 가상 환경을 사용하지 않으면 다음과 같은 문제가 발생한다.

  • 불필요한 라이브러리가 삭제되지 않고 남아 있다.
  • 빌드 에이전트에 설치 된 라이브러리의 버전 관리가 어렵다. (빌드 이후에는 불필요하다.)
  • 빌드 에이전트의 상태 변경이 발생한다. 빌드 에이전트는 최대한 초기 상태를 유지해야 한다.

 

Add build step의 Execute shell을 클릭하여 빌드 스텝 블럭을 추가한다.

 

 

추가한 블럭에는 파이썬 테스트 코드를 작성한다.

  • 위의 블럭과 별개의 블럭으로 실행되므로 conda 가상 환경을 활성화한다.
  • pytest 명령으로 코드 테스트를 진행한다.
  • 코드 테스트 결과가 정상이면 IS_SUCCESS=True, 실패이면 IS_SUCCESS=False를 is_success 파일에 저장한다.

 

사용한 쉘 스크립트 코드는 다음과 같다.

#!/bin/bash
source /opt/anaconda3/etc/profile.d/conda.sh
conda activate dist_py38
pytest
if [ $? -eq 0 ]; then
  echo "IS_SUCCESS=True" > is_success
else
  echo "IS_SUCCESS=False" > is_success
fi

 

bash에서 이전 명령의 실행 결과는 $?로 확인할 수 있다.

  • 예외 발생 없이 정상 종료되면 0를 반환한다. 테스트가 정상 종료되면 0을 반환한다.
  • 예외 발생하면 해당 예외 코드가 정수형으로 반환된다. 테스트가 실패하면 -1을 반환한다.
  • 쉘이서 명령 자체를 인식할 수 없으면 -127을 반환한다.

 

실행 결과를 IS_SUCCESS에 지정하여 파일로 저장한 것은, 해당 값을 Jenkins의 환경 변수로 등록하기 위함이다.

이전에 포스팅 한 Visual Studio 빌드 환경 구성에서 사용한 방법을 활용했다.

해당 방법은 아래 포스팅을 참고한다.

 

Jenkins에서 빌드 산출물을 배포할때 자동으로 버전 지정하기

이전 포스팅에서 Jenkins에서 빌드 설정을 위한 사전 작업과 빌드 구성에 대해 다뤘다. Jenkins에서 빌드 설정을 위한 사전 작업은 다음 포스팅을 참고한다. Jenkins에서 윈도우 에이전트를 이용한 Visu

www.bearpooh.com

 

Add build step을 클릭하여 Inject environment variables를 추가하고 마지막에 위치시킨다.

 

 

Inject environment variables에서 환경 변수로 등록할 파일 이름을 입력한다.

  • Properties File Path - 위에서 생성한 is_success 파일의 경로를 지정한다. 파일을 Workspace 경로에 생성하므로 파일명만 작성한다.
  • Properties Content - 특정 환경 변수를 추가하거나 수정할 수 있는 명령을 직접 작성한다. 사용하지 않았다.

 

Add Build step을 클릭하여 Conditional step (single)을 추가하고 마지막에 위치시킨다.

 

코드 테스트가 실패한 경우에 대한 처리를 추가한다.

  • Run? 부분의 조건을 String match를 선택한다.
  • String 1은 Jenkins의 환경 변수로 설정한 ${IS_SUCCESS}를 입력한다. 성공이면 True, 실패면 False가 전달된다.
  • String 2는 실패한 경우이므로 False를 입력한다.

 

테스트가 실패했을때 실행할 코드를 입력한다.

  • Builder는 Execute shell을 선택한다.
  • Command에는 실행할 코드를 입력한다. 테스트가 실패했으므로 파이썬 패키지 빌드는 하지 않는다.
  • conda 가상 환경을 비활성화 하고 해당 가상 환경을 삭제한다.

 

 

다음 코드를 사용했다.

#!/bin/bash
echo "============ Test is Failed!!!!!!!!! ============"
source /opt/anaconda3/etc/profile.d/conda.sh
conda activate dist_py38
conda deactivate
conda remove -n dist_py38 --all

 

다시 Add Build step을 클릭하여 Conditional step (single)을 추가하고 마지막에 위치시킨다.

 

코드 테스트가 성공한 경우에 대한 처리를 추가한다.

  • Run? 부분의 조건을 String match를 선택한다.
  • String 1은 Jenkins의 환경 변수로 설정한 ${IS_SUCCESS}를 입력한다. 성공이면 True, 실패면 False가 전달된다.
  • String 2는 성공한 경우이므로 True를 입력한다.

 

테스트가 성공했을때 실행할 코드를 입력한다.

  • Builder는 Execute shell을 선택한다.
  • Command에는 실행할 코드를 입력한다. 테스트가 성공했으므로 파이썬 패키지 빌드를 포함한다.
  • 나머지 코드는 테스트가 실패했을 때와 동일하다.
  • python setup.py bdist_wheel 명령의 upload 옵션에 대상 목적지인 local은 .pypirc에 정의되어 있다.

 

다음 코드를 사용했다.

#!/bin/bash
echo "============ Test is Successed!!!!!!!!!============"
source /opt/anaconda3/etc/profile.d/conda.sh
conda activate dist_py38
python setup.py bdist_wheel upload -r local
conda deactivate
conda remove -n dist_py38 --all

 

 

빌드 후 조치 설정

모든 Build Step이 완료되면 수행할 작업을 선택한다.

빌드 후 조치 추가 - Delete workspace when build  is done을 선택한다.

빌드가 완료되면 내려 받은 소스 코드와 빌드 산출물을 모두 지워야 한다.

 

빌드 수행

모든 설정이 완료되었으므로 빌드가 정상적으로 진행되는지 확인한다.

 

Jenkins에서 빌드할 프로젝트의 이름을 클릭한다.

 

좌측의 Build with Parameters를 클릭한다.

 

우측에 빌드 생성에서 General 탭에 구성한 Parameter 항목이 표시된다.

BRANCH에서 빌드할 소스코드가 있는 브랜치를 선택하고 빌드하기 버튼을 클릭한다.

 

 

빌드가 진행된다. 좌측 하단에 빌드 번호와 진행 상태를 확인할 수 있다.

 

좌측 하단의 #빌드번호를 클릭하면 진행 중인 빌드의 상세 페이지로 이동한다.

 

좌측의 Console Output을 클릭하면 빌드 과정에 대한 로그를 확인할 수 있다.

 

 

빌드와 배포 결과 확인

빌드 로그를 확인해보면 빌드와 업로드가 정상적으로 완료된 것을 확인할 수 있다.

 

Nexus3의 pypi-local에서 확인해보면 정상적으로 업로드 된 것을 확인할 수 있다.

 

가상 머신으로 생성한 파이썬 빌드 에이전트에 접속해서 빌드 완료 후 폴더가 정상적으로 삭제 되었는지 확인한다.

Workspace 경로에 생성 했던 파일들이 모두 삭제 된 것을 확인할 수 있다.

 

이로써 시놀로지 NAS를 활용한 개발 환경 구성하기가 모두 완료되었다!!!

  • Docker로 GitLab, Nexus, Jenkins 구축
  • Visual Studio, Python 빌드 환경 구축
반응형