Jenkins?
→ 소스코드 변경 감지부터 빌드, 테스트, 배포까지 전체 CI/CD 파이프라인 자동화를 돕는 도구
- Waterfall : 순차적 프로젝트 관리 방법론
- Agile : 반복과정 통해 sw 진화, 사용자 니즈 만족시킴(Extreme, pari, tdd(test-driven development, scrum). 고객 요구사항 변경 시 바로 대응가능한 형식으로 진화 함
- Cloud Native Architecture :cloud infra 환경에서 운영되기 위한 application, service들을 최적 상태로 유지/사용하도록 해주는 architecture
- Cloud Native Application : cloud native archi에 의해 설계/구현되는 application. 문제가 생겨도 형태, 구조가 깨지지 않는 안티 프레그 같은 특징을 가진 구조
클라우드 네이티브 특징/구성요소
- microservices(여러개의 작은 독립적인 서비스들로 나누어 개발, 운영하는 아키텍처 스타일)
- containers : 어플리케이션을 구성하고 있는 micro svc를 클라우드 환경에 배포, 사용위해 컨테이너 가상화 기술이 사용됨
- devops : 서비스에 문제 발생시, 사용자 니즈 생겼을 시->바로 수정/반영/배포 위해 개발-운영조직간 유기적 협력 통해 지속적으로 서비스를 개선해나가는 방법/특징
- cicd : 위처럼 개발된 Micro svc 들은 cicd 자동화 pipeline 통해 자동으로 통합/빌드/테스트/배포 과정 거쳐 운영 상태가 된다
MSA
- inner, outer architecture 나누는 방법
| inner | 단순 도메인에 대한 부분을 가지고 서비스를 개발하는 쪽 |
| outer | inner archi로 구성되어있는 application들이 운영/작동될 수 있도록 지원해주는 서포티드 시스템 |
- CICD: 개발자, 팀에 의해 개발된 결과물에 대해 지속적인 통합/배포를 하는 프로세스. 통합/빌드/테스트/배포 전 과정에 대한 자동화 처리를 담당
CICD란?
| ci(continuous integration) | • 작업된 코드의 compile, test, packaging 작업 -> 작은 단위로 여러번 자주 배포하는 것 • 통합을 위해 build, teset, merge 부분들을 자동화 하는 것 • 코드의 품질이 전체적으로 향상함(단위테스트를 포함시켜서 코드 검증을 하기 때문) |
| cd(Continuous Delivery/Deployment) | • ci 에 의해 packaging된 결과물을 다시 개발 서버/테스트서버/운영서버로 배포하는 작업 -> 지속적인 배포와 제공 • 통합된 데이터를 검증하고 최종 배포를 수동으로 하는 작업 -> 딜리버리(delivery) 수작업이냐 • 자동으로 전 과정을 배포하는 것 -> 디플로이먼트(deployment) 자동화 처리냐 |
ci 역할
1. vcs, scm(git) (형상관리 시스템)에 업로드 -> 버전관리, 소스코드의 트래킹 관리
ex) git, github, gitlab, bitbucket
2. Jenkins - ci 부분 커버 가능. 패키징 되어있는 결과물을 환경에 배포
build-test-package
3. 배포
ci/cd flow
• build는 maven, gradle로 시작
• build 결과물 운영 서버에 배포 -> (컨테이너 가상화 형태로 서버 운영) 컨테이너 런타임 중 docker 사용
• docker container의 배포관리, 시스템 관리를 위해 오케스트레이션 도구인 kubernetes 사용함
** docker, cri-o, container-d : 컨테이너 런타임
Jenkins
cicd(지속적 통합/배포)작업에 있어서 시스템의 자동화 파이프라인, 워크플로우를 설계하는데 사용되는 도구
무료, 플러그인, 레퍼런스 많음
• Jenkins pipeline : cd 작업에 의해 필요한 파이프라인을 실제로 구현, 통합하는 것을 지원하는 플러그인
DSL(Domain Specific Language) : 도메인에서 정의한 특화된 언어. 그 서비스에서 새로 정의해서 만든 언어
• Jenkins의 문법
ex) dockerfile, jenkins file
• Jenkins file : 1)선언형 방식, 2) 스크립트 방식
https://www.jenkins.io/download/
Download and deploy
Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software
www.jenkins.io
도커에서 젠킨슨 배포하기
docker pull jenkins/jenkins
jenkins 실행
1) docker run -d -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure jenkins/jenkins:lts-jdk11
2) docker run -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
• -p : publish option : 컨테이너 내부에 있는 포트(오른쪽)를 컨테이너 바깥쪽에 있는 환경(왼쪽)에서 어떻게 접속해서 사용할 것인지를 나타내는 설정
• -p 8080:8080
: 컨테이너 밖에서(왼) 8080 포트 사용하면, 컨테이너 내부(오)로 8080접속이 된다
✧ 왼쪽 8080 → 집 현관문 번호 (내 컴퓨터에서 쓰는 포트)
✧ 오른쪽 8080 → 방 안 방문 번호 (컨테이너 안에서 쓰는 포트)
• -p 50000:50000
: 밖의 5만포트를 내부의 5만 포트로 연결해라
• --restart=on-failure
: fail되면 restart해라
• jenkins/jenkins:lts-jdk17
/repository name : tag name
• docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --restart=on-failure jenkins/jenkins:lts-jdk17
• -v : volume
로컬 pc에 대한 어떤 디렉토리와 도커 내부의 디렉토리와 mount(연결작업) 할거냐에 대한 설정
mount 하는 이유) 안하면 도커 내부에 발생된 데이터는 도커 내부에만 저장된거라 도커 삭제되면 데이터 날아감
그래서 도커 내부 발생한 데이터를 외부에(로컬)에 해당하는 폴더의 내용을 연결해서 링크를 잡은 다음에 저장하는 방법
• docker run -d -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins-server --restart=on-failure jenkins/jenkins:lts-jdk21
>> 오류나서 21버전으로 수정
• -d : daemon = background 형태로 실행

• 0.0.0.0:8080->8080/tcp
어떤요청이 들어와도 (왼)8080요청이 들어오면 -> 8080(오)으로 넘겨주겠다.
5만도 똑같
1) Jenkins 설정 작업
1. 접속 방법 = (localhost)내ip:8080

1-1. 비번 확인
>> docker logs jenkins-server
• 모든 플러그인 다 설치하기



• restart 오래걸림;


- item : jenkins에서 사용하고 있는 작업의 최소 단위
- Jdk 설정해야하는데 Jenkins를 docker img를 사용했다면 따로 JDK설정안해도 됨(로컬에 설치했다면 설정해줘야함)
2) 첫번째 프로젝트 생성하기



- item 실행하게 되면 작성한 shell script가 실행되도록 설정(Linux shell script)



2-1) 지금 빌드 실행

- javac -version : jdk 버전 확인
재실행


- workspace 확인하기
/var/jenkins_home/workspace/first-pj
- 도커의 터널링을 이용해서 확인 가능
docker exec -it jenkins-server bash
exec : 터널링 접속
~ ❯ docker exec -it jenkins-server bash
jenkins@ff490cf50a26:/$
2-2)
container-id : @뒤에 문자들 = host name으로 사용되고 있음
jenkins : 계정 명

- jenkins 내부 파일 명
이동해서 확인하면 빌드한건 따로없어서 파일 같은거 없음

exit
docker stop jenkins-server
로 마무리