Infra & DevOps

Jenkins๋กœ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ

hyeyeonismm 2024. 3. 8. 02:17

ํ”„๋กœ์ ํŠธ๋ฅผ AWS EC2 ์ธ์Šคํ„ด์Šค์— Jenkins๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •
๋กœ์ปฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ → ๊นƒํ—ˆ๋ธŒ ํ‘ธ์‹œ → ์  ํ‚จ์Šค์—์„œ ์ด๋ฅผ ๊ฐ์ง€ → ์ž๋™์œผ๋กœ ๋„์ปค์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œ ๋ฐ ec2 ์„œ๋ฒ„์—์„œ ํ’€ ๋ฐ›์•„์„œ ๋ฐฐํฌ

ํ•ด๋‹น ๊ณผ์ •์—์„œ ec2 ์ธ์Šคํ„ด์Šค์™€ ๋„์ปค๋Š” ์„ค์น˜๋˜์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ์  ํ‚จ์Šค ์„œ๋ฒ„์™€ ๋ฐฐํฌ ์„œ๋ฒ„๋ฅผ ๋”ฐ๋กœ ๋‘ฌ์„œ ์ง„ํ–‰ํ•œ๋‹ค. ๋„์ปค๋Š” ๋‘ ์ธ์Šคํ„ด์Šค์— ๋ชจ๋‘ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

๋ฐฐํฌ ๊ณผ์ •์—์„œ Docker์˜ ์—ญํ• 

  • ์ด๋ฏธ์ง€ ๋นŒ๋“œ → ์  ํ‚จ์Šค ์„œ๋ฒ„์—์„œ ์†Œ์Šค์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.
  • ์ด๋ฏธ์ง€ ์ €์žฅ → ๋นŒ๋“œ๋œ ๋„์ปค ์ด๋ฏธ์ง€๋Š” Docker Registry(ex. Docker Hub, AWS ECR ๋“ฑ)์— ํ‘ธ์‹œ๋œ๋‹ค. ์ด ๊ณผ์ •์€ ์  ํ‚จ์Šค์—์„œ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฏธ์ง€ ๋ฐฐํฌ ๋ฐ ์‹คํ–‰ → ๋ฐฐํฌ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์—์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ๋ถ€ํ„ฐ ํ’€ ๋ฐ›์€ ํ›„, ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ ๋ฐฐํฌ ์„œ๋ฒ„์—๋„ ๋„์ปค๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.⇒ ๋„์ปค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ์ข…์†์„ฑ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ํŒจํ‚ค์ง•ํ•˜์—ฌ ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค.
  • ⇒ ๋„์ปค ์ด๋ฏธ์ง€๋Š” ๋„์ปค ์—”์ง„ ์œ„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฐํฌ ์„œ๋ฒ„์— ๋„์ปค๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

ec2 ์ธ์Šคํ„ด์Šค ์šฉ๋Ÿ‰ ํ™•๋Œ€

์ฐธ๊ณ ) https://velog.io/@kku64r/ec2freetier

https://velog.io/@kmw10693/EC2-ํ”„๋ฆฌํ‹ฐ์–ด-์šฉ๋Ÿ‰-๋Š˜๋ฆฌ๊ธฐ

https://yunamom.tistory.com/302

 

EC2 ์ธ์Šคํ„ด์Šค์— Jenkins ์„ค์น˜

sudo yum update -y

 

๐Ÿซฅ  apt-get์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  yum์ด ์ž‘๋™ํ•˜๋Š” ์ด์œ 

ec2๋ฅผ ๋งŒ๋“ค ๋•Œ Amazon Linux๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ

Amazon Linux๋Š” Red Hat Enterprise Linux์™€ CentOS์— ๊ธฐ๋ฐ˜์„ ๋‘” ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์ด๋‹ค. apt-get์€ ๋ฐ๋น„์•ˆ ๊ธฐ๋ฐ˜์˜ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์ด๋‹ค.

 

ec2 ์„œ๋ฒ„ ์•ˆ์— ์ง์ ‘ Jenkins๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ

sudo wget -O /etc/yum.repos.d/jenkins.repo \\
    <https://pkg.jenkins.io/redhat-stable/jenkins.repo>
sudo rpm --import <https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key>
sudo yum upgrade

 

Install Java (Amazon Linux 2023)

sudo dnf install java-11-amazon-corretto -y

์  ํ‚จ์Šค๋Š” ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ ์  ํ‚จ์Šค๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ์ž๋ฐ”ใ…๊ฐ€ ์„ค์น˜๋˜์–ด์ž‡์–ด์•ผํ•จ

 

Install Jenkins

sudo yum install jenkins -y
sudo systemctl enable jenkins
sudo systemctl start jenkins

 

์  ํ‚จ์Šค ์›น๋ธŒ๋ผ์šฐ์ € ์ ‘์†

https://guide-gov.ncloud-docs.com/docs/devtools-devtools-1-2 ์ฐธ๊ณ 

์›น๋ธŒ๋ผ์šฐ์ € ์—ด๊ณ  http://ec2์ธ์Šคํ„ด์Šค์˜ํผ๋ธ”๋ฆญip:18080/ ์— ์ ‘์†ํ•˜๋ฉด ๋œ๋‹ค.

(ec2 ๋ณด์•ˆ๊ทธ๋ฃน์—์„œ 18080ํฌํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ์–ด์•ผ ํ•จ)

 

ํŒจ์Šค์›Œ๋“œ ํ™•์ธํ•˜๊ธฐ

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

๋„์ปคํ—ˆ๋ธŒ์—์„œ ์  ํ‚จ์Šค ๋‹ค์šด๋ฐ›๊ธฐ

https://bsssss.tistory.com/1176 ์ฐธ๊ณ 

sudo docker run -itd --name jenkins  -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -p 18080:8080 jenkins/jenkins:lts

 

๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

 

Jenkins - Github ๊ณ„์ • ์—ฐ๋™ ์„ค์ •

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊นƒํ—ˆ๋ธŒ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ(ex. ์ฝ”๋“œ ํ‘ธ์‹œ)๊ฐ€ Jenkins์—์„œ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

1. Github Personal Access Token ์ƒ์„ฑ

github -> settings -> developer settings -> Personal access tokens

ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ Generate new token ํด๋ฆญ token ์ด๋ฆ„ ์„ค์ • ํ›„ repo, admin_hook ๊ถŒํ•œ์„ ์ฒดํฌํ•˜๊ณ  Generate token ์„ ํด๋ฆญํ•œ๋‹ค.

 

2. ํ† ํฐ ์—ฐ๋™ - ์  ํ‚จ์Šค์— Github Credentials ์ถ”๊ฐ€

์  ํ‚จ์Šค ๋Œ€์‹œ๋ณด๋“œ์—์„œ Manage Jenkins → Credentials๋กœ ์ด๋™ํ•œ๋‹ค.

Jenkins ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ global ์˜์—ญ์„ ์„ ํƒํ•˜๊ณ  Add Credentials๋ฅผ ํด๋ฆญํ•œ๋‹ค.

Kind์—์„œ Username with password๋ฅผ ์„ ํƒํ•˜๊ณ  Username์—๋Š” ๋‚ด ๊นƒํ—ˆ๋ธŒ ์•„์ด๋””๋ฅผ, ์•ž์„œ ์ƒ์„ฑํ•œ Github Personal Access Token์„ Password ํ•„๋“œ์— ์ž…๋ ฅํ•œ๋‹ค. ID์™€ Description์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜์—ฌ ํ† ํฐ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

OK๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

 

3. ๊นƒํ—ˆ๋ธŒ ์„œ๋ฒ„ ์—ฐ๋™

์  ํ‚จ์Šค ๋Œ€์‹œ๋ณด๋“œ์—์„œ Manage Jenkins → System์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

๋‚ด๋ฆฌ๋‹ค ๋ณด๋ฉด Github๋ผ๋Š” ๊ฒŒ ์žˆ๋Š”๋ฐ ๊ฑฐ๊ธฐ์— name์„ ์ž„์˜๋กœ ์ง€์ • ํ›„ Credentials์—์„œ Add → Jenkins๋ฅผ ํด๋ฆญํ•ด์ค€๋‹ค.

credential์„ ๋“ฑ๋กํ•œ๋‹ค. (Kind๋ฅผ Secret text๋กœ, Secret์—๋Š” ๊นƒํ—ˆ๋ธŒ ํ† ํฐ์„)

test connection์„ ๋ˆŒ๋ €์„ ๋•Œ ๋‚ด ๊นƒํ—ˆ๋ธŒ ์•„์ด๋””์™€ ์—ฐ๋™๋˜๋ฉด ์„ฑ๊ณต!

 

4. Github ์›นํ›… ์„ค์ •

๊นƒํ—ˆ๋ธŒ์—์„œ ์  ํ‚จ์Šค์™€ ์—ฐ๋™ํ•  ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.

Settings → Webhooks๋กœ ์ด๋™ํ•˜์—ฌ Add webhook์„ ํด๋ฆญํ•œ๋‹ค.

Payload URL์— ์  ํ‚จ์Šค ์„œ๋ฒ„์˜ url์„ ์ž…๋ ฅํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด url์€ http://your-jenkins-url/github-webhook/ ํ˜•์‹์ด๋‹ค.

Content type์„ application/json์œผ๋กœ ์„ ํƒํ•œ๋‹ค.

"Which events would you like to trigger this webhook?"์—์„œ "Just the push event."๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜, ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Active"๋ฅผ ์ฒดํฌํ•˜๊ณ  "Add webhook"์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

 

Jenkins์—์„œ GitHub ํ”„๋กœ์ ํŠธ ์„ค์ •

  1. Jenkins์—์„œ ์ƒˆ๋กœ์šด "Pipeline"์„ ์ƒ์„ฑํ•œ๋‹ค.
  2. "General" ์„น์…˜์—์„œ "Github project"์„ ์„ ํƒํ•˜๊ณ , GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ URL์„ ์ž…๋ ฅํ•œ๋‹ค.
  3. "Build Triggers" ์„น์…˜์—์„œ "GitHub hook trigger for GITScm polling"์„ ์„ ํƒํ•œ๋‹ค.
  4. ํ•„์š”ํ•œ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

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

 

Docker Registry ์ธ์ฆ ์ •๋ณด ๋“ฑ๋ก

docker pipeline plugin ์„ค์น˜

Jenkins Management → Credentials → Add Credentials → username: dockerhub id , password: dockerhub password

 

ssh agent ์„ค์น˜

์  ํ‚จ์Šค ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ssh๋ฅผ ํ†ตํ•ด ec2 ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ssh agent ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

Credentials ์ถ”๊ฐ€

๋‚˜๋Š” ubuntu๋ฅผ ์•ˆ์ป๊ธฐ ๋•Œ๋ฌธ์— username์— ec2-user๋ฅผ ์ผ๋‹ค.

 

https://cl8d.tistory.com/m/95 ์ฐธ๊ณ 

 

์  ํ‚จ์Šค ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

์ด์ œ ๋Œ€๋ง์˜ ์  ํ‚จ์Šค ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๋งŒ ๋‚จ์•˜๋‹ค.

pipeline {
    agent any

    environment {
        // ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
        DOCKER_IMAGE = 'dockerhub-username/projectname'
        DOCKER_TAG = 'latest'
        CONTAINER_NAME = 'projectname'
        EC2_HOSTNAME = 'ec2์„œ๋ฒ„์ฃผ์†Œ'
    }

    stages {
        stage('Checkout') {
            steps {
                // GitHub ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ์†Œ์Šค ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
                git branch: 'main', url: '<https://github.com/projectname.git>'
            }
        }

        stage('Build & Push Docker Images') {
            steps {
                script {
                    // Docker Hub์— ๋กœ๊ทธ์ธ
                    withCredentials([usernamePassword(credentialsId: 'docker-credentials', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {
                        sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
                    }
                    // Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ
                    sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG ./'
                    sh 'docker push $DOCKER_IMAGE:$DOCKER_TAG'
                }
            }
        }

        stage('Deploy to EC2') {
            steps {
                // Docker ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด SSH ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
                sshagent(credentials: ['ssh-credentials']) {
                    // SSH๋ฅผ ํ†ตํ•ด EC2 ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•˜์—ฌ Docker ์ด๋ฏธ์ง€ ์‹คํ–‰
                    sh """
                        ssh -o StrictHostKeyChecking=no ec2-user@$EC2_HOSTNAME '
                            docker pull $DOCKER_IMAGE:$DOCKER_TAG
                            docker stop $CONTAINER_NAME || true
                            docker rm $CONTAINER_NAME || true
                            docker run -d --name $CONTAINER_NAME -p 80:80 $DOCKER_IMAGE:$DOCKER_TAG
                        '
                    """
                }
            }
        }
    }
}

 

๋งˆ์ง€๋ง‰์—๋Ÿฌ..ใ… ใ… ใ… ใ… 

ERROR: Failed to find configuration named [ssh-credentials] check the global configuration

์ด๊ฒƒ๋งŒ ํ•ด๊ฒฐํ•˜๋‹ˆ ์„ฑ๊ณตํ–ˆ๋‹ค..

ํ•˜

์—๋Ÿฌ ์ง„์งœ๋งŽ์ด๋‚ฌ๋‹ค

ec2 hostname์„ 54-180-80-81๋กœ ํ•ด์„œ๋„ ๋‚ฌ๊ณ 

์šฉ๋Ÿ‰ ๋‹ค์ฐจ์„œ rmi๋ฅผ ์•ˆํ•ด์„œ๋„ ๋‚ซ๊ณ ..

ssh ํ‚ค์— %๊ฐ€ ๋“ค์–ด๊ฐ€์„œ๋„ ๋‚ฌ๊ณ ..

 

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…ใ…‡์€ ์ถ”ํ›„์— ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.