지금 AWS를 이용하여 3tier 인프라 환경 구축을 진행중에 있는데,
단순 배포만 하자니 재미없을 것 같아 3tier 구성 겸 CI/CD 파이프리인 배포도 추가 구성해보려 하고 있다.
유명한 CI/CD 툴로는 젠킨스, 깃랩, bamboo 등이 있고 CD에만 집중된 GitOps, FluxCD, ArgoCD 등,
환경에 따라 다수의 툴들을 연동하여 사용하기도 한다.
본인은 CI/CD 구성의 진행 경험이 없다.
그래서 일단 예전 근무지에서 자주 접한 젠킨스를 활용해서 간단한 CI/CD 테스트 구성을 진행해보도록 하겠다.
jenkins란
젠킨스는 java 기반의 CI/CD 툴이다.
쉽게 빌드와 테스트, 배포를 자동화하는 오픈소스 도구라고 생각하면 된다.
주로 소프트웨어 개발 및 배포 프로세스에 사용되며, 코드 변경 사항을 자동으로 빌드/테스트하고 배포하는데 도움을 준다.
CI/CD란?
- CI(Continuous Integration, 지속적인 통합): 지속적인 빌드와 테스트 자동화를 의미한다.
- CD(Continuous Delivery, 지속적인 서비스 제공 또는 지속적인 배포) : 배포 자동화를 의미한다.
쉽게 생각하면 개발만 하면 알아서 테스트,빌드 후 배포까지 해주는 것이다.
진행 방식
현재 github에 flask 소스가 업로드 되어있는 상태이다.
jenkins 서버를 하나 구축하였고, jenkins에서는 github의 상태 변화를 주기적으로 체크한다.
개발서버에서 git add 등 변경사항이 발생하면 github의 변화를 jenkins가 감지하여 flask를 container image로 빌드한다. (jenkins에서 말고도 github에서 webhook으로 감지도 가능하다. 추후에 webhook도 추가할 예정)
이후 본인 dockerhub에 이미지를 push하며,
해당 이미지를 이용하여 flask 애플리케이션을 docker container로 동작시킨다.
(이후 github webhook으로 상태 변화 체크를 진행할예정)
간단히 설명하면 github의 수정사항이 발생하면 jenkins에서 github 코드를 이용하여 docker image를 생성하고 이를 dockerhub에 업로드함과 동시에 container로 동작시킨다.
jenkins 설치(container)
# docker run
root@worker1:~# docker run -d -u root -v /var/run/docker.sock:/var/run/docker.sock --name cw-jenkins-1 -p 8085:8080 -p 50000:50000 jenkins/jenkins:lts
Unable to find image 'jenkins/jenkins:lts' locally
lts: Pulling from jenkins/jenkins
34df401c391c: Pull complete
9acbf850b29f: Pull complete
.
.
# docker container 상태 확인
root@worker1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52e98ecd0d8c jenkins/jenkins:lts "/usr/bin/tini -- /u…" 34 seconds ago Up 3 seconds 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8085->8080/tcp, :::8085->8080/tcp cw-jenkins-1
docker run -d -u root -v /var/run/docker.sock:/var/run/docker.sock --name cw-jenkins-1 -p 8085:8080 -p 50000:50000 jenkins/jenkins:lts
해당 명령의 옵션설명을 간단하게 해보겠다.
- docker run : docker container를 실행
- -d : background로 실행
- -u root : -u 옵션은 container가 실행될 계정이다.
즉, container root로 실행 - -v /var/run/docker.sock:/var/run/docker.sock : -v 옵션은 container의 특정 디렉터리, 파일을 마운트한다. 데이터 볼륨 설정이라고 보면 된다.
즉, 컨테이너에서 호스트의 docker.sock를 사용한다고 생각하면 된다.
(위처럼 사용한 이유는 jenkins로 flask app을 컨테이너로 실행시킬건데
jenkins도 컨테이너로 실행되고 있어서 그렇다.) - --name cw-jenkins-1 : container의 이름을 설정한다.
- -p 8085:8080 -p 50000:50000 : container의 포트를 지정한다.
호스트와 컨테이너 포트를 리다이렉트 하는 것으로, 호스트의 8085 포트로 접근하면
컨테이너의 8080 포트로 접근하는 것이다.
호스트에서 8080을 사용하는 node가 있어 8085로 지정하였다. - jenkins/jenkins:lts : container의 기반이 될 image이다. 해당하는 image가 없어도 자동으로 pull한다.
이후 docker ps
로 container가 잘 run 되었는지 확인한다.
jenkins container docker-compose 설치
젠킨스에서 docker image를 빌드하러면 docker 패키지가 필요하다.
그래서 전 docker run에서 호스트의 docker.sock을 사용하게 설정하였는데,
마찬가지로 docker-compose를 사용하기 위해 docker-compose 패키지를 젠킨스 컨테이너에 직접 들어가서 설치하겠다.
# cw-jenkins-1 컨테이너 bash 환경으로 접속
# user를 지정하러면 -u 옵션을 사용
root@worker1:~# docker exec -it cw-jenkins-1 /bin/bash
# docker-compose 패키지 설치를 위한 update 진행
root@52e98ecd0d8c:/# apt-get update -y
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
.
.
# docker-compose 패키지 설치
root@52e98ecd0d8c:/# apt-get install -y docker-compose
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
.
.
jenkins 초기 설정
host의 8085포트로 jenkins web에 접속하면 jenkins의 초기 설정 창으로 이동한다.
위에 지정된 파일에서 passwd를 입력한다.
/var/jenkins_home/sercerts/initalAdminPassword
본인은 container로 동작하고 있기 때문에 컨테이너에 접속하여 확인했다.
# container 접근
docker exec -it cw-jenkins-1 /bin/bash
# passwd 확인
cat /var/jenkins_home/secrets/initialAdminPassword
플러그인 설치 화면이다.
Select plugin to install
로 직접 플러그인을 골라 선택할 수 있지만,
일단 기본적으로 제공하는 플러그인 설치를 진행하겠다.
플러그인이 설치된다.
이후 jenkins admin 계정을 생성한다.
skip 버튼으로 다음에 생성도 가능하다.
이렇게 jenkins 설치 및 초기설정이 완료되었다.
다음에는 github 및 dockerhub와 연동 및 pipeline 생성하여 빌드하는 방법을 알아보도록 하겠다.
'CICD > Jenkins_젠킨스' 카테고리의 다른 글
[CICD] jenkins build & push, 서비스 run(3) (0) | 2023.08.29 |
---|---|
[CICD] pipeline 생성 및 github/dockerhub 연동(2) (0) | 2023.08.23 |