-
Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx)프로젝트/WebRTC 화상통화 프로젝트 2022. 8. 6. 00:01
(1) Window에서 도커로 MySQL + SpringBoot 띄우기
(2) Ubuntu에서 Spring,MySQL, Redis Docker Compose로 배포하기
(3) Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx)
이해하는데 필요한 사전 지식
- Docker
- Docker Compose
- ubuntu / linux
- gitlab
개요
이전에 Docker Compose를 활용하여 Spring + MySQL + Redis를 배포하였습니다.
Jenkins로 CI/CD를 구축하게 되면 gilab에 spring이 새롭게 push 되면 기존의 spring conatiner를 내리고 새로운 spring container를 올릴 예정입니다.
따라서 spring은 docker compose로 구성하기 않고 다시 컨테이너를 띄울 일이 없는 MySQL, Redis, Nginx, Jenkins를 하나의 Docker Compose로 관리하고 Spring은 별도로 관리하려고 합니다.
추후에는 React도 별도의 컨테이너를 활용해 CI/CD를 구축할 예정입니다.
Docker Compose 구성하기
version: "3" services: mydb: image: mysql container_name: mydb environment: MYSQL_DATABASE: zipzong MYSQL_ROOT_PASSWORD: root MYSQL_USER: username MYSQL_PASSWORD : dbpassword ports: - 3306:3306 redis: container_name: redis image: redis ports: - 6379:6379 nginx: image: nginx container_name: nginx ports: - 80:80 volumes: - ./nginx/conf.d:/etc/nginx/conf.d jenkins: image: jenkins/jenkins:lts container_name: jenkins volumes: - /var/run/docker.sock:/var/run/docker.sock - /jenkins:/var/jenkins_home ports: - 9090:8080 privileged: true user: root
기본적으로 ubuntu ~ 위치에서 작업을 진행했습니다.
mysql, redis 컨테이너를 띄웁니다.
이때 mysql의 비밀번호와 DB이름은 environment 부분에서 수정할 수 있습니다.
Nginx 이미지
mkdir 명령어를 활용하여 nginx/conf.d폴더를 만듭니다.
vi app.conf 명령어로 app.conf 파일을 만들고 내용을 다음과 같이 수정합니다.
# app.conf server { listen 80; access_log off; location / { proxy_pass https://www.naver.com; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
80으로 요청을 받고 https://www.naver.com 으로 요청을 redirect 시키기 위해 간편하게 설정되었습니다.
80 포트로 요청이 들어오면 네이버로 redirect 됩니다.
이 설정을 react나 spring, vue 서버로 변경해서 사용하면 됩니다.
이후에 도커 컴포즈에 해둔 volumns : - ./nginx/conf.d:/etc/nginx/conf.d 설정으로 nginx/conf.d 파일에 있는 app.conf 파일이 도커의 /etc/nginx/conf.d로 동기화됩니다.
JenKins 이미지
컨테이너의 이름을 jenkins로 만듭니다.
jenkins에서도 도커 빌드 사용을 위해 서버에 설치된 docker.sock을 같이 사용하도록 합니다. /var/run/docker.sock:/var/run/docker.sock
또한 jenkins home 위치를 사용하기 위해서 다음과 같이 볼륨을 마운트 시킵니다.
/jenkins:/var/jenkins_home
8080포트는 스프링이 사용하기 때문에 9090을 jenkins의 8080으로 매핑시킵니다.
8080은 jenkins의 기본 포트입니다.
privileged : true 값으로 설정하여 컨테이너 시스템의 주요 자원에 접근할 수 있게 합니다.
user : root 사용자로 설정하여 여러 권한 문제와 명령어를 사용하기 위해서 설정합니다.
Docker Compose 실행
이제 docker-compose up -d 명령어로 실행합니다.
만약 정상적으로 실행되지 않는다면 docker ps -a로 확인 시 Exit 상태면 설정에 문제가 있는 것입니다.
만약 그렇다면 docker-compose logs 또는 docker logs [컨테이너 이름]으로 확인할 수 있습니다.
Jenkins 접속
이후에 [server 공인 ip]: 8080에 접속하면 다음과 같은 화면을 볼 수 있습니다.
docker logs [컨테이너 이름] 또는 docker-compose logs로 jenkins의 비밀번호를 확인할 수 있습니다.
확인한 숫자_영어로 이루어진 긴 문자를 사이트에 입력해준 후 Continue를 클릭합니다.
이후 플러그인 설치에 관한 내용이 나오는데 왼쪽 Install suggested plugins 버튼을 눌러줍니다.
이것저것 설치가 수행이 되며 다 설치되면 관리자 계정을 생성할 수 있습니다.
계정명에는 로그인 시 사용하는 ID를 입력해야 합니다.
입력 후 젠킨스 접속 URL을 확인합니다.
보통 [server 공인 ip]:8080 이 나옵니다.
Save and Continue 버튼을 클릭합니다.
이제 메인 화면을 확인할 수 있습니다.
Jenkins 플러그인 설치합니다.
DashBoard -> Manager JenKins -> Plugin Manager에서 gitlab, docker에 대해서 플러그인을 설치합니다.
JenKins 안에 도커 설치
jenkins안에 도커가 설치되었는지 확인해야 합니다.
docker exec -it jenkins /bin/bash 명령어로 jenkins 컨테이너 안으로 접속합니다.
위에 설정으로 마운트 했지만 저는 docker -v를 입력했을 때 명령어가 수행되지 않았습니다.
명령어를 순차적으로 입력하면 도커가 설치됩니다.
apt-get update -y
apt-get install -y
apt-get install docker.io -y
docker -v
Jenkins Job 설정
빌드를 위한 Job을 설정합니다. 새로운 Item 버턴을 클릭합니다.
FreeStyle project를 선택하고 이름은 아무거나 입력합니다.이제 빌드 설정창이 뜨면 Repository URL에 GitLab URL을 기록합니다.gitlab clone을 Clont with HTTPS로 합니다.
이후 Credentials 부분에서 +ADD를 눌러줍니다.
Domain은 Golbal credentials
Kind는 Username with password
Username에는 GitLab ID
password에는 GitLab Password를 입력합니다.
저희는 backend 브랜치 브랜치에 push 되면 빌드를 수행하기 위해 다음과 같이 설정하였습니다.
빌드 유발은 다음과 같이 설정하면 됩니다.
그리고 고급 기능을 눌러 Secret token을 발급받을 수 있습니다.
Build 부분은 일단 Add build step을 눌러서 Execute shell을 선택하고 echo 'jenkinsbuild started...'라고 입력합니다.
GitLab WebHook 설정
settings -> Webhooks으로 가서 다음과 같이 설정합니다.
URL은 빌드 유발에 적혀있는대로 입력해줍니다.
Secret token은 빌드유발 고급 기능을 눌러 발급받은 것을 입력해줍니다.
Trigger에는 backend 브랜치가 푸시되었을 때 이벤트를 주기 위해 backend라고 설정합니다.
저장하고 하단의 test -> push events로 이벤트가 가는지 확인할 수 있습니다.
push가 정상적으로 수행되면 빌드 히스토리에 진행이 됩니다.
echo jenkinsbuild started... 가 나오는 것을 확인
이제 GitLab으로 푸시가 완료되었을 때 어떤 행위를 할지 적어주면 끝입니다.
과연 jenkins에서 pwd를 입력하면 어디로 실행될까요?
/var/jenkins_home/workspace/backend
jenkins 컨테이너에서 Gitlab에서 git pull을 받아 workspace/backend에 git내용들이 받아와져 있습니다.
어떻게 접근할 수 있을까요?
맨 처음에 volumnes 옵션을 통해 /jenkins로 마운트 시켰습니다.
따라서 ubuntu에서 /jenkins로 접속할 수 있습니다.
/jenkins/workspace/backend로 이동하면 git pull 받은 내용들을 확인할 수 있습니다.
젠킨스가 푸시된 이벤트를 감지하고 git 내용들을 받아오면 다음 행위를 하려고 합니다.
1. 빌드 시작
2. backend 도커 파일 이미지 빌드
3. 스프링 컨테이너 중지
4. 스프링 컨테이너 삭제
5. 스프링 컨테이너 실행(기존 docker-compose와 같은 네트워크로 실행)
파일 상태
Dockerfile은 다음과 같습니다.
FROM openjdk:11-jdk ARG JAR_FILE=build/libs/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
java 11 이미지로부터 build/libs 경로에 있는 .jar파일을 카피에서 실행시킵니다.
deploy.sh라는 쉘 스크립트를 만들어 이 스크립트를 실행하면 다음의 명령어들이 순차적으로 실행됩니다.
echo '빌드 시작' ./gradlew build echo '도커파일 이미지 빌드' docker build -t springbootapp . echo '컨테이너 중지' docker stop springbootapp echo '컨테이너 삭제' docker rm springbootapp echo '컨테이너 실행' docker run -p 8080:8080 --name springbootapp --network ubuntu_default -d springbootapp
docker-compose를 실행하면 기본 네트워크의 이름은 폴더명_default로 생성됩니다.
저 같은 경우는 ubuntu_default로 생성되었습니다.
따라서 springbootapp 이미지를 ubuntu_default 네트워크로 실행시켜서 mysql과 redis를 사용할 수 있도록 합니다.
이제 권한을 부여해야 합니다.
./deploy.sh를 실행할 권한을 부여하기 위해 chmod +x deploy.sh 명령어를 입력합니다.
Jenkins Execute shell 입력하기
echo 'jenkinsbuild started...' pwd cd backend chmod +x gradlew ./deploy.sh
1. backend로 이동해서
2. gradlew에 실행 권한을 주고
3. deploy.sh 스크립트를 실행해라
gradlew에 실행권한을 매 번주는 이유는 git pull 받아지면서 gradlew가 매번 새로 생기기 때문입니다.
Jenkins에서는 sudo 사용이 불가능합니다.
+ sudo ./deploy.sh /tmp/jenkins9613046018909264224.sh: 5: sudo: not found
jenkins에 sudo 권한을 주고자 합니다.
1. 관리자 권한 설정 파일 열기
$ sudo vim /etc/sudoers
2. jenkins에 관리자 권한을 제공하기 위해 아래의 내용을 추가한 후 저장합니다.
jenkins ALL=(ALL) NOPASSWD: ALL
이후에 jenkins에 push 요청을 보내면 정상적으로 빌드가 완료됩니다.
끝
출처
https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
JPA 동시성 문제 해결하기 (트랜잭션과 락) (0) 2022.08.09 nginx에 SSL 인증서 적용하기 (0) 2022.08.08 letsencrypt 인증서 발급하고 OpenVidu에 적용하기 (0) 2022.08.05 Ubuntu에서 Spring, MySQL, Redis Docker Compose로 배포하기 (4) 2022.08.04 AOP 적용하기 (+원리 CGlib vs Dynamic Proxy) (0) 2022.08.04