본문 바로가기

DevOps와 CI CD

Jenkins를 이용한 CI/CD Pipeline 구축 (3) Jenkins를 이용한 CI/CD 자동화

1. CI/CD를 위한 Git&Node.js 연동

1.1 Jenkins 환경설정 (1) Setup Git Plugin

jenkins에서 Git을 사용할 수 있게 환경을 구성해줘야함

(1) 플러그인 설치 : Jenkins 관리 → Plugins에서 available 탭 클릭, github plugin 설치

플러그인 설치 이후, jenkins 프로젝트에 사용할 git이 잘 설치 되었는지 확인해보자

docker ps
docker exec -it jenkins이름 bash
git --version

//exec는 도커 컨테이너 기동 상태에서 추가적인 커맨드로 더 전달하고자 할 때 사용할 수 있는 명령어
//-it는 -i (인터랙티브) 와 -t(tty) 명령어가 합쳐짐, 터미널을 열어서 해당하는 컨테이너에 터미널을 접속

 

 

(2) git 관련 설정 : Jenkins 관리 → Tools에서 git 설정을 해야함 (1) git 이름, (2) Path to Git executable은 git

 

(3) 빌드 Tool 플러그인 설치 ( Node.js,  Babel Transpiler )

 

 

 

※참고 : Babel Transpiler, PM2

더보기

- Babel Transpiler : 자바스크립트 컴파일러로써, 우리가 작성한 코드를 Node.js 런타임이 실행 가능한 형태로 변환을 시켜줄 것임

같은 언어를 유지하면서 다른 런타임에서 해당 코드가 정상적으로 해석되어서 실행할 수 있도록 형태만 바꿔주는 것이 트랜스파일러라고함

자바스크립트의 트랜스파일러 중에서 가장 많이 사용되어 있는 바벨을 이용해서 저희가 만들었던 node.js의 형태를 변경한 다음에 배포할 것임

 

- PM2 : Node.js 어플리케이션을 쉽게 관리할 수 있게 해주는 Process Manager

Cluster mode 실행 가능

명령어 : npm install -g pm2

 

 

1.1 (2) Jenkins 환경설정 : 빌드 tool 프로젝트 생성

(1) git 설정해서 소스코드 가져오기

(2) 빌드 관련 설정

 

 

1.2 실습 : git에서 코드 가져와서 빌드하기 (Maven 사용)

(1) 소스코드 관리

(2) 빌드 유발

(3) Pre Steps
(3-1) 이름 설정 : git에서 빌드하고자 하는 프로젝트 파일의 이름 설정

(3-2) Goals and options 설정 : clean compile package

 

 

 

 

2. CI/CD를 위한 로컬 Tomcat Server 연동

(1) plugin 설치 : deploy to container 

(2) jenkins 프로젝트의 Configure에서 빌드 후 조치에 Deploy war/ear to a container 선택

 

왼쪽 - 현재 폴더에 있는 war 확장자를 가진 파일은 전부 배포 / 오른쪽 - tomcat 서버 접속 시, 계정 설정
(톰캣 포트 8088로 설정했음, jenkins는 8080) 위의 URL을 http://172.21.48.1:8088/ 로 바꿔야함

톰캣 서버에서 배포한 파일이 제대로 갔는지 확인하려면 webapps 폴더에 가면 확인 할 수 있음!

그리고 url 주소를 설정할 때 주의점이 있음!

localhost가 아니라 Docker Host (Window 서버)의 IP address를 사용해야함

로컬 호스트로 할 경우 아래의 왼쪽 그림처럼 로컬 호스트를 도커 안에 있는 jenkins 자기 자신으로 판단해버림

그렇기 때문에 오른쪽 그림과 같이 ip 주소로 바꿔줘야함

 

3. Poll SCM 설정

주기적으로 업데이트된 내용을 확인해서 빌드를 자동으로 할 수 있는 설정은 Poll SCM을 통해서 할 수 있음

생성된 프로젝트에서   Configure Build Triggers에서 설정 가능

설정 종류는 2가지

(1) Build periodically  → cron job: 주기적으로 재빌드 (코드 변경 사항이 없다고해도 재빌드함) 

(2) Poll SCM  → cron job : 코드 변경사항이 있을 때만 재빌드(커밋이 있어야함)

 

※ cron : 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러

 

 

 

3-2. 로컬에 있는 Tomcat 서버 말고 다른 서버와 연동하는 작업

빌드 결과물을 다른 서버에다가 전달하기 위해서는 SSH를 해야함

환경 설정 

(1) SSH 플러그인 설치 (publish over ssh)

(2) ssh 설정

 

도커안에 도커, 빌드 결과물인 war 파일과 도커파일을 합쳐서 이미지 파일로 만들어서 배포 서버를 만들려고함

 

 

 

 

Windows 환경에서 Docker in Docker 방식으로 SSH+Docker 컨테이너가 기동되지 않을 때는 아래와 같이, Docker Out Of Docker 방식으로 기동해 보시기 바랍니다.

//SSH 서버 실행 명령어 (DinD 방식)
docker run --privileged --name docker-server -itd -p 10022:22 -p 8081:8080 -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup edowon0623/docker:latest /usr/sbin/init

// SSH 서버 실행 명령어 (DooD 방식)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:latest /usr/sbin/init

// 추가된 아래 코드의 의미는 호스트pc의 도커 데몬이 사용하고 있는 도커 소켓과 컨테이너 안에서 실행하고자 하는 도커 소켓을 연결시켜주는 명령어임
//-v /var/run/docker.sock:/var/run/docker.sock


//Windows3) SSH 서버 (with 도커 + no_iptables) 실행 명령어 (방법3, 위 명령어로 실행되지 않을 경우, iptables 사용하지 않고 실행)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:no_iptables /usr/sbin/init

 

jenkins과 ssh 서버 연결하기

(1) ssh 서버 기동 (위 코드들 중에서 3번째 코드 사용)

//Windows3) SSH 서버 (with 도커 + no_iptables) 실행 명령어 (방법3, 위 명령어로 실행되지 않을 경우, iptables 사용하지 않고 실행)
docker run -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /var/run/docker.sock:/var/run/docker.sock edowon0623/docker:no_iptables /usr/sbin/init

(2) jenkins 설정에서 ssh 설정하기

 

 

ssh서버에 ssh로 접속하기

ssh root@localhost -p 10022
// 비밀번호는 : P@ssw0rd

 

 

 

 

4. Docker를 이용한 실습 환경 구성

ㅇㄹ

 

(3) 도커 서비스 실행 : Dind (도커 in 도커) 방식으로 SSH 서버 기동 시, 서비스 상태 확인 및 실행

 

 

 

 

 

참고사항 정리

1. 우아한테크코스 4기 블로그 글 젠킨스

https://hudi.blog/continuous-deploy-with-jenkins-2-frontend/

 

- 프런트엔드 빌드는 webpack을 이용 (입력 : JS+html+css+이미지 / 출력 : index.html + bundle.js)

-  파이프라인 스크립트 사용

 

(1) Build Stage : npm install, npm run build

(2) Deploy Stage : sshagent를 사용하여 프론트엔드 배포 서버에 SSH로 접속하여 index.html 과 bundle.js 전송

 

 

 

2. 꼭 참고하기! 

https://crispyblog.kr/development/common/8

docker container 의 생명 주기와 관계없이 데이터나 설정 등을 영속적으로 사용하려면, 두 가지 방법 중에 하나를 택해야 합니다. '볼륨' 과 '바인딩' 이 그것인데요. 저는 호스트 서버와 컨테이너를 '바인딩' 하는 방식으로 사용하였습니다.

 

 

https://medium.com/@itzzpankaj004/building-a-ci-cd-pipeline-for-node-js-application-with-jenkins-and-docker-23dafcee93a7

 

 

3. 서버 : 우분투 / 아키텍처 - 도커 / 파이프라인 - 젠킨스 / 백엔드 - node.js express / DB - Maria DB

이것도 꼭 참고 

https://borntodevelop.tistory.com/category/DevOps/CI_CD?page=1

 

 

 

4. 강의 정리 블로그

https://junyharang.tistory.com/339

 

 

 

 

 

참고

https://github.com/babel/babel

 

GitHub - babel/babel: 🐠 Babel is a compiler for writing next generation JavaScript.

🐠 Babel is a compiler for writing next generation JavaScript. - GitHub - babel/babel: 🐠 Babel is a compiler for writing next generation JavaScript.

github.com

 

 

 

https://www.youtube.com/watch?v=cm_oM3yoB5Q

 

 

 

https://seongwon.dev/DevOps/20220717-CICD%EA%B5%AC%EC%B6%95%EA%B8%B02/

 

[DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축)

🔗 연관 게시글 CI/CD란? [DevOps] Jenkins를 통한 CI/CD 구축기 1편 (Jenkins 설치) [DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축) [DevOps] Jenkins를 통한 CI/CD 구축기 3편 (Frontend CI/CD 구축) [DevOps] Jenkins

seongwon.dev

 

 

 

https://medium.com/appgambit/ci-cd-pipeline-for-a-nodejs-application-with-jenkins-fa3cc7fad13a

 

CI/CD Pipeline for a NodeJS Application with Jenkins

In this article, we are talking about how to Build Node.js and React application on Jenkins with Freestyle Project.

medium.com