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 선택
톰캣 서버에서 배포한 파일이 제대로 갔는지 확인하려면 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 설정
//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 의 생명 주기와 관계없이 데이터나 설정 등을 영속적으로 사용하려면, 두 가지 방법 중에 하나를 택해야 합니다. '볼륨' 과 '바인딩' 이 그것인데요. 저는 호스트 서버와 컨테이너를 '바인딩' 하는 방식으로 사용하였습니다.
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
'DevOps와 CI CD' 카테고리의 다른 글
Docker와 Redis (0) | 2023.11.16 |
---|---|
Jenkins를 이용한 CI/CD Pipeline 구축 (5) Pipeline (Advanced Jenkins 사용) (1) | 2023.10.24 |
Jenkins를 이용한 CI/CD Pipeline 구축 (2) Jenkins 소개 및 설치 그리고 환경설정 (0) | 2023.10.18 |
Jenkins를 이용한 CI/CD Pipeline 구축 (1) DevOps와 CI/CD 이해 (0) | 2023.10.18 |