๐Ÿ“Œ [Docker CI/CD ์‹œ๋ฆฌ์ฆˆ 3ํŽธ] Jenkins๋กœ ์ž๋™ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ

My Pale Blue Dotยท2025๋…„ 6์›” 5์ผ
0

DOCKER

๋ชฉ๋ก ๋ณด๊ธฐ
8/8
post-thumbnail

๐Ÿ“… 2025-06-05

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ Jenkins๋ž€?

Jenkins๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ(CI/CD) ์ž๋™ํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  • ์†Œ์Šค ์ฝ”๋“œ ๋ณ€๊ฒฝ โ†’ ํ…Œ์ŠคํŠธ โ†’ ๋นŒ๋“œ โ†’ ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™ํ™”
  • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ ํ™•์žฅ์„ฑ ์šฐ์ˆ˜
  • ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ, ์Šค์ผ€์ค„๋ง ์ง€์›

2๏ธโƒฃ Jenkins ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ธฐ

jenkins:
  image: jenkins
  build:
    context: ./JENKINS
  container_name: jenkins-container
  ports:
    - "9090:8080"     # ์›น UI ์ ‘์†
    - "50000:50000"   # ์—์ด์ „ํŠธ ํ†ต์‹  ํฌํŠธ
  volumes:
    - jenkins-data:/var/jenkins_home
    - /var/run/docker.sock:/var/run/docker.sock
  networks:
    - custom-network

3๏ธโƒฃ ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๋ฐ ์„ค์ •

docker exec -it jenkins-container sh
cat /var/jenkins_home/secrets/initialAdminPassword
  • ์›น ์ ‘์†: http://localhost:9090
  • ์œ„ ๋ช…๋ น์œผ๋กœ ์ถœ๋ ฅ๋œ ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
  • ๊ถŒ์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์ง„ํ–‰

4๏ธโƒฃ GitHub ํ† ํฐ ๋ฐ SSH Key ๋“ฑ๋ก

โœ”๏ธ GitHub Personal Access Token ๋“ฑ๋ก

  • Jenkins > ๊ด€๋ฆฌ > Credentials > Global โ†’ Add Credentials
    • Kind: Secret text
    • ID: github-token
    • Secret: GitHub ๋ฐœ๊ธ‰ ํ† ํฐ

โœ”๏ธ EC2 SSH Key ๋“ฑ๋ก

  • Kind: SSH Username with private key
  • ID: ec2-ssh-key
  • Username: ec2-user
  • Private key: .pem ํŒŒ์ผ ๋‚ด์šฉ ๋ณต๋ถ™ (DEPLOY_SERVER.pem)

5๏ธโƒฃ GitHub Integration Plugin & SSH Agent ์„ค์น˜

  • Jenkins ๊ด€๋ฆฌ > ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ด€๋ฆฌ โ†’ ์„ค์น˜
    • GitHub Integration Plugin
    • SSH Agent Plugin

6๏ธโƒฃ Jenkins Pipeline ๊ตฌ์„ฑ

์ƒˆ๋กœ์šด ํŒŒ์ดํ”„๋ผ์ธ ์ƒ์„ฑ (์˜ˆ: DEPLOY_TEST)

๐Ÿ“œ Pipeline ์ฝ”๋“œ ์˜ˆ์‹œ:

pipeline {
    agent any

    environment {
        GITHUB_REPO = 'https://github.com/STD-INFO-COMPUTING-WEB-2024-07-30/09_DEPLOYMENT.git'
        TARGET_DIR = '05_DOCKER_COMPOSE_DEPLOY'
        EC2_HOST = '43.202.192.42'
        EC2_USER = 'ec2-user'
    }

    stages {
        stage('Clone and Deploy on EC2') {
            steps {
                withCredentials([sshUserPrivateKey(credentialsId: 'ec2-ssh-key', keyFileVariable: 'SSH_KEY')]) {
                    sh """
                        chmod 600 ${SSH_KEY}
                        ssh -i ${SSH_KEY} -o StrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST} "
                            rm -rf DOCKER && \
                            git clone https://github.com/Jaewoong-Hwang/DOCKER.git && \
                            cd DOCKER/05_DOCKER_COMPOSE_DEPLOY && \
                            sudo docker-compose down || true && \
                            sudo docker rm -f $(sudo docker ps -aq) 2>/dev/null || true && \
                            sudo docker rmi -f $(sudo docker images -q) 2>/dev/null || true && \
                            sudo docker-compose build --no-cache && \
                            sudo docker-compose up -d --scale jenkins=0
                        "
                    """
                }
            }
        }
    }

    post {
        success {
            echo 'โœ… Deployment to EC2 completed successfully!'
        }
        failure {
            echo 'โŒ Deployment to EC2 failed!'
        }
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • Jenkins๋Š” GitHub, EC2, Docker์™€ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ
  • CI/CD๋ฅผ ์œ„ํ•œ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ตฌ์„ฑํ•ด ๋ฐ˜๋ณต ์ž‘์—… ์ œ๊ฑฐ
  • SSH key, GitHub token, Plugin ์„ค์น˜๊ฐ€ ์‚ฌ์ „ ์ค€๋น„๋กœ ํ•„์ˆ˜
  • Jenkins ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋กœ๋„ ๊ฐ•๋ ฅํ•œ CI/CD ์šด์˜ ๊ฐ€๋Šฅ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€