ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jenkins로 Gitlab CI/CD 구축하기(Spring + MySQL + JenKins + Redis + Nginx)
    프로젝트/WebRTC 화상통화 프로젝트 2022. 8. 6. 00:01
    728x90

    (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에 접속하면 다음과 같은 화면을 볼 수 있습니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    docker logs [컨테이너 이름] 또는 docker-compose logs로 jenkins의 비밀번호를 확인할 수 있습니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    확인한 숫자_영어로 이루어진 긴 문자를 사이트에 입력해준 후 Continue를 클릭합니다.

    이후 플러그인 설치에 관한 내용이 나오는데 왼쪽 Install suggested plugins 버튼을 눌러줍니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    이것저것 설치가 수행이 되며 다 설치되면 관리자 계정을 생성할 수 있습니다.

    계정명에는 로그인 시 사용하는 ID를 입력해야 합니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    입력 후 젠킨스 접속 URL을 확인합니다.

    보통 [server 공인 ip]:8080 이 나옵니다.

    Save and Continue 버튼을 클릭합니다.

    이제 메인 화면을 확인할 수 있습니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

     

    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 버턴을 클릭합니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    FreeStyle project를 선택하고 이름은 아무거나 입력합니다.

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

    이제 빌드 설정창이 뜨면 Repository URL에 GitLab URL을 기록합니다.
    https://velog.io/@hind_sight/Docker-Jenkins-%EB%8F%84%EC%BB%A4%EC%99%80-%EC%A0%A0%ED%82%A8%EC%8A%A4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spring-Boot-CICD#3-github-%EC%95%A1%EC%84%B8%EC%8A%A4-%ED%86%A0%ED%81%B0-%EC%83%9D%EC%84%B1

    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://velog.io/@livenow/Jenkins-Execute-Shell-%EB%AA%85%EB%A0%B9%EC%96%B4%EC%97%90%EC%84%9C-sudo%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%EC%84%A4%EC%A0%95

     

    [Jenkins] Execute Shell 명령어에서 sudo를 사용하기 위한 설정

    젠킨스에서 빌드 진행 시 관리자 권한으로 실행이 필요한 경우가 있습니다.

    velog.io

    https://www.dongyeon1201.kr/9026133b-31be-4b58-bcc7-49abbe893044

     

    Jenkins를 사용한 DevOps 환경 구축

    ✅ 목차

    www.dongyeon1201.kr

     

    댓글

Designed by Tistory.