docker+jenkins+nginx 로 시작하기 1 (CI)

Seunghyeon·2024년 4월 17일

순서 대로 작성은 할 것인데 생각의 흐름 대로 적어
글에 두서가 없을 수 있습니다.

Docker 설치

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • apt-transport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 한다.
  • ca-certificates : ca-certificate는 certificate authority에서 발행되는 디지털 서명. SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어있는지 확인할 수 있다.
  • curl : 특정 웹사이트에서 데이터를 다운로드 받을 때 사용
  • software-properties-common : *PPA를 추가하거나 제거할 때 사용한다.

Docker의 공식 GPG키를 추가

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Docker의 공식 apt 저장소를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

시스템 패키지 업데이트

sudo apt-get update

Docker 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker 설치 시 Permission denied

sudo usermod -aG docker [계정명을 기입하시오]
cat /etc/group | grep docker

or

sudo groupadd docker
sudo usermod -aG docker $USER
sudo newgrp docker

CI

jenkins 설치

CI/CD : Continuous Integration/Continuous Delivery

spring boot 3.2.x 버전의 서버를 돌리므로
jdk17 버전의 jenkins를 사용한다.

추후에 DooD 를 사용하기 위해 jenkins의 볼륨을 마운트 해줘야 하는데 jenkins를 껐다켤때마다 다시 옵션을 설정해줘야 하는 번거로움이 있다.
이를 모두 기억하기 힘드니까 도커 컴포즈 파일로 만들어서 빌드한다.

그리고 여러개의 도커 컴포즈 파일을 만들 수 있으므로
composeFiles라는 디렉토리를 만들어서 관리하도록 하고

그 안에 docker-compose.jenkins.yml 을 만들어 준다.

  • docker-compose.jenkins.yml
version: "3.8"

services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins:jdk17
    restart: unless-stopped
    user: root
    ports:
      - 9090:8080
    volumes:
      - /home/ubuntu/jenkins:/var/jenkins_home
      - /home/ubuntu/.ssh:/root/.ssh
      - /var/run/docker.sock:/var/run/docker.sock

+04.24 추가) 계속 젠킨스 컨테이너 내 도커를 설치했을 때 다음부터 접속이 안되는 문제가 있어서 서버를 몇 번 초기화했다. /home/ubuntu/.ssh:/root/.ssh를 마운트 하면서 진행하는데 이 부분에서 문제가 발생하는 것이 아닌지 의심중 ->

  • volumes 설명
  1. /home/ubuntu/jenkins
    : jenkins에서 코드를 클론하면 /home/ubuntu/jenkins 안에
    workspace 라는 곳 안에 들어가게 됨.
  2. /home/ubuntu/.ssh
    : ubuntu를 외부에서 접속했을 때 root 로 접속이 가능하게 하기 위함
    ( 이게 필수인지는 잘 모르겠음, 권한 문제 때문에 필요한 것 같음 )
  3. /var/run/docker.sock
    : jenkins 컨테이너가 docker.sock을 통해 docker host에게 명령을 전달하기 위해 마운트 해주고 사용한다.

추가) - docker.sock

docker.sock 은 항상 명령을 받을 준비를 한다. 얘를 컨테이너가 사용하기 위해 볼륨으로 마운트 해주는 것

  • jenkins 컨테이너 생성
$ docker compose -f dockerFiles/docker-compose.jenkins.yml up -d --build
  • 옵션 설명
  1. -f : 파일 직접 지정 (설정 안해주면 현재 디렉토리에서 docker-compose.yml 을 빌드함)
  2. -d : detached 옵션으로 실행 (백그라운드 에서 실행)
  3. -- build : 컨테이너 생성시 이미지를 다시 생성하는 옵션

실행했으면 브라우저에서 접속해보기
-> $ docker ps -a 로 로그 확인해보고 켜졌는지 확인
-> 안되면 ec2 인스턴스 보안그룹에서 포트 설정 확인하기
-> 안되면 ec2 방화벽 설정 해주기 $ sudo ufw status 확인해보기

접속했다면
$ docker logs jenkins 를 입력해서
설치를 위한 비밀번호 복사한 후 사이트에 붙여넣고 기본(권장) 설치로 설치하기

  • 비밀번호
  • 설치화면

우리는 CI/CD를 구축하는데
Pipeline으로 구축하겠다
->
1. 빌드하는데 각 단계별로 모니터링 가능하면서
2. 에러가 어디서 발생했는지 쉽게 볼 수 있고
3. 스크립트를 짜서 관리가 쉽다.

단점 : 스크립트를 짤 줄 알아야 한다.

jenkins 시작

item을 생성할 때 pipeline으로 생성해준다.

Pipeline script 는 웹 페이지 상에서 스크립트를 작성해서 적용시키는 방식이고
밑에 SCM 은 jenkinsfile로 스크립트 명령어를 관리하는 방식을 채택한다는 뜻.

우리는 웹에다 바로 적자

pipeline {
    agent any
    
    stages {
        stage('Clone') {
            steps{
                git branch: '{변경 감지 할 브랜치}', credentialsId: '{credential 아이디}', url: '{web-hook 보내는 git 리포지토리 주소 ex) ~~.git}'           
                sh "sed -i 's/{docker-compose.yml에서 암호화된 JASYPT_KEY}/{암호화 전 키}/g' docker-compose.yml"
                sh "cat docker-compose.yml"
            }
            
        }
        stage('Build'){
            steps{
                dir('backend/farmyo') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean build"
                }
            }
            
        }
        stage('Deploy') {
            steps{
                // 이전에 실행된 컨테이너를 중지하고 삭제합니다.
                sh "docker stop farmyo-backend || true"
                sh "docker rm farmyo-backend || true"
            
                sh "docker stop farmyo-frontend || true"
                sh "docker rm farmyo-frontend || true"
            
                // 이전에 빌드된 이미지를 삭제합니다.
                sh "docker rmi farmyo_pipeline-farmyo-frontend || true"
                sh "docker rmi farmyo_pipeline-farmyo-backend || true"
                
                sh "docker ps -a || true"
                sh "docker images || true"
                
                sh "docker compose build --no-cache"
                sh "docker compose up -d"
            }
        }
    }
    post {
        success {
        	script {
                def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
                def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
                mattermostSend (color: 'good', 
                message: "빌드 성공 ^_^ v : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(<${env.BUILD_URL}|Details>)", 
                endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}', 
                channel: '{알림 받을 채널 명}'
                )
            }
        }
        failure {
        	script {
                def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
                def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
                mattermostSend (color: 'danger', 
                message: "빌드 실패 ㅜ_ㅜ : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(<${env.BUILD_URL}|Details>)", 
                endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}', 
                channel: '{알림 받을 채널 명}'
                )
            }
        }
    }
}

Credentials

jenkins 에서는 git에 수정사항을 Webhook을 통해서 감지하게 되는데
여기서 해당 repository 의 코드를 받아와야 한다.

그러기 위해서는 git 접근 권한을 줘야 한다.
-> repository가 public 이면 굳이 권한까지 필요는 없다고 함

그래도 일단 적용 해보자 ( private로 할 수 있으니까 )


GitHub 에서

  1. git 에서 프로필 누르면 나오는 settings -> Developer settings
  2. generate new token

  1. read only로 토큰 생성 ( 날짜는 알아서 )

해당 토큰 값을 복사해둔다. 중요!!


jenkins 에서

  1. jenkins 관리 -> Credentials -> system
  2. global Credentials -> add Credentials
  3. 값 넣고 생성하기

    kind는 'Secret Text'
    Secret 은 아까 깃에서 복사해둔 토큰값
    ID는 변수명 알아서
    후 생성

++ 추가
나는 이 플러그인이 안깔려 있어서 파이프 라인이 GUI 로 안보였음
jenkins에서 설치 안되어있으면 설치하시길


webhook 설정

webhook 용 토큰을 repo, repo_hook 옵션을 체크 해주면서 하나 만들어 주자

그리고 jenkins에 credentials로 등록해준다.

  • webhook token 등록

    여기서 password 는 webhook 토큰 생성시 나오는 값 복붙하기.

  • jenkins 환경설정에서 github server 등록해주기

  • 프로젝트에서 webhook 을 받도록 설정

webhook을 보낼 repository에 들어가서

이렇게 설정 해주면

초록색 체크 표시가 뜬다. 그러면 CI 구축 완료


+) 추가

GitLab 에서

Personal Access Token 생성은 여기서 해준다.

Project Access Token은 이렇게 생성한다.

기한은 2달정도로 잡고 권한은 일단 필요해 보이는거 선택했다.

webhook 설정

jenkins 에서 gitlab 플러그인을 설치한다.

profile
그냥 합니다.

0개의 댓글