๐Ÿš€ Jenkins๋ฅผ ํ™œ์šฉํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (GitHub โ†’ Docker โ†’ ECR ์—…๋กœ๋“œ)

Ma_Seokjaeยท2025๋…„ 2์›” 13์ผ
0
post-thumbnail

๐Ÿš€ Mac์—์„œ Jenkins๋ฅผ Docker๋กœ ์‹คํ–‰ํ•˜๊ธฐ

์ด ๊ฐ€์ด๋“œ๋Š” MacOS ํ™˜๊ฒฝ์—์„œ Docker๋ฅผ ์ด์šฉํ•ด Jenkins๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Jenkins๋ฅผ ๋น ๋ฅด๊ฒŒ ์„ค์น˜ํ•˜๊ณ  CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด๋ด…์‹œ๋‹ค.!!


1๏ธโƒฃ ์‚ฌ์ „ ์ค€๋น„

ํ•„์ˆ˜ ๋„๊ตฌ ์„ค์น˜

  1. Docker Desktop ๋‹ค์šด๋กœ๋“œ

    • Mac์—์„œ Docker๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ (docker --version)
  2. Jenkins ์‹คํ–‰์„ ์œ„ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ

    mkdir -p ~/jenkins_home
    chmod 777 ~/jenkins_home
    

2๏ธโƒฃ Docker๋กœ Jenkins ์‹คํ–‰

Jenkins ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d \
  --name jenkins \
  -p 8080:8080 -p 50000:50000 \
  -v ~/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkins/jenkins:lts

โœ… ์‹คํ–‰ ์˜ต์…˜ ์„ค๋ช…

  • d : ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
  • -name jenkins : ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„
  • p 8080:8080 : ์›น UI ํฌํŠธ ๋งคํ•‘
  • p 50000:50000 : ์—์ด์ „ํŠธ ํ†ต์‹  ํฌํŠธ
  • v ~/jenkins_home:/var/jenkins_home : Jenkins ๋ฐ์ดํ„ฐ ์œ ์ง€
  • v /var/run/docker.sock:/var/run/docker.sock : Docker ๋‚ด๋ถ€์—์„œ Docker ์‹คํ–‰ ์ง€์›

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ™•์ธ

docker ps

Jenkins ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”.


3๏ธโƒฃ ์ดˆ๊ธฐ ํŒจ์Šค์›Œ๋“œ ํ™•์ธ ๋ฐ Jenkins ์ ‘์†

์ดˆ๊ธฐ ๊ด€๋ฆฌ์ž ํŒจ์Šค์›Œ๋“œ ์ฐพ๊ธฐ

docker logs jenkins | grep -A 5 "Administrator password"

์ถœ๋ ฅ ์˜ˆ์‹œ:

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

123asdkjalskdjqlkweasd1234125

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

installation: ๋ฐ”๋กœ ์•„๋ž˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•œ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ Jenkins์— ๋กœ๊ทธ์ธํ•˜์„ธ์š”.

Jenkins ์›น UI ์ ‘์†

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080 ์ ‘์†

  2. ์ดˆ๊ธฐ ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ ํ›„ ๋กœ๊ทธ์ธ

  3. "Install suggested plugins" ์„ ํƒ

  4. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ํ›„ Jenkins ์„ค์ • ์™„๋ฃŒ

  5. Main ํ™”๋ฉด ์ž…์žฅ


4๏ธโƒฃ Jenkins ์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ (GitHub ์—ฐ๋™ ๋ฐ ECR ๋ฐฐํฌ ์ค€๋น„)

๐Ÿ”น 1. Jenkins ํ•„์ˆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

Jenkins์—์„œ GitHub์™€ Docker ๋นŒ๋“œ, AWS ECR ์—…๋กœ๋“œ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ

  • Git Plugin (GitHub ์—ฐ๋™)
  • Pipeline Plugin (Pipeline ์ž‘์„ฑ)
  • Docker Pipeline (Docker ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ)
  • Amazon ECR Plugin (AWS ECR ์—…๋กœ๋“œ)

๐Ÿ“Œ ์„ค์น˜ ๋ฐฉ๋ฒ•

  1. Jenkins ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ โ†’ Manage Jenkins โ†’ Plugin Manager ์ด๋™
  2. Available ํƒญ์—์„œ ์œ„ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฒ€์ƒ‰ ๋ฐ ์„ค์น˜
  3. ์„ค์น˜ ํ›„ Jenkins ์žฌ์‹œ์ž‘

5๏ธโƒฃ GitHub ์ธ์ฆ ์„ค์ • (SSH ํ‚ค ๋˜๋Š” PAT ๋ฐฉ์‹)

Jenkins๊ฐ€ GitHub์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

GitHub์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์€ SSH ํ‚ค ์ธ์ฆ๊ณผ Personal Access Token (PAT) ์ธ์ฆ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น 1. SSH ํ‚ค ๋ฐฉ์‹

  1. Jenkins ์„œ๋ฒ„์—์„œ SSH ํ‚ค ์ƒ์„ฑ

    ssh-keygen -t rsa -b 4096 -C "your-email@example.com" 
    • ๊ธฐ๋ณธ ๊ฒฝ๋กœ: /var/jenkins_home/.ssh/id_rsa
    • id_rsa.pub ํ‚ค๋ฅผ ๋ณต์‚ฌ
  2. GitHub์— SSH ํ‚ค ๋“ฑ๋ก

    • GitHub โ†’ Settings โ†’ SSH and GPG keys โ†’ New SSH Key
    • id_rsa.pub ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ
  3. Jenkins์—์„œ SSH ํ‚ค ๋“ฑ๋ก

    • Manage Jenkins โ†’ Manage Credentials โ†’ System โ†’ Global credentials
    • "Add Credentials" ํด๋ฆญ
      • Kind: SSH Username with Private Key
      • Username: git
      • Private Key: id_rsa ๋‚ด์šฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ

โœ… GitHub SSH ์ธ์ฆ ํ™•์ธ

ssh -T git@github.com

์ถœ๋ ฅ ์˜ˆ์‹œ

Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.

๐Ÿ”น 2. GitHub Personal Access Token (PAT) ๋ฐฉ์‹

โœ”๏ธ GitHub ๊ณ„์ •์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. GitHub์—์„œ PAT ๋ฐœ๊ธ‰
    • GitHub ๋กœ๊ทธ์ธ โ†’ Settings โ†’ Developer settings โ†’ Personal access tokens
    • Generate new token ํด๋ฆญ
    • repo ๋ฐ workflow ๊ถŒํ•œ ์„ ํƒ ํ›„ Generate token ํด๋ฆญ
    • ๋ฐœ๊ธ‰๋œ ํ† ํฐ ๋ณต์‚ฌ (ํ•œ ๋ฒˆ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅ)
  2. Jenkins์—์„œ PAT ๋“ฑ๋ก
    • Manage Jenkins โ†’ Manage Credentials โ†’ System โ†’ Global credentials
    • "Add Credentials" ํด๋ฆญ
      • Kind: Username with password
      • Username: GitHub ์‚ฌ์šฉ์ž๋ช…
      • Password: ๋ฐœ๊ธ‰๋ฐ›์€ GitHub ํ† ํฐ
      • ID: github-token

6๏ธโƒฃ Jenkins์—์„œ GitHub ์ €์žฅ์†Œ ์—ฐ๊ฒฐ

Jenkins์—์„œ GitHub ์ €์žฅ์†Œ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 1. GitHub ์ €์žฅ์†Œ ์—ฐ๊ฒฐ

  1. Jenkins โ†’ New Item โ†’ Pipeline ์„ ํƒ

  2. Pipeline Name ์ž…๋ ฅ ํ›„ OK ํด๋ฆญ

  3. General โ†’ GitHub Project ์ฒดํฌ ํ›„ Repository URL ์ž…๋ ฅ

    https://github.com/your-repo/your-project.git
  4. Build Triggers โ†’ GitHub hook trigger for GITScm polling ์ฒดํฌ

    • GitHub์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋  ๋•Œ ์ž๋™ ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ

7๏ธโƒฃ Jenkins Pipeline Script ์„ค์ • (Jenkinsfile ํ™œ์šฉ)

Jenkins์—์„œ๋Š” GitHub์˜ Jenkinsfile์„ ์‚ฌ์šฉํ•ด ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— Jenkinsfile์„ ์ถ”๊ฐ€ํ•˜์—ฌ Jenkins๊ฐ€ ์ž๋™์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

pipeline {
    agent any

    environment {
        AWS_REGION = "ap-northeast-2"  // AWS ๋ฆฌ์ „ ์„ค์ •
        AWS_ACCOUNT_ID = "123456789012"  // AWS ๊ณ„์ • ID (ECR ์ €์žฅ์†Œ ์†Œ์œ ์ž)
        ECR_REPO = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/my-jenkins-image" // AWS ECR ์ €์žฅ์†Œ URL
        IMAGE_TAG = "latest"  // ๊ธฐ๋ณธ ํƒœ๊ทธ ์„ค์ •
    }

    stages {
        stage('Ensure ECR Exists') {
            steps {
                script {
                    // ECR ์ €์žฅ์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒ์„ฑ
                    sh """
                    aws ecr describe-repositories --repository-names my-jenkins-image --region ${AWS_REGION} || \
                    aws ecr create-repository --repository-name my-jenkins-image --region ${AWS_REGION}
                    """
                }
            }
        }

        stage('Checkout') {
            steps {
                // GitHub ์ €์žฅ์†Œ์—์„œ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ
                git branch: 'main', credentialsId: 'your-credentials-id', url: 'git@github.com:your-repo/your-project.git'
            }
        }

        stage('Build Docker Image') {
            steps {
                script {
                    // Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ (ํƒœ๊ทธ ํฌํ•จ)
                    sh "docker build -t ${ECR_REPO}:${IMAGE_TAG} ."
                }
            }
        }

        stage('AWS ECR Login') {
            steps {
                script {
                    // AWS ECR ๋กœ๊ทธ์ธ ์ˆ˜ํ–‰
                    sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO}"
                }
            }
        }

        stage('Push Docker Image to ECR') {
            steps {
                script {
                    // Docker ์ด๋ฏธ์ง€๋ฅผ ECR์— Push
                    sh "docker push ${ECR_REPO}:${IMAGE_TAG}"
                }
            }
        }
    }
}

๐Ÿ“Œ Jenkinsfile ์ฝ”๋“œ ์ƒ์„ธ ์„ค๋ช…

์ด Jenkinsfile์€ GitHub์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ , AWS ECR์— ์—…๋กœ๋“œํ•˜๋Š” ์ „์ฒด CI/CD ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 1. pipeline { agent any }

  • Jenkins ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • agent any๋Š” ์–ด๋–ค Jenkins ๋…ธ๋“œ์—์„œ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

๐Ÿ”น 2. environment {} (ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •)

  • AWS ๊ด€๋ จ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    AWS_REGION = "ap-northeast-2"
    AWS_ACCOUNT_ID = "123456789012"
    ECR_REPO = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/my-jenkins-image"
    IMAGE_TAG = "latest"
  • AWS_REGION โ†’ AWS์—์„œ ์‚ฌ์šฉํ•  ๋ฆฌ์ „ (์„œ์šธ ๋ฆฌ์ „ "ap-northeast-2")
  • AWS_ACCOUNT_ID โ†’ AWS ๊ณ„์ • ID, ECR ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์†Œ์œ ์ž์˜ ID
  • ECR_REPO โ†’ ECR ์ €์žฅ์†Œ URL
  • IMAGE_TAG โ†’ Docker ์ด๋ฏธ์ง€ ํƒœ๊ทธ (latest ๊ธฐ๋ณธ ์„ค์ •)

๐Ÿ”น 3. stage('Ensure ECR Exists') (ECR ์ €์žฅ์†Œ ํ™•์ธ ๋ฐ ์ƒ์„ฑ)

stage('Ensure ECR Exists') {
    steps {
        script {
            sh """
            aws ecr describe-repositories --repository-names my-jenkins-image --region ${AWS_REGION} || \
            aws ecr create-repository --repository-name my-jenkins-image --region ${AWS_REGION}
            """
        }
    }
}
  • ECR ์ €์žฅ์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ž๋™ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • aws ecr describe-repositories ๋ช…๋ น์–ด๋กœ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
  • ๋งŒ์•ฝ ์ €์žฅ์†Œ๊ฐ€ ์—†์œผ๋ฉด aws ecr create-repository๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ

โœ… ์ด ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ตœ์ดˆ ๋ฐฐํฌ์—์„œ๋„ ์˜ค๋ฅ˜ ์—†์ด ์ง„ํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 4. stage('Checkout') (GitHub์—์„œ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ)

stage('Checkout') {
    steps {
        git branch: 'main', credentialsId: 'your-credentials-id', url: 'git@github.com:your-repo/your-project.git'
    }
}
  • GitHub์—์„œ main ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ Jenkins ์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • credentialsId: 'your-credentials-id' โ†’ Jenkins์— ์ €์žฅ๋œ GitHub SSH Key or Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ
  • url: 'git@github.com:your-repo/your-project.git'
    • SSH ์ธ์ฆ ๋ฐฉ์‹ ์‚ฌ์šฉ (HTTPS ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ https://github.com/your-repo/your-project.git)

๐Ÿ”น 5. stage('Build Docker Image') (Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ)

stage('Build Docker Image') {
    steps {
        script {
            sh "docker build -t ${ECR_REPO}:${IMAGE_TAG} ."
        }
    }
}
  • docker build ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ
  • ${ECR_REPO}:${IMAGE_TAG} โ†’ ECR ์ €์žฅ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ํƒœ๊น…

โœ… ECR ์ €์žฅ์†Œ์— ๋งž๊ฒŒ ์ด๋ฏธ์ง€๊ฐ€ ์ž๋™ ํƒœ๊น…๋˜๋ฏ€๋กœ ์ถ”๊ฐ€ ์„ค์ • ํ•„์š” ์—†์Œ


๐Ÿ”น 6. stage('AWS ECR Login') (AWS ECR ๋กœ๊ทธ์ธ)

stage('AWS ECR Login') {
    steps {
        script {
            sh "aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REPO}"
        }
    }
}
  • AWS CLI๋ฅผ ํ†ตํ•ด ECR ๋กœ๊ทธ์ธ ์ˆ˜ํ–‰
  • aws ecr get-login-password --region ${AWS_REGION} โ†’ AWS์—์„œ ECR ๋กœ๊ทธ์ธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ€์ ธ์˜ค๊ธฐ
  • docker login --username AWS --password-stdin ${ECR_REPO} โ†’ ํ•ด๋‹น ํŒจ์Šค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ

โœ… ์ด ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ECR์— Docker ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Œ


๐Ÿ”น 7. stage('Push Docker Image to ECR') (Docker ์ด๋ฏธ์ง€ ํ‘ธ์‹œ)

stage('Push Docker Image to ECR') {
    steps {
        script {
            sh "docker push ${ECR_REPO}:${IMAGE_TAG}"
        }
    }
}
  • docker push ๋ช…๋ น์–ด๋กœ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ AWS ECR ์ €์žฅ์†Œ์— ์—…๋กœ๋“œ

โœ… ์™„๋ฃŒ ํ›„ AWS ECR์—์„œ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

aws ecr list-images --repository-name my-jenkins-image --region ap-northeast-2

์ •๋ฆฌ

์ด Jenkinsfile์€:

  1. GitHub์—์„œ ์ตœ์‹  ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ (Checkout)
  2. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ (Build Docker Image)
  3. AWS ECR์— ๋กœ๊ทธ์ธ (AWS ECR Login)
  4. Docker ์ด๋ฏธ์ง€๋ฅผ AWS ECR์— ํ‘ธ์‹œ (Push Docker Image to ECR)

์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์™„์ „ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.


8๏ธโƒฃ AWS ECR ์—ฐ๋™ (IAM ๋ฐ ๊ถŒํ•œ ์„ค์ •)

๐Ÿ”น 1. AWS CLI ์„ค์น˜

brew install awscli

๐Ÿ”น 2. AWS IAM ์‚ฌ์šฉ์ž ์ƒ์„ฑ (ECR ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •)

  • AWS IAM โ†’ ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ โ†’ ํ”„๋กœ๊ทธ๋žจ ๋ฐฉ์‹ ์ ‘๊ทผ
  • ๊ถŒํ•œ ์ถ”๊ฐ€: AmazonEC2ContainerRegistryFullAccess
  • Access Key & Secret Key ์ €์žฅ

๐Ÿ”น 3. Jenkins์—์„œ AWS Credentials ์ถ”๊ฐ€

  1. Manage Jenkins โ†’ Manage Credentials โ†’ Global Credentials
  2. "Add Credentials" ํด๋ฆญ
    • Kind: AWS Credentials
    • Access Key ID & Secret Key ์ž…๋ ฅ
    • ID: aws-credentials

9๏ธโƒฃ GitHub Webhook ์„ค์ • (์ž๋™ ๋นŒ๋“œ ํŠธ๋ฆฌ๊ฑฐ)

Jenkins์—์„œ GitHub์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด Webhook์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น 1. GitHub Webhook ์„ค์ •

  1. GitHub Repository โ†’ Settings โ†’ Webhooks ์ด๋™

  2. Webhook ์ถ”๊ฐ€ (Add webhook) ํด๋ฆญ

  3. Webhook ์ •๋ณด ์ž…๋ ฅ

    • Payload URL:
      http://your-jenkins-url/github-webhook/
      • your-jenkins-url์€ Jenkins ์„œ๋ฒ„์˜ ์‹ค์ œ URL๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • Jenkins๊ฐ€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: http://jenkins.yourdomain.com/github-webhook/).
    • Content type: application/json
    • Secret: Jenkins์—์„œ Webhook ์ธ์ฆ์„ ๊ฐ•ํ™”ํ•˜๋ ค๋ฉด, ์ž„์˜์˜ Secret์„ ์ž…๋ ฅํ•˜๊ณ  Jenkins์—์„œ๋„ ๊ฐ™์€ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • Which events would you like to trigger this webhook?
      • Just the push event ์ฒดํฌ (๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ํŠธ๋ฆฌ๊ฑฐ)
      • Pull requests๋ฅผ ํฌํ•จํ•˜๋ ค๋ฉด ๋ณ„๋„๋กœ ์ฒดํฌ ๊ฐ€๋Šฅ
  4. Webhook ์ €์žฅ (Add webhook) ํด๋ฆญ


๐Ÿ”น 2. Jenkins์—์„œ Webhook ์ˆ˜์‹  ์„ค์ •

Jenkins๊ฐ€ Webhook ์š”์ฒญ์„ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด GitHub Plugin์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Jenkins โ†’ Manage Jenkins โ†’ Configure System ์ด๋™
  2. GitHub ์„น์…˜์—์„œ GitHub Webhook ์„ค์ • ํ™•์ธ
  3. "Manage Hooks" ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ GitHub Credentials ์ถ”๊ฐ€
    • Manage Jenkins โ†’ Manage Credentials โ†’ Add Credentials
    • Kind: Username with password
    • Username: GitHub ์‚ฌ์šฉ์ž๋ช…
    • Password: Personal Access Token (PAT)
    • Scope: Global
  4. ํ•ด๋‹น Credentials๋ฅผ GitHub ์„ค์ •์—์„œ ์—ฐ๊ฒฐ

๐Ÿ”น 3. GitHub Hook Trigger ํ™œ์„ฑํ™” (Jenkins Job ์„ค์ •)

Jenkins์—์„œ Webhook์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Job์—์„œ ํ•ด๋‹น ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Jenkins โ†’ ํ•ด๋‹น Pipeline Job โ†’ Configure ์ด๋™
  2. "Build Triggers" ์„น์…˜์—์„œ ์•„๋ž˜ ์˜ต์…˜ ํ™œ์„ฑํ™”
    • โœ… GitHub hook trigger for GITScm polling ์ฒดํฌ

โœ… ์ด์ œ GitHub์—์„œ ์ฝ”๋“œ๊ฐ€ ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค Jenkins๊ฐ€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€


๐Ÿ”Ÿ Jenkins ์‹คํ–‰ ๋ฐ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ

1. Jenkins Job ์‹คํ–‰

  1. Jenkins โ†’ New Item โ†’ Pipeline ์ƒ์„ฑ
  2. SCM์„ Git์œผ๋กœ ์„ค์ • (GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •)
  3. "Build Now" ์‹คํ–‰
  4. Pipeline ์‹คํ–‰ ๋กœ๊ทธ ํ™•์ธ

โœ… ์„ฑ๊ณต ์‹œ AWS ECR ํ™•์ธ

aws ecr list-images --repository-name my-jenkins-image --region ap-northeast-2

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ

์ด์ œ Jenkins๋ฅผ ํ†ตํ•ด GitHub์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ , AWS ECR์— ์—…๋กœ๋“œํ•˜๋Š” ์ž๋™ํ™” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

๋‹ค์Œ์œผ๋กœ ๋ฐฐํฌ ํ™˜๊ฒฝ (ECS, Kubernetes)๊นŒ์ง€ ํ™•์žฅํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋ฉด ์™„์ „ํ•œ DevOps ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ›  ์ถ”๊ฐ€ ์งˆ๋ฌธ

โ“ Jenkins์—์„œ GitHub ์ธ์ฆ์ด ์•ˆ ๋  ๋•Œ?

  • SSH ํ‚ค ๋“ฑ๋ก ์—ฌ๋ถ€ ํ™•์ธ (ssh -T git@github.com)

โ“ ECR ํ‘ธ์‹œ๊ฐ€ ์•ˆ ๋  ๋•Œ?

  • aws ecr get-login-password ์‹คํ–‰ ํ›„ docker login ์žฌ์‹œ๋„

โ“ GitHub Webhook์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๋•Œ?

  • GitHub โ†’ Webhook ๋กœ๊ทธ์—์„œ ์‘๋‹ต ์ฝ”๋“œ ํ™•์ธ (200 OK๊ฐ€ ์ •์ƒ)

์ด์ œ Jenkins๋ฅผ ํ™œ์šฉํ•ด ์™„์ „ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด์ฃผ์„ธ์š”. ๐Ÿ˜Š

profile
Why not change the code?

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