이번 포스팅에서는 Jenkins를 이용하여 파이프라인(pipeline)을 구축하는 법에 대해서 정리한다.
이전 포스팅에서 다루었던 앤서블(Ansible)을 사용한 Serverspec 테스트를 연결하여 진행한다. Serverspec에 대해서는 아래의 링크에 정리해 두었다.
2021.04.15 - [클라우드 컴퓨팅 & NoSQL] - [앤서블(Ansible)] Serverspec 사용법
Pipeline으로 작업을 연결하는 방법은 두 가지이다.
- 직접 연결: 프로젝트의 후속 작업을 명시적으로 정의하고 직접 연결하여 순차적으로 실행하는 방법
- 총괄 프로젝트를 이용한 연결: 총괄하는 프로젝트를 별도로 정의하고 그 안에서 프로젝트 관계를 정의해 파이프라인으로 실행하는 방법
이제부터 두 가지 방법에 대해서 알아보도록 한다.
1. 준비사항
기본적으로 Ansible을 실행하는 프로젝트와 Serverspec을 실행하는 프로젝트가 정의되어야 한다.
# Sample Ansible 코드 복제
$ git clone https://github.com/devops-book/ansible-playbook-sample.git /tmp/ansible-playbook-sample
# Jenkins 실행권한 추가
$ vi /etc/sudoers.d/jenkins
jenkins ALL=(ALL) NOPASSWD:ALL
2. 직접 연결
2.1. Ansible 프로젝트 생성
"New Item"에서 "exec-ansible"이라는 프로젝트를 생성하고 프로젝트 방식은 "Freestyle project", "Execute shell" 필드에 다음 명령어를 입력한다.
cd /home/vagrant/ansible-playbook-sample
ansible-playbook -i development site.yml --diff
2.2. 프로젝트 빌드 확인
생성된 프로젝트에서 [Build Now] 버튼을 클릭하면 다음과 같이 정상적으로 빌드가 되는 것을 확인할 수 있다.
2.3. Serverspec 프로젝트 생성
동일한 방법으로 "exec-serverspec" 프로젝트를 생성한다.
그리고 실행 스크립트를 다음과 같이 설정한다.
cd /tmp/serverspec_sample
/usr/local/bin/rake spec
2.4. 프로젝트 빌드 확인
위의 단계에서 처럼 생성된 프로젝트에서 [Build Now] 버튼을 클릭하면 다음과 같이 정상적으로 빌드가 되는것을 확인할 수 있다.
2.5. 트리거 설정
2.1. 단계에서 만든 "exec-ansible"의 설정에서 "Post-build Actions" 부분에 "Build other project"를 선택하고, exec-serverspec을 입력한다. 그리고 선택은 Trigger only if build is stable을 선택한 후 저장한다.
2.6. 동작 확인
위의 세팅을 완료하고 나서 "exec-ansible"을 빌드하면 성공적으로 빌드가 되었을 경우 "exec-serverspec"도 정상적으로 실행되는 것을 확인할 수 있다.
3. 총괄 프로젝트(Pipeline)를 이용한 연결
이 방법은 두 개의 별도의 프로젝트를 상위의 프로젝트를 이용하여 빌드하는 방법이다.
이 방법을 진행하기 위해서는 위에서 진행한 트리거 설정을 해제하고 진행한다. 환경설정에 가면 x 표시를 선택할 수 있도록 되어있다.
3.1. 총괄 프로젝트 생성
"exec-ansible-serverspec"이라는 프로젝트를 생성한다. 이때 프로젝트 타입은 Pipeline을 선택한다.
3.2 Pipeline script 작성
다음과 같이 파이프라인 스크립트를 작성하고 저장한다.
node {
stage 'ansible'
build 'exec-ansible'
stage 'serverspec'
build 'exec-serverspec'
}
여기서 stage란 논리적인 단계를 의미하고, build는 이 단계마다 프로젝트들을 실행한다는 것을 의미한다.
3.3. 프로젝트 빌드 확인
위의 단계에서 처럼 생성된 프로젝트에서 [Build Now] 버튼을 클릭하면 다음과 같이 아이콘이 나오면서 빌드가 되는 것을 확인할 수 있다.
#1에 대한 배포는 필자가 프로젝트 명을 잘못 입력해서 발생한 에러이다. 정상적으로 빌드가 된다면 #2와 같이 둘 다 성공이 된다.
앞전에 했던 프로젝트에 명시적으로 다음 빌드 프로젝트를 기록하여 관리하는 것보다 파이프라인을 이용한 방식이 관리하기 훨씬 편해 보인다.
프로젝트가 많은 상황에서 대규모로 작업하기에도 이 방법이 훨씬 좋아 보인다.
4. 매개 변수 설정
프로젝트 빌드시 다음과 같이 명령어가 일부분 다를 경우에는 매개 변수 옵션을 설정하여 빌드 처리가 가능하다.
예:
ansible-playbook -i development site.yml --diff #개발환경
ansible-playbook -i production site.yml --diff #운영환경
Dasnboard에서 exec-ansible 프로젝트를 선택하고 옵션에서 "This project is parameterized"를 선택한다.
그리고 파라미터명을 ENVIRONMENT로 작성하고, 선택 값은 development production으로 작성한다.
다음으로는 Build 부분에서 playbook 실행 시 ${ENVIRONMENT} 파라미터를 받을 수 있도록 shell command를 수정후 저장한다.
그러면 아래와 같이 [Build Now] 버튼이 [Build with Parameters]로 변경되고, 변수를 설정할 수 있도록 변경된다.
여기서 "production"을 선택하여 빌드를 수행하고, curl명령어를 이용하여 원하는 설정이 잘 배포되었는지 확인해보자.
$ curl 192.168.33.10
실행결과 정상적으로 잘 동작하는 것을 확인하였다.
파라미터 옵션을 사용하면 범용적인 처리가 가능하며 프로젝트 수를 최소화하면서 효율적인 관리가 가능하다.
이번 포스팅에서는 Jenkins를 이용하여 빌드 파이프라인을 구축하는 방법에 대해서 알아보았다.
우리 회사에서는 nginx, nodejs, 컨테이너들을 하나하나 수동으로 빌드하고 배포했었다. DevOps 관련 툴들을 익혀나가면서 적용하면 좋을 것 같다고 생각되는 포인트들이 많이 생긴다. 다음 주쯤에 회사 프로젝트들도 Jenkins를 도입하여 이런 식으로 관리하도록 변경해야겠다.
참고자료
[1] IT 운용 체제 변화를 위한 데브옵스 | 2019 | 키와무라 세이고 ... | 링크
'클라우드 컴퓨팅 & NoSQL > Jenkins' 카테고리의 다른 글
[젠킨스(Jenkins)] Jenkins 프로젝트 생성 및 Build (0) | 2021.04.18 |
---|---|
[젠킨스(Jenkins)] Jenkins 소개 및 설치 방법 (0) | 2021.04.18 |