이전 포스팅에서 Jenkins에서 사용할 Python 빌드 에이전트를 만들고, SSH로 Jenkins에 에이전트로 등록했다.
Python 빌드 에이전트를 Docker 이미지로 만들고, SSH로 Jenkins 에이전트로 연결하는 방법은 다음 포스팅을 참고한다.
이제 마지막 단계인 Jenkins에서 파이썬 빌드를 구성한다.
다음 과정으로 진행한다.
- Jenkins 플러그인 설치
- 배포에 사용할 Nexus 계정 생성
- 빌드에 사용할 GitLab 계정 생성
- GitLab Access Token 발급
- Jenkins에 GitLab Access Token 등록
- Nexus3 설정
- 빌드 생성
- 빌드 수행
- 빌드와 배포 결과 확인
이전에 Visual Studio 빌드를 구성하는 방법을 다룬 적이 있다.
Jenkins에서 Visual Studio 빌드 구성을 위한 사전 준비는 다음 포스팅을 참고한다.
사전 준비 사항은 해당 포스팅에서 MSBuild 설정과 Nexus3 설정을 제외하고 동일하다.
Jenkins에서 Visual Studio 빌드를 구성하는 방법은 다음 포스팅을 참고한다.
본 포스팅에서는 이전 포스팅과 중복되는 내용은 최대한 배제하고, 빌드 생성과 수행, 결과 확인을 중심으로 진행한다.
빌드 구성을 위한 준비 사항
위에 언급한대로 아래 포스팅을 참고한다.
MSBuild 설정은 필요하지 않고, Nexus3 설정은 아래를 참고한다.
Nexus3 설정
Nexus3에 생성한 파이썬 패키지를 배포하기 위한 로컬 pypi 저장소 (host)가 생성되어 있어야 한다.
생성 방법은 다음 포스팅을 참고한다.
또한 빌드 에이전트에 생성한 파이썬 패키지를 배포하기 위한 .pypirc 파일을 설정이 되어 있어야 한다.
해당 내용은 아래 포스팅을 참고한다.
빌드 생성
모든 준비를 마쳤으면 파이썬 빌드를 위해 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 이름을 입력하면 해당 에이전트가 표시된다.
파이썬 빌드 에이전트가 표시되지 않는다면 다음 포스팅을 참고한다.
소스 코드 관리 설정
빌드를 수행할 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로 설정되어 있다.
파이썬 빌드 에이전트 설정은 다음 포스팅을 참고한다.
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 빌드 환경 구성에서 사용한 방법을 활용했다.
해당 방법은 아래 포스팅을 참고한다.
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 빌드 환경 구축
'::: IT인터넷 :::' 카테고리의 다른 글
우분투 또는 우분투 서버에 ssh로 원격 연결 사용하기 (0) | 2021.12.06 |
---|---|
우분투 환경에 Chrome 브라우저 설치하기 (0) | 2021.12.02 |
gitlab에서 소스코드 Pull Request와 Merge 하기 (0) | 2021.09.06 |
윈도우 10에서 Docker Desktop 없이 Docker 사용하기 (3) | 2021.09.03 |
파이썬 프로젝트 폴더 구성하기 (0) | 2021.09.02 |