토이 프로젝트/서버갖고 놀기 for DevOps

Jenkins 로 프로젝트 빌드 & 배포하기 - 1) Jenkins 설치 및 설정잡기 (feat. mail 연결)

TerianP 2023. 4. 8.
728x90

오랜만에 돌아온 갖고 놀기 시리즈!!

사실 원래는 datachannel 에 대한 내용에 대해 글을 쓰고 싶었는데 결국 Jenkins 연동에 대해서 먼저 글을 작성하게 되었습니다..ㅠㅠ

 

어쨌든 Jenkins 연결 일대기 시작하겠습니다!

 

1. Jenkins 란?

Jenkins는 지속적인 통합 (Continuous Integration, CI) 및 지속적인 배포 (Continuous Delivery, CD)를 지원하는 자동화 서버이다. 소프트웨어 개발자, 시스템 관리자 및 IT 전문가들은 Jenkins를 사용하여 소프트웨어 개발 및 배포 프로세스를 자동화 할 수 있다.
Jenkins는 다양한 플러그인과 호환되며, 이를 통해 다양한 소프트웨어 개발 및 배포 프로세스를 자동화 할 수 있다. 예를 들어, Jenkins는 소스 코드 저장소에서 코드를 가져와 빌드하고, 테스트하고, 패키지를 만들어 배포 할 수 있다. 동시에 Jenkins는 다양한 운영 체제와 통합되어 사용할 수 있으며, 이를 통해 소프트웨어 개발자와 시스템 관리자는 자신들이 선호하는 도구와 시스템과 통합하여 Jenkins를 사용할 수 있다.
이러한 Jenkins의 장점 중 하나는 무료 및 오픈 소스 소프트웨어이며, 커뮤니티에서 지속적으로 발전하고 있으며, 지속적인 업데이트 및 유지 보수가 이루어지고 있다. Jenkins는 매우 유연하며, 소프트웨어 개발 및 배포 프로세스를 자동화하기 위해 사용되는 다양한 플러그인을 사용할 수 있습니다. 정말 다양한 플러그인이 존재하기에 사용하기에 따라서 Jenkins는 개발자 및 시스템 관리자에게 자동화된 소프트웨어 개발 및 배포를 위한 강력하고 유용한 도구라고 할 수 있다.

 

2. 그래서 왜 Jenkins?

사실 서버에 많은 관심이 있는 개발자들은 얼마 없다고 생각한다. 당연하게도 '개발'이 우리들의 1순위 목표이고, 개발에 대해서 공부하고 생각하기만해도 충분히 바쁘기 때문이라고 생각한다.

그럼에도 용어 자체는 충분히 많이 접했을 몇몇 서버 프로그램들이 있다. 그 중에 하나가 바로 Jenkins, 일명 젠킨스라고 불리는 친구이다. 이 친구의 역할은 아주 간단하다. 바로 개발 후 프로젝트 결과물 - 소프트웨어 결과물 - 에 대해서 빌드 및 배포를 자동화 해주는 도구이다.

 

젠킨스를 사용하기 전까지 우리는 프로젝트를 빌드 후 배포하기 위해 아래의 과정을 거친다.

1) 프로젝트를 gradle 로 빌드한다.
2) 빌드 후 결과물 ex) .Jar 를 웹 서버에 올린다.
3) .jar 파일을 실행한다.

 

아마 도커 컨테이너를 사용해도 비슷한 단계를 거칠 것이다.

1) 프로젝트를 docker image 로 빌드한다.
2) 빌드된 docker image 를 docker hub 에 올린다.
3) 웹 서버에서 docker image 를 다운받는다.
4) 서버에서 docker image 를 container 로 실행한다.

이 과정은 일반적으로 가장 단순한 경우에서의 과정이다. 중간중간 여러 작업들이 추가되어 훨씬 더 복잡해질 수 있다는 것이다. 심지어는 리눅스(보통 웹 서버는 대다수 linux 를 사용하기에 linux를 예시로 하겠습니다)의 명령어를 잘 모르거나 익숙하지 않은 개발자의 경우에는 더 어려울 수 있다.

그러나 Jenkins 의 등장은 모든 것을 바꿔놓았다. Jenkins 를 사용하면 위의 과정이 단 한번의 push 와 pull request 를 통해 자동으로 이루어진다. 즉, 개발자가 개발 완료 후 github 혹은 gitlab 에 push 하게 되면 github/lab 과 연결된 jenkins 가 해당 push 를 감지하고(webhook) 자동으로 빌드 후 배포까지 해주게된다.

 

도커 이미지를 예로 들자면, 내가 github 에 push 하게 되면 webhook 를 통해 push log 를 jenkins 가 받게되고, 젠킨스는 해당 github 의 내용물을 들고 docker image 로 빌드 후 container 로 자동 배포하게 된다. 이번 글에서는 바로 이렇게 docker container 로 배포하는 것까지 할 예정이다.

 

3. DevOps 와 Jenkins

DevOps는 현대적인 소프트웨어 개발 방식 중 하나로, 기존의 개발팀과 운영팀이 분리되어 작업을 하던 방식에서 벗어나, 개발팀과 운영팀이 함께 협업하여 일을 진행하는 방식을 지향합니다. 이를 위해 릴리즈 전략, 인프라 자동화, 모니터링 및 로깅, 이슈 트래킹, 커뮤니케이션 및 협업 도구 등 다양한 방법과 도구를 사용합니다.

Jenkins는 이러한 DevOps의 대표적인 자동화 도구 중 하나로, 지속적인 통합(Continuous Integration) 및 지속적인 배포(Continuous Deployment)를 지원합니다. Jenkins를 이용하면 코드 변경 시 자동으로 빌드하고 테스트하며, 테스트를 통과한 경우 배포를 자동으로 수행할 수 있습니다. 이를 통해 소프트웨어 개발과 배포의 자동화를 가능케 하여, 소프트웨어 개발 및 운영 팀 간의 협력을 강화하고 더욱 신속하게 배포할 수 있도록 도와줍니다.

현재 Jenkins는 DevOps의 핵심 도구 중 하나로 자리 잡고 있으며, 지속적인 통합 및 배포, 자동화된 빌드, 코드 품질 향상, 빠른 배포 등을 가능케 해주며 개발과 배포의 편의성을 크게 향상시켰습니다. 이러한 기능들은 소프트웨어 개발 및 운영 팀의 협업을 강화하고 개발 프로세스를 더욱 효율적으로 만드는 데에 큰 역할을 합니다.

 

4. Jenkins 설치

Jenkins 는 docker image 를 다운받아 설치한 후 실행하도록 한다.

 

1) docker pull 과 jenkins image 를 다운받는다

docker pull jenkins

 

2) run 명령어를 사용해 image 를 실행시킨다.

  • -특히 -v 옵션으로 사용되는 docker.sock 은 이번 포스팅의 핵심이 되는 옵션이다.
    • 이 옵션은 docker container 로 실행되는 Jenkins 가 docker image 를 빌드하고, 해당 이미지를 실행할 수 있도록 서버에 설치된 docker 소켓과 연결해주는 옵션이다.
    • 기본적으로 Docker의 호스트 머신과 컨테이너 내부에서 Docker를 사용하기 위해서는 Docker 소켓이 필요하다. 하지만 보안상의 이유로 기본적으로 Docker 소켓에 대한 외부 접근이 차단되었다. 따라서, 호스트 머신과 컨테이너 내부의 Docker 소켓을 공유함으로써 컨테이너 내부에서도 Docker 명령어를 실행할 수 있도록 한다.
docker run: Docker 컨테이너를 실행하는 명령어입니다.
-itd: 컨테이너를 대화형(interactive) 모드로 실행하며, 백그라운드(background)에서 실행하도록 설정합니다.
-d: 컨테이너를 백그라운드(background)에서 실행합니다.
--name jenkins: 컨테이너의 이름을 "jenkins"로 지정합니다.
-v /var/run/docker.sock:/var/run/docker.sock: Docker의 호스트 머신의 Docker 소켓과 컨테이너 내부의 Docker 소켓을 공유합니다. 이를 통해 컨테이너에서 Docker 명령어를 실행할 수 있습니다.
-u jenkins:122: 컨테이너 내부에서 Jenkins 프로세스를 실행할 때 사용할 사용자 계정을 지정합니다.
--env JENKINS_OPTS=--httpPort=8989: Jenkins의 HTTP 포트를 8989로 지정합니다.
-p 8989:8989: 호스트 머신의 8989 포트와 컨테이너 내부의 8989 포트를 연결합니다.
-p 50000:50000: 호스트 머신의 50000 포트와 컨테이너 내부의 50000 포트를 연결합니다.
jenkins/jenkins: Jenkins 이미지를 사용하여 컨테이너를 생성합니다.
docker run -itd -d --name jenkins -v /var/run/docker.sock:/var/run/docker.sock -u jenkins:122 --env JENKINS_OPTS=--httpPort=8989 -p 8989:8989 -p 50000:50000 jenkins/jenkins

 

3) 아래 명령어를 사용해 Jenkins 의 초기 비밀번호를 확인한다.

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

 

4) 서버주소:8989 로 접속한다.

- 접속 후 화면에서 기본 패스워드를 입력한 후 suggested plugins 로 환경을 구성한다.

- 플러그인에 대해 아는 사람이라면 select plugins로 해도 상관없다

초기 비밀번호 입력!
왼쪽!

5) 관리자 계정 등록까지 일사천리로 진행!

잘 기억하자

6) 최종적으로 아래와 같은 멋진 로그인 화면이 우리를 반겨준다

설치 및 초기 환경 구성 성공!

 

※ Jenkins 에서 docker 사용을 위한 추가 설정!

1) 컨테이너에 접속한다.

docker exec -it jenkins /bin/bash

2) 아래 명령어로 docker 를 설치한 후 권한을 설정한다.

apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
usermod -aG docker jenkins

 

5. Jenkins 설정 구성하기 - github 설정

이제 Jenkins 의 가장 중요한 설정인 github 와 mail 설정을 할 시간이다.

사실 github 와 본격적으로 연동하는 부분은 프로젝트에서 하는 것이고 여기서는 기본 주소만 등록하는 정도이다.

 

Github Token 발급

1) 가장 먼저 github 와 연동하기 위해 github 에서 Token 을 발급받아야한다.

  • github - Settings 로 들어간다

2) Developer settings 로 들어간다.

 

3) Personal access tokens - Tokens(classic) - Generate new token 을 눌러 새로운 토큰을 발급받는다

  • 본인처럼 이미 토큰이 있는 경우 webhook 관련 권한, repo 관련 권한이 있는지 확인하면 된다. 없다면 당연히 새로..ㅠㅠ
  • Generate new token 은 classic token 과 아닌 것 총 2가지 방법이 있다. classic 는 본인이 권한을 체크하는 것이고 아닌 것은 알아서 권한을 넣어주는 것 같은데...나는 classic 으로해서 권한을 직접 넣도록 하겠다

 

4) 아래처럼 권한을 체크한다.

  • repo 권한
  • webhook 권한
  • admin:org 권한은 조직의 관리자로서 수행할 수 있는 권한으로 이건 없어도 될 듯

repo 와 repo_hook 권한!

5) 생성 버튼을 누르면 github token 이 생성되는데 꼭 잘 적어두자. 두번 보여주지 않는다.

 

Jenkins - Github 연동

1) Jenkins 관리 - System 으로 들어간다

2) GitHub 부분을 찾아서 GitServer 를 설정한다.

  • 아래에 적어주어야하는 내용은 github 서버의 api를 저장&연동하는 하기 위해서이다. 원래 저 자리에 add GitHub Server 라는 버튼이 있다. 해당 버튼을 누르면 아래처럼 github 와 관련된 정보를 입력하는 칸이 보인다.
  • Name 과 API URL 을 입려한 후 Add - Jenkins 를 눌러서  Credentials 에서 어떤 계정의 깃허브 서버의 api를 연동할 것인지 설정을 한다.
  • 설정은 아래처럼 잡은 후 save 를 누른 후 test connection 을 꼭 해본다
kind : Secret text
Scope : Global
Secret : GitHub Token
ID : 원하는거
Desc : 원하는 내용

Add - Jenkins 설정
Test connection

 

6. Jenkins - Mail 연동하기

Jenkins 에서는 메일 설정을 통해 프로젝트 빌드 결과와 로그를 메일로 받을 수 있다. 그리고 나는 메일을...gmail 이나 naver 메일이 아니라 내가 직접 구축한 메일 서버를 이용해서 보내고 받을 생각이다ㅋㅋㅋㅋ드디어 우리 메일 서버가 일한다ㅠㅠ

2022.01.29 - [토이 프로젝트/서버갖고 놀기 for DevOps] - 메일 서버 구축하기 dovecot, postfix - (6) mysql + postfix + dovecot + Thunderbird 연동하기

 

메일 서버 구축하기 dovecot, postfix - (6) mysql + postfix + dovecot + Thunderbird 연동하기

오늘은 드디어 마지막 입니다. 이전에 연동되었던 mysql + postfix + dovecot 을 외부 메일 프로그램인 Mozilla Thunderbird 와 연동해보도록 하겠습니다. 단순히 연동만 하는것이기 때문에 짧은 글이 될 것

terianp.tistory.com

 

먼저 메일 서버가 살아있는지 테스트한다.

우리 메일 서버님 아직 살아계셨어요...감사합니다. 솔직히 최근에 테스트 할 때까지 죽은 줄 알고 걱정 많이 했었다

살아계셔서 감사합니다

Jenkins container 에서 ssl 작업하기

아마 나처럼 개인 메일 서버를 사용하는 경우, 높은 확률로 개인 자체 인증서를 사용해서 ssl 인증을 마쳤을 것이다.

만약 gmail 이나 naver 메일을 사용하는 경우나 ssl 인증을 공식 인증서를 사용해서 하는 경우 현재 부분은 필요없고 바로 Jenkins - Mail config 로 넘어가면 된다.

Jenkins 는 보안을 잘 생각하는 - 까다로운 - 친구라서 자체 인증서를 사용한 경우 Jenkins keytool 에 꼭 추가해주어야 한다.

 

1) 호스트에서 아래 명령어를 사용해 내 mail server 의 ssl 인증서를 다운로드 받는다

openssl s_client -connect [mail-server]:[port] -showcerts < /dev/null | openssl x509 -outform PEM > my-mailserver.crt

 

2) 다운로드 받은 인증서를 jenkins container 에 복사한다. 

docker cp my-mailserver.crt jenkins:/tmp/

 

3) 아래 명령어를 사용해 cacerts 의 위치 - Path - 를 확인한다

docker exec -it jenkins find / -name cacerts 2>/dev/null

 

4) Jenkins 컨테이너에 root 권한으로 접속한다.

docker exec -it -u root jenkins /bin/bash

 

5) Jenkins 컨테이너에서 keytool 에 인증서를 등록한다.

  • PATH 에는 3) 에서 확인한 cacerts 의 위치 정보를 넣어주어야한다.
keytool -import -alias my-mailserver -keystore [PATH] -file /tmp/my-mailserver.crt -storepass changeit

등록이 정상적으로 된다면 사진처럼 나온다

6) 꼭! 재시작까지 해주자

docker restart jenkins

Jenkins - Mail

1) github 설정과 마찬가지로 Jenkins 관리 - System 으로 들어간다

2) 먼저 SMTP server 부분을 찾아 내용을 넣는다.

SMTP Server :  본인의 SMTP 서버 주소
SMTP port : SMTP 서버 port
Add - Jenkins 를 눌러서 뜨는 창에 username 에는 닉네임 느낌, password 에는 패스워드,  id 에는 로그인 아이디 를 넣어주자

꼭 넣어주자!
최종화면!

3)  Default Recipients 에 기본 받는 사람을 적어주자. 이거 없으면 잘 안갈때가 있다.

4) 설정을 내리다보면 '이메일로 알려줌' 이라는 부분에서 위에 적은 것과 마찬가지로 작성해준다.

5) 최종적으로는 Test configuration by sending test e-mail 을 눌러서 테스트 이메일을 적고, test configuration 을 했을 때 메일이 잘 오면 성공이다!

성공! JenkinsAdmin 님께서 메일을 보내주셨다

 

댓글