TIL

AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (4) | CI/CD 최종 | Jenkins Pipeline Docker 배포까지 총정리

everyday-spring 2024. 11. 3. 16:00

https://everyday-spring.com/630

 

AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (1) | 최종_최최종_찐막_찐찐막

https://everyday-spring.com/628 Window PC에 Docker, jenkins 설치, GitHub 연동하기 (1) | 난 대학시절 삽질을 전공했단 사실시작에 앞서....Docker를... AWS EC2에 설치 했어야 하는데별 의심없이 개인 pc에 설치했다..

everyday-spring.com

https://everyday-spring.com/631

 

AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (2) | 윈도우 PuTTY EC2 연동하기 | EC2 메모리 스왑

https://everyday-spring.com/630 AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (1) | 최종_최최종_찐막_찐찐막https://everyday-spring.com/628 Window PC에 Docker, jenkins 설치, GitHub 연동하기 (1) | 난 대학시절 삽질을 전

everyday-spring.com

https://subin0522.tistory.com/632

 

AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (3) | Docker in Docker

https://everyday-spring.com/630 AWS EC2에 Docker Jenkins 설치, Github Webhook 연동 (1) | 최종_최최종_찐막_찐찐막https://everyday-spring.com/628 Window PC에 Docker, jenkins 설치, GitHub 연동하기 (1) | 난 대학시절 삽질을 전

everyday-spring.com

찐찐 마지막... 이제 진짜 배포 해볼게요

 

Jenkins Setting

이제 웹에서 EC2 ubuntu에 설치한 Jenkins에 접근할 수 있습니다

주소창에 hostname:port를 입력하면 되는데

- hostname -> Instance의 public IP

- port -> Jenkins 컨테이너 실행할 때 지정한 포트번호 (기본 8080)

 

이 페이지가 나오면! 잘 들어간것

https://everyday-spring.com/628

위 글을 참고해서 초기 Jenkins 초기 설정을 한다

저 Administrator password를 모르겠다면
sudo cat /var/jenkins_home/secrets/initialAdminPassword

를 입력해 확인할 수 있다

 

Jenkins Plugin 설치

사람에게는 망각이라는 기능이 있다

3일동안 CI/CD 세팅만하느라 플러그인을 이것 저것 깔았는데

결론적으로 내가 새로 설치한거 다 까먹었다는 뜻

 

Docker Pipeline
Docker plugin
GitHub Branch Source Plugin
Gradle Plugin
Pipeline
Pipeline Graph View Plugin
Pipeline: GitHub Groovy Libraries
Publish Over SSH
SSH Agent Plugin
SSH server
Workspace Cleanup Plugin

 

우선 여기 스킵하시고..

안된다면 이 중 설치되어 있지 않은... 플러그인을 설치해보시기 바랍니다...

 

플러그인은 Jenkins 관리 - Plugins - Available plugins 에서 설치가 가능하다

 

Jenkins Credentials 등록

CI/CD를 위해 세가지 Credentials을 등록한다

등록을 위해 필요한 정보들

  • Github
    • Github 계정 이름, token 
  •  dockerhub
    • dockerhub에 가입된 계정 ID, Password
  • aws
    • instance .pem 파일

Jenkins 관리 - credentials 화면에서 (global) 클릭

우측 상단에 파란색 + Add Credentials 버튼을 클릭해서 추가할 수 있다

 

 

Username - GitHub 계정명

Password - GitHub에서 발급받은 token

ID - Jenkins 내부에서 사용할 이름

세가지 항목을 입력하고 생성해준다

나는 ID를 github로 지정했다

 

Username - dockerhub 로그인 ID

Password - dockerhub 로그인 Password

ID - Jenkins 내부에서 사용할 이름

세가지 항목을 입력하고 생성

 

Kind를 SSH Username with private key로 변경

ID - Jenkins 내부에서 사용할 이름

Username - 서버에 로그인 할 수 있는 계정명 (EC2 ubuntu 기본세팅이면 ubuntu입력하면 된다)

Private Key - EC2 .pem 파일을 메모장으로 열어 전체 복사 붙여넣기

세가지 항목을 입력하고 생성

 

이렇게 세개의 Credentials을 생성했다

 

Jenkins Pipeline CI/CD

새로운 아이템을 등록한다

이름을 설정하고 pipeline을 선택

GitHub project (대상 repository 주소 입력)

GitHub hook trigger for GITScm polling

두 항목 체크

Pipeline을 작성한다!

 

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = 'user05/application' // 배포할 이미지 이름 지정
	    GIT = 'github' // credentialsId
	    CREDENTIALS_ID = 'aws' // credentialsId
        SERVER_IP = '12.34.567.890' // ec2 public IP

    }
    
    stages {
        stage('Clone Repository') {
            steps {
                git branch: 'main', // 배포할 branch명
                credentialsId: GIT,
                url: 'https://github.com/github_id/github_repository.git' // github repository 링크
            }
        }
        
        stage('Build') {
            steps {
                sh 'chmod +x gradlew'
                sh './gradlew clean build'
            }
        }
        
        stage('Bulid Docker') {
            steps {
                echo 'Bulid Docker'
                script {
                    dockerImage = docker.build("user05/application:latest")
                }
            }
            post {
                success {
                    echo 'Successfully Docker Build'
                }
                failure {
                    error 'This pipeline stops here...'
                }
            }
        }
        
        stage('Push Docker') {
            steps {
                echo 'Push Docker'
                script {
                    docker.withRegistry('', 'dockerhub-credentials') { // credentialsId
                        dockerImage.push('latest')
                    }
                }
            }
        }
        stage('Deploy to EC2') {
            steps {
                sshagent([CREDENTIALS_ID]) {
                    sh """
                        ssh -o StrictHostKeyChecking=no ubuntu@${SERVER_IP} '
                        docker pull ${DOCKER_IMAGE}:latest &&
                        docker stop applicationName || true && // 기존 컨테이너 중지
                        docker rm applicationName || true && // 기존 컨테이너 삭제
                        docker run -d --name applicationName -p 9090:9090 \ // 새로운 컨테이너 배포
                        -e PROD_MASTER_JDBC_URL=환경변수를 입력해줌 \
                        -e PROD_MASTER_USERNAME=환경변수를 입력해줌 \
                        ${DOCKER_IMAGE}:latest '
                    """
                }
            }
        }
	}
}

주석 및 한글로 작성한 부분을 필요에 맞게 수정한다

 

EC2 public IP와 지정한 port에서 애플리케이션 서버가 정상 동작함을 확인했다!

해당 예시로 보면 12.34.567.890:9090