[DevOps] Github & Jenkins 연동

 2) git과 젠킨스 연동

각각의 설정 방법 숙지
백/프론트 빌드 환경에 맞게 설치를 진행
직접 쉘 스크립트 작성 가능 ex) mvn package

 

깃 허브 푸시 -> 젠킨스에 알람이 울림 -> 젠킨스가 나머지 작업을 대행

 

깃허브가 젠킨스에게 알람을 줄 수 있도록 설정을 해보자

깃허브가 젠킨스가 설치된 가상 머신에 접근이 불가하다 - 사설 네트워크 이기 때문에

그래서 찾아 올 수 있도록 포트포워딩 작업을 해주어야함 

나같은 경우에는 사설 Ip가 192.168.0.105번인데 포트 9105번 포트를 배정 받았다.

이렇게 되면 깃허브가 젠킨스에 알람을 전송할때 공인 Ip에 9105번 포트로 전송을하고, 그러면 내 사설  Ip로 접근되어 알람이 울릴수 있게 된다.

강사님이 포트포워딩을 해주셨으니 나는 VmWare 포트포워딩만 해주면 된다.

 

다음과 같이 진행

 

 

 

 [0] 젠킨스 설치된 컴퓨터에 git 설치
	yum install git

 

 

    [1] github 접근 토큰 생성
	github에 오른쪽 상단 계정 -> settings -> Developer settings -> Personal access token 
    -> Tokens(classic) -> Generate new token -> Generate new token(classic)이름 입력 -> repo 체크,  admin:repo_hook 체크 후 Generate token -> 키는 반드시 복사해둘 것

repo 체크, admin:repo_hook 체크 후 Generate token -> 키는 반드시 복사해둘 것

[2] 젠킨스에서 api key 생성
	젠킨스 대시보드 -> 오른쪽 상단 사용자 프로필 -> 설정 -> API Token에서 Add new Token 클릭 후 아무 이름이나 입력 -> 토큰 복사 -> save

 

[3] 젠킨스에 github 키 등록 // 유저 확인
	젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> GitHub에서 Add GitHub Servers 클릭 후 Github Server -> Name 적당히, Add 클릭 -> Jenkins
	-> Kind: Secret text, Secret: [1] 에서 복사한 키 넣기, ID는 적당히 입력 후 Add 버튼 클릭 -> Credentials에서 추가한 것 선택 -> Test Connection 클릭 -> 저장

 

[4] github 웹훅 설정 // 레포지토리 확인
	github에 레포지토리 생성하고 setiings에서 webhook 설정
	// webhook은 깃헙이 젠킨스한테 요청을 보내는 방법
    
	http://공인IP:포트번호(배정받은 포트번호)/github-webhook/
	secret 부분에 2번에서 생성한 key 입력

 

[5] 파이프라인 생성 // 작업 단위를 의미 , 프론트 배포 1 백엔드 배포 1
	새로운 Item -> 이름 입력 -> Freestyle -> OK -> GitHub project 체크 -> 소스 코드 관리에서 Git 체크 -> 레포지토리 주소 입력
	 -> 빌드 유발에서 GitHub hook trigger for GITScm polling 체크 -> Build Steps에서 Add build step 클릭 후 Execute shell클릭 후 echo test 입력 -> 저장

master에서 main으로 변경해주었다.

이유는 타겟 branch를 변경해주기위해

 

 [6] 깃으로 푸시
	로컬 저장소에서 git push로 원격 저장소에 commit 내역 저장

 

 

파이프라인 동작까지 세팅 완료

 

이후 해야할일 ?

 

젠킨스가 ec2에 ssh를 이용해서 배포 다른 가상머신에 배포

 

푸시한 html 파일을 젠킨스에서 확인

 [1] 젠킨스에 SSH 관련 플러그인 설치
 	대시보드 -> Jenkins 관리 -> Plugin Manager -> 설치 가능 -> Publish Over SSH 검색 후 체크 
	-> Download now and install after restart -> 설치가 끝나고 실행중인 작업이 없으면 Jenkins 재시작

 

마이크로 서비스 하나당 파이프라인 하나

현재 우리는 프론트 백 당 파이프라인 하나

 

젠킨스 서버에서 키생성 (컨트롤노드)

매니지드 노드에 키를 복사해줌

자유롭게 접근 가능

 

생성한 키는 cat  ~/.ssh/id_rsa 로 조회 가능

 

remote direction = /root 로 설정

 

Send files or execute commands over SSH after the build runs // 빌드 후 작업

 

source files는 옮기고자하는 젠킨스에 설치되어있는 파일 /var/lib/jenkins/workspace/devops/*.html 에 있다면 Remove prefix로 앞에 달린걸 원하는 만큼 삭제

 

remote directory : 파일을 가상머신 어디에 놓을지

 

exec Command : ls -R 디렉토리의 위치를 추적하여 다 표시 보통은 시스템 재시작, 리로드 작업들을 해준다

 

[2] 젠킨스 서버에서 SSH Key 설정
	ssh-keygen
	엔터 3번

	ssh-copy-id   root@테스트머신IP
	패스워드

	ssh root@테스트머신IP 했을 때 패스워드 없이 접속

	exit


    [3] 젠킨스 설정 수정
	키파일 내용 확인 cat ~/.ssh/id_rsa


	젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기, SSH Servers에서 추가버튼 클릭
	-> Name: 아무거나, Hostname: 테스트머신IP주소, Username: root -> 저장

	파이프라인 선택 -> 구성 -> 빌드 후 조치 에서 Send build artifacts over SSH
	 -> Name: 아무거나, Source files: *, Remote directory: /, Exec command: echo test -> 저장

    [4] 확인
	개발도구에서 개발자가 소스 수정 후 github에 push

 

 

키 생성
키 생성 후 클라이언트에 서버 키 복사
패스워드 없이 접속 확인

 

로그아웃

 

키 파일 내용 확인

 

	젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기, SSH Servers에서 추가버튼 클릭
	-> Name: 아무거나, Hostname: 테스트머신IP주소, Username: root -> 저장

젠킨스 설정 수정

 

파이프라인 선택 -> 구성 -> 빌드 후 조치 에서 Send build artifacts over SSH
	 -> Name: 아무거나, Source files: *, Remote directory: /, Exec command: echo test -> 저장

  [4] 확인
	개발도구에서 개발자가 소스 수정 후 github에 push

 

정상적으로 사진 이동

 

이후에 한 실습

깃 허브에 푸쉬하면, 깃허브가 젠킨스한테 알람을 보내고 알람을 받은 젠킨스가 젠킨스 클라이언트한테 프론트 프로젝트를 빌드한 결과를 전송해준다

 

젠킨스 서버 젠킨스 클라이언트

 

젠킨스 서버에 node js 설치

curl -sL https://rpm.nodesource.com/setup_20.x | sudo -E bash -

yum install -y nodejs   

                                  

젠킨스 빌드 

npm i
npm run build
cd dist
tar -cvf front.tar ./*
rm -rf ../front.tar
mv front.tar ../

 

젠킨스 클라이언트에 nginx 설치

yum install nginx

젠킨스 빌드 후 배포

 

이러한 방식으로 배포를 진행하게되면 불가피하게 다운타임이 발생하게된다.

그래서 nginx에서 무중단 배포를 위한 reload 명령어를 활용하여 해결한다.

 

정리

1) 개발자가 코드를 깃 허브에 푸시
2) 푸시된 내용이 깃 헙의 웹 훅을 통해 등록한 젠킨스에 전송
3) 수신을 받은 젠킨스는 수신한 요청을 분석해 어느 깃 헙 레포지토리에서 온 것인지 확인 후 지정된 파이프라인 작업을 수행
4) 이후 젠킨스가 설치된 컨트롤러 노드에서 본인이 관리하는 마스터 노드로 빌드된 결과물을 SSH 프로토콜을 통해 전송

특징
1) 젠킨스에 깃헙 관련 등록은 계정당 한번만 하면 됀다.
2) 깃헙의 레포지토리를 젠킨스에 등록할때마다  젠킨스에서 API Key를 발급받아 깃 헙 레포지토리 웹 훅에 등록해주어야한다.
3) 젠킨스 서버와 클라이언트간에 SSH 통신을 사용한다
4) 젠킨스 서버의 ssh key를 클라이언트에 등록해주어야 서버가 자유로이 클라이언트에 접근 가능하다