[DevOps]/CI & CD

๋กœ์ปฌ์—์„œ ์  ํ‚จ์Šค๋กœ ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ (3) - ์  ํ‚จ์Šค ํŒŒ์ผ ์ž‘์„ฑ, ๋ฐฐํฌ ํ…Œ์ŠคํŠธ ์ง„ํ–‰

ํŒกํŽ‘ํ 2023. 11. 27. 01:36
728x90
๐Ÿ’ก ์ด ๊ธ€์€ 3ํŽธ์œผ๋กœ 2ํŽธ์ธhttps://suzuworld.tistory.com/418์— ์ด์–ด ์“ฐ๋Š” ๊ธ€์ด๋‹ค.
๐Ÿ’ก 1ํŽธ๋ถ€ํ„ฐ ๋ณด๋ ค๋ฉด ์ด๊ณณ์œผ๋กœ https://suzuworld.tistory.com/419

 

๐Ÿ“Œ JenkinsFile ์ž‘์„ฑ ์ค€๋น„

  • ์ด์ œ ์  ํ‚จ์Šค์— ๋กœ๊ทธ์ธํ•ด ๋ณด์ž.
  • ๊ธฐ์กด์— ๊นƒํ—ˆ๋ธŒ ์•„์ด๋””์— ๋Œ€ํ•œ Credential ๋“ฑ๋ก์€ ์ด๋ฏธ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
  • ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด, ์—ฌ๊ธฐ๋ฅผ ๋ณด๊ณ  ๋”ฐ๋ผ ํ•˜๋ฉด ๋œ๋‹ค. ๋งค์šฐ ์ž์„ธํžˆ ์ ์–ด ๋†“์•˜๋‹ค.
  • ์ƒˆ๋กœ์šด Item์„ ํด๋ฆญํ•œ๋‹ค.
    • Item์€ Jenkins์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ, ์ž‘์—…, ๋นŒ๋“œ, ํŒŒ์ดํ”„๋ผ์ธ, ๋ทฐ ๋“ฑ์ด ์žˆ๋‹ค.

 

  • ์—ฌ๊ธฐ์„œ Pipeline์„ ์„ ํƒํ•˜๊ณ  item์˜ ์ด๋ฆ„์„ ๊ธฐ์ž…ํ•œ๋‹ค.
    • ๋‚˜๋Š” jenkinTest๋ผ๊ณ  ์ง€์—ˆ๋‹ค. ์ด๋Š” jenkinsFile์„ ์ž‘์„ฑํ•  ๋•Œ ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์˜ ํ˜„์žฌ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค.
      • /workspace/jenkinsTest๊ฐ€ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
    • jenkins๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ jenkins_home์ด๋ผ๋Š” ํด๋”๊ฐ€ ๋””๋ ‰ํ„ฐ๋ฆฌ ์–ด๋”˜๊ฐ€์— ์ƒ์„ฑ๋˜์ง€๋งŒ, m2 ๋งฅ๋ถ์—์–ด๋กœ ํ…Œ์ŠคํŠธ ์‹œ /Users/<user๋ช…>/.jenkins ๊ฒฝ๋กœ์— ์ƒ์„ฑ๋˜์—ˆ๋‹ค.

 

  • Pipeline์€ FreeStyle๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ์ž์œ ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋‹ด์ด ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ํฌ๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š๋‹ค.

 

  • ๋จผ์ € GitHub project ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๊ณ  Project url์„ ์„ค์ •ํ•œ๋‹ค.

 

๐Ÿ’ก ๋นŒ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€

  • jar ํŒŒ์ผ ์‹คํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ์‹œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์—์„œ๋„ ๊ฝค๋‚˜ ์‹œ๊ฐ„์„ ์žก์•„๋จน์—ˆ๋‹ค..
  • JenkinsFile์— ์ž‘์„ฑ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์ด ๋๋‚˜๋ฉด ์‹คํ–‰ ๋‚ด์šฉ์„ ์ „๋ถ€ kill ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • nohup์œผ๋กœ ์ƒ์„ฑํ•ด๋„ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋‚ด์šฉ์€ ์ „๋ถ€ ์ฃฝ์—ฌ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ kill ๋œ๋‹ค.
    • ์ด ์„ค์ •์„ ํ•ด๋†“์ง€ ์•Š์œผ๋ฉด nohup์œผ๋กœ ์‹คํ–‰์‹œํ‚จ ์Šคํ”„๋ง๋ถ€ํŠธ ํŒŒ์ผ์ด ๋นŒ๋“œ ๋ฐฐํฌ๊ฐ€ ์ข…๋ฃŒ๋จ๊ณผ ๋™์‹œ์— process kill ๋œ๋‹ค.
  • ์œ„์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ช…์—๋Š” JENKINS_NODE_COOKIE, Value์—๋Š” dontKillMe๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž.

 

โ—๏ธ์ž ๊น

  • pipeline ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” BUILD_ID ๋Œ€์‹ ์— JENKINS_NODE_COOKIE๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ณต์‹๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋‹ค.

 

โœ๐Ÿป JenkinsFile ์ž‘์„ฑ

  • ์ข€ ์•„๋ž˜๋กœ ๋‚ด๋ฆฌ๋ฉด pipeline ์ž‘์„ฑ๋ž€์ด ๋‚˜์˜จ๋‹ค.
  • ์ด๊ณณ์— ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

๐ŸฅŠ scripted Pipeline VS declarative Pipeline

  • Script ์ž…๋ ฅ์ฐฝ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ๋ณด๋ฉด sample Pipeline์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์ƒ˜ํ”Œ๋“ค์„ ํด๋ฆญํ•ด ๋ณด๋ฉด ๋ญ”๊ฐ€ ๋น„์Šทํ•ด ๋ณด์ด๋ฉด์„œ๋„ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฒผ๋‹ค.
  • ์™ผ์ชฝ์€ Scripted Pipeline์ด๋ฉฐ, ์˜ค๋ฅธ์ชฝ์€ Declarative Pipeline์ด๋‹ค.
    • Scripted Pipeline๊ณผ Declarative Pipeline ๋ชจ๋‘ ์  ํ‚จ์Šค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
    • ์ด ๋‘ ๊ฐ€์ง€ ํŒŒ์ดํ”„๋ผ์ธ์€ ์  ํ‚จ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CI/CD(์ง€์†์ ์ธ ํ†ตํ•ฉ/์ง€์†์ ์ธ ๋ฐฐํฌ) ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ’ก Scripted Pipeline

  • ๊ธฐ์กด์˜ ์  ํ‚จ์Šค ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋กœ Groovy๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ ๋‹ค.
    • Groovy๋Š” Java ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์  ์–ธ์–ด๋กœ ์ž๋ฐ” ๋ฌธ๋ฒ•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
  • Scripted Pipeline์€ ์ž์œ ๋„๊ฐ€ ๋†’๊ณ  ์œ ์—ฐํ•˜๋ฉฐ, ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค.

 

๐Ÿ’ก Declarative Pipeline

  • ์  ํ‚จ์Šค 2.5 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…๋œ ์ƒˆ๋กœ์šด ํ˜•์‹์˜ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ์ด๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์กฐ์™€ ๋‹จ๊ณ„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.
  • ์ด ์—ญ์‹œ Groovy ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ Scripted Pipeline์— ๋น„ํ•ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์€ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ CI/CD ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์ „์— ์ •์˜ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿ“œ ์ •๋ฆฌ

  • ์ด ๋‘ ๊ฐ€์ง€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ ํƒ์€ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๊ฐœ๋ฐœ์ž์˜ ์„ ํ˜ธ๋„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.
  • Scripted Pipeline์€ ์ž์œ ๋กœ์›€๊ณผ ์œ ์—ฐ์„ฑ์„ ์›ํ•˜๋Š” ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.
  • Declarative Pipeline์€ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ตฌ์กฐํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
  • ๊ด€๋ จ ๋‚ด์šฉ์„ ๋‹ค๋ฃฌ ๋ธ”๋กœ๊ทธ๋ฅผ ์ข€ ๋” ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ ์ตœ๊ทผ์˜ CI/CD๋Š” Declarative๊ฐ€ ๋Œ€์„ธ๋ผ๊ณ  ํ•˜๋ฉฐ, Github Actions ์—ญ์‹œ YAML ๊ธฐ๋ฐ˜์˜ Declarative๋ฅผ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    • ๋‚˜๋Š” ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ณ  ๋Œ€์„ธ์ธ Declarative ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

๐Ÿ“Œ Jenkinsfile 

  • ์ด ๋ถ€๋ถ„์—์„œ๋„ ์ง€๋‚œ ๊ธ€๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ์ชผ๊ฐœ ์„ค๋ช…ํ•œ ํ›„ ์™„์„ฑ๋ณธ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.

 

pipeline {
agent any

stages {...}
}
  • pipeline
    • ํŒŒ์ดํ”„๋ผ์ธ ๋ธ”๋ก์„ ์ •์˜ํ•œ๋‹ค.
    • ์ด ๋ธ”๋ก ์•ˆ์—๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ „์ฒด ๊ตฌ์กฐ๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • agent any 
    • ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋  ์—์ด์ „ํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • any๋Š” ์–ด๋–ค ์—์ด์ „ํŠธ์—์„œ๋ผ๋„ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
  • stages
    • ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ธ”๋ก์ด๋‹ค.
    • stages ๋ธ”๋ก ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ stage ๋ธ”๋ก์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ stage๋Š” ํŒŒ์ดํ”„๋ผ์ธ์˜ ํŠน์ • ๋‹จ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰๋  ์ž‘์—…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๋ฉด, ์ •์˜๋œ ๋‹จ๊ณ„์™€ ์ž‘์—…์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

โŒจ๏ธ stage('Backup & Clean Workspace')

    stages {
        stage('Backup & Clean Workspace') {
            steps {
                script {
                    sh """
                        rm -rf /Users/wonyong/.jenkins/workspace/backup/*
                        cp -r /Users/wonyong/.jenkins/workspace/jenkinsTest /Users/wonyong/.jenkins/workspace/backup
                        rm -rf *
                    """
                }
            }
        }
  • stages ์•ˆ์— ์ •์˜ํ•œ ๊ฐ stage๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ๊ทธ ์ด๋ฆ„์„ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • sh """ """ ์•ˆ์— ๋‚ด์šฉ์„ ์ ์œผ๋ฉด ๊ฐœํ–‰๋œ ๋ถ€๋ถ„๋„ ์ „๋ถ€ ์Šคํฌ๋ฆฝํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค.
  • rm -rf /Users/wonyong/.jenkins/workspace/backup/*
    • ๊ธฐ์กด์— jenkins workspace ๋‚ด๋ถ€์— backup ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€์— backup ํด๋”๋ฅผ rm -rf ๋ช…๋ น์–ด๋ฅผ ๋น„์šด๋‹ค.
  • cp -r /Users/wonyong/.jenkins/workspace/jenkinsTest /Users/wonyong/.jenkins/workspace/backup
    • /Users/wonyong/.jenkins/workspace/jenkinsTest(๊นƒํ—ˆ๋ธŒ๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ ํด๋ก  ํ•œ ํด๋”)๋ฅผ ์œ„์—์„œ ๋น„์›Œ๋‘” ๋ฐฑ์—…ํด๋”์— ๋„ฃ๋Š”๋‹ค.
    • r ์˜ต์…˜์€ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋ฉฐ, ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํŒŒ์ผ๋„ ํ•จ๊ป˜ ๋ณต์‚ฌํ•œ๋‹ค.
  • rm -rf *
    • ๊ธฐ์กด ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ jenkinsTest ํด๋” ๋‚ด๋ถ€ ์ „์ฒด๋ฅผ ๋น„์šด๋‹ค.
  • ์ฆ‰, stage์—์„œ ์‹คํ–‰๋˜๋Š” ๊ธฐ๋ณธ ํด๋”์˜ ํ˜„์žฌ ๊ฒฝ๋กœ๋Š” ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋‚ด ๋นŒ๋“œ ํ…Œ์ŠคํŠธ ์ด๋ฆ„์ด๋‹ค.(์ž๋™ ์ƒ์„ฑ๋œ๋‹ค.)
  • ์ด ๋ถ€๋ถ„์€ ๊ตณ์ด ํ•„์š”์—†๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ backup ํด๋”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ด ๋งŒ๋“ค์—ˆ๋‹ค.

 

๐Ÿ“Œ stage('Github Clone')

stage('Github Clone') {
            steps {
                git branch: 'main',
                credentialsId: 'github_token', 
                url: 'https://github.com/wonyongg/jenkinsTest'
            }
        }
  • github ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์„œ clone ํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.
  • ์—ฌ๊ธฐ์„œ credentialsId๋Š” ์  ํ‚จ์Šค ๊ธฐ๋ณธ ์„ค์ •์—์„œ ๋งŒ๋“  Credential ์ •๋ณด์ด๋‹ค.
  • ์œ„์˜ ๋งํฌ์™€ ๋™์ผํ•˜๋‹ค. ์ด๊ณณ์œผ๋กœ ๋“ค์–ด๊ฐ€ credentials ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์ž.

 

๐Ÿ“Œ stage('Build')

stage('Build') {
            steps {
                script {
                    sh """
                        cd forJenkins
                        perl -i -pe 'y|\r||d' gradlew
                        ./gradlew build 
                    """
                }
            }
        }
  • ์ด ๋ถ€๋ถ„์ด ์ƒ๋‹นํžˆ ์• ๋จน์€ ๋ถ€๋ถ„์ด๋‹ค.
  • ๋‚˜๋Š” ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ธํ…” ๋งฅ๋ถ ํ”„๋กœ์™€ m2 ๋งฅ๋ถ ์—์–ด ๋‘ ๊ธฐ๊ธฐ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • ์ธํ…” ๋งฅ๋ถ์—์„œ๋Š” perl -i -pe 'y|\r||d' gradlew ์ด ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • m2 ๋งฅ๋ถ์—์„œ๋Š” ์ด ๋ช…๋ น์–ด ์—†์ด ์ž‘๋™์‹œ์ผฐ์„ ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
    • ์ด ๋ฌธ์ œ๊ฐ€ ์™œ ์ƒ๊ธฐ๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜๋Š” ์—†์œผ๋‚˜ m2 ๋งฅ๋ถ ๋กœ์ปฌ์—์„œ ๊นƒํ—ˆ๋ธŒ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ‘ธ์‹œํ•˜๊ณ  ์ด๋ฅผ ์  ํ‚จ์Šค์—์„œ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ์— ๋‹ค์‹œ ํด๋ก  ํ•˜๋Š” ๊ณผ์ •์—์„œ gradlew ํŒŒ์ผ์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์šด์˜์ฒด์ œ์˜ ์ฐจ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ธํ…” ๋งฅ๋ถ์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๋์ง€๋งŒ m2 ๋งฅ๋ถ์—์„œ๋Š” gradlew๋ฅผ ์‹คํ–‰ํ•˜์ž "zsh: ./gradlew: bad interpreter: /bin/sh^M: no such file or directory"์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
    • ์ด๋Š” ์ฃผ๋กœ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋ฆฌ๋ˆ…์Šค/์œ ๋‹‰์Šค ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค.
    • ์ •ํ™•ํ•œ ์›์ธ์€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊นŠ๊ฒŒ ์ฐพ์•„๋ณด์ง€ ์•Š์•˜๋‹ค. ์•„๋ฌดํŠผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ € ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์ž.
  • perl : Perl ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
  • -i : "in-place" ๋ชจ๋“œ๋กœ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์›๋ณธ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
  • -pe : -p ์˜ต์…˜์€ ์ž…๋ ฅ ํŒŒ์ผ์„ ํ•œ ์ค„์”ฉ ์ฝ์–ด ๋“ค์ด๊ณ , -e ์˜ต์…˜์€ ์ฃผ์–ด์ง„ Perl ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • 'y|\r||d' : y ์—ฐ์‚ฐ์ž๋Š” ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” \r ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•œ๋‹ค. d ํ”Œ๋ž˜๊ทธ๋Š” ์น˜ํ™˜๋œ ๋ฌธ์ž์—ด์„ ์‚ญ์ œํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด gradlew ํŒŒ์ผ์—์„œ \r ๋ฌธ์ž๊ฐ€ ์‚ญ์ œ๋œ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. (\r ๋ฌธ์ž๊ฐ€ ์ถ”๊ฐ€๋˜๋‚˜๋ณด๋‹ค..)

 

๐Ÿ“Œ stage('Deploy')

stage('Deploy') {
            steps {
                script {
                    sh """
                        cd forJenkins/script && perl -i -pe 'y|\r||d' deploy.sh switch.sh default_switch.sh
                        ./deploy.sh
                    """
                }
            }
        }
    }
}
  • ์ด ๋ถ€๋ถ„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด perl -i -pe 'y|\r||d' deploy.sh switch.sh default_switch.sh ์ด ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.
  • jenkinsTest์˜ forJenkins ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋กœ ๋“ค์–ด๊ฐ€ script์˜ deploy.sh ํŒŒ์ผ์„ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์ด์ „ ๊ธ€์—์„œ ์ž‘์„ฑํ•œ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

 

โŒจ๏ธ JenkinsFile ์™„์„ฑ๋ณธ

pipeline {
    agent any
    
    stages {
        stage('Backup & Clean Workspace') {
            steps {
                script {
                    sh """
                        rm -rf /Users/wonyong/.jenkins/workspace/backup/*
                        cp -r /Users/wonyong/.jenkins/workspace/jenkinsTest /Users/wonyong/.jenkins/workspace/backup
                        rm -rf *
                    """
                }
            }
        }
        
        stage('Github Clone') {
            steps {
                git branch: 'main',
                credentialsId: 'github_token', 
                url: 'https://github.com/wonyongg/jenkinsTest'
            }
        }
        
        stage('Build') {
            steps {
                script {
                    sh """
                        cd forJenkins
                        perl -i -pe 'y|\r||d' gradlew
                        ./gradlew build 
                    """
                }
            }
        }
        
        stage('Deploy') {
            steps {
                script {
                    sh """
                        cd forJenkins/script && perl -i -pe 'y|\r||d' deploy.sh switch.sh default_switch.sh
                        ./deploy.sh
                    """
                }
            }
        }
    }
}
  • perl -i -pe 'y|\r||d' ์ด ๋ช…๋ น์–ด๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด ๋นผ์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

๐Ÿ“Œ ๋ฐฐํฌ ํ…Œ์ŠคํŠธํ•ด ๋ณด๊ธฐ

  • ๋“œ๋””์–ด ๋ฐฐํฌ ํ…Œ์ŠคํŠธ์ด๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ฒ ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋Š” github์œผ๋กœ ํ‘ธ์‹œํ•˜์—ฌ webhook์œผ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  ์ง์ ‘ ๋นŒ๋“œ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
  • ์ง์ ‘ ๋นŒ๋“œ
    • ๋ฒ„ํŠผ ํด๋ฆญ 
  • stage('Backup & Clean Workspace')
    • ๋กœ์ปฌ ๋‚ด ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ๊ธฐ์กด ๋ฐฑ์—… ํŒŒ์ผ ์‚ญ์ œ -> ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๋ฐฑ์—… ํŒŒ์ผ๋กœ ๋ณต์‚ฌ -> ๊ธฐ์กด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์‚ญ์ œ 
  • stage('Github Clone')
    • jenkins credential ์‚ฌ์šฉ -> github ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์„œ ํด๋ก  -> ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ(์žˆ๋‹ค๋ฉด ๋ฎ์–ด์“ฐ๊ธฐ)
  • stage('Build')
    • cd ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋กœ ๋“ค์–ด๊ฐ€ ./gradlew build ์‹คํ–‰
  • stage('Deploy')
    • ์ง€๋‚œ ๊ธ€์— ์ž‘์„ฑํ•œ deploy.sh ์‹คํ–‰
      • if) ๋ธ”๋ฃจ, ๊ทธ๋ฆฐ ๋ชจ๋‘ ์‹คํ–‰์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด deploy.sh -> default_switch.sh -> ๋ธ”๋ฃจ ํฌํŠธ ์‹คํ–‰
      • else if) ๋ธ”๋ฃจ๊ฐ€ ์‹คํ–‰์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด deploy.sh -> switch.sh -> ๊ทธ๋ฆฐ ํฌํŠธ ์‹คํ–‰ -> ๋ธ”๋ฃจ kill
      • else if) ๊ทธ๋ฆฐ์ด ์‹คํ–‰์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด deploy.sh -> switch.sh -> ๋ธ”๋ฃจ ํฌํŠธ ์‹คํ–‰ -> ๊ทธ๋ฆฐ kill
      • ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ, ๋ฐฐํฌ ์™„๋ฃŒ
  • Dashboard์—์„œ ํ•ด๋‹น item์— ๋“ค์–ด๊ฐ€ "ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ ๋นŒ๋“œ"๋ฅผ ํด๋ฆญํ•œ๋‹ค.

 

  • ์ดํ›„ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ํ™•์ธํ•˜๊ณ  ์ดˆ๋ก์ƒ‰ ๋นŒ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค.

 

  • ๋นŒ๋“œ๊ฐ€ ์ง„ํ–‰ ์ค‘์ด๊ณ  ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“œ ํŒŒ์ดํ”„๋ผ์ธ ๋กœ๊ทธ

Skip to content
[Jenkins]Jenkins
๊ฒ€์ƒ‰ (โŒ˜+K)
1
ํ™ฉ์›์šฉ

๋กœ๊ทธ์•„์›ƒ
Dashboard
jenkinsTest
#21
Status
Changes
Console Output
View as plain text
Edit Build Information
Delete build ‘#21’
Parameters
Git Build Data

Restart from Stage
Replay
Pipeline Steps
Workspaces
Previous Build
์ฝ˜์†” ์ถœ๋ ฅ
Started by user ํ™ฉ์›์šฉ
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /Users/wonyong/.jenkins/workspace/jenkinsTest
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Backup & Clean Workspace)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ rm -rf /Users/wonyong/.jenkins/workspace/backup/jenkinsTest
+ cp -r /Users/wonyong/.jenkins/workspace/jenkinsTest /Users/wonyong/.jenkins/workspace/backup
+ rm -rf forJenkins
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Github Clone)
[Pipeline] git
The recommended git tool is: NONE
using credential github_token
 > git rev-parse --resolve-git-dir /Users/wonyong/.jenkins/workspace/jenkinsTest/.git # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://github.com/wonyongg/jenkinsTest # timeout=10
Fetching upstream changes from https://github.com/wonyongg/jenkinsTest
 > git --version # timeout=10
 > git --version # 'git version 2.39.2 (Apple Git-143)'
using GIT_ASKPASS to set credentials 
 > git fetch --tags --force --progress -- https://github.com/wonyongg/jenkinsTest +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/main^{commit} # timeout=10
Checking out Revision 1e4436fc668e08130c8645ca6e4cbbff4bddec3f (refs/remotes/origin/main)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 1e4436fc668e08130c8645ca6e4cbbff4bddec3f # timeout=10
 > git branch -a -v --no-abbrev # timeout=10
 > git branch -D main # timeout=10
 > git checkout -b main 1e4436fc668e08130c8645ca6e4cbbff4bddec3f # timeout=10
Commit message: "exit 0"
 > git rev-list --no-walk 1e4436fc668e08130c8645ca6e4cbbff4bddec3f # timeout=10
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ cd forJenkins
+ perl -i -pe 'y|
||d' gradlew
+ ./gradlew build
Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details
> Task :compileJava
> Task :processResources
> Task :classes
> Task :bootJarMainClassName
> Task :bootJar
> Task :jar
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
> Task :check
> Task :build

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.4/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD SUCCESSFUL in 5s
7 actionable tasks: 7 executed
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ cd forJenkins/script
+ perl -i -pe 'y|
||d' deploy.sh switch.sh default_switch.sh
+ ./deploy.sh
-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์‹œ์ž‘>
-> ๐Ÿ“ฆ ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Profile ํ™•์ธ
-> โš ๏ธ profile not found : ์ผ์น˜ํ•˜๋Š” Profile์ด ์—†์Šต๋‹ˆ๋‹ค.
-> โš ๏ธ set default profile : ๊ธฐ๋ณธ Profile์ธ blue๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
-> โš ๏ธ ๋ธ”๋ฃจ, ๊ทธ๋ฆฐ์ด ๋ชจ๋‘ ๋™์ž‘์ค‘์ด ์•„๋‹ˆ์—ˆ์œผ๋ฏ€๋กœ, blue๋งŒ ๋ฐฐํฌํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
-> ๐Ÿšš blue ๋ฐฐํฌ
-> ๐Ÿšš nohup java -jar /Users/wonyong/.jenkins/workspace/jenkinsTest/forJenkins/build/libs/forJenkins.jar --spring.profiles.active=blue > /dev/null &
-> ๐Ÿš‘ blue : 10์ดˆ ํ›„ Health Check Start
-> ๐Ÿš‘ curl -s http://localhost:8081/actuator/health
-> ๐Ÿšจ [1 ๋ฒˆ์งธ Health Check]
-> โœ…  Health Check ์„ฑ๊ณต!!!
-> ๐Ÿ”„ NGINX : Default Port๋กœ ํ”„๋ก์‹œ ์„ค์ •
-> โšก๏ธ set default port : ๊ธฐ๋ณธ ํฌํŠธ์ธ 8081 ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
-> ๐Ÿ”„ NGINX ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ ์„ค์ •
-> ๐Ÿฅณ set $service_url http://127.0.0.1:8081;
-> ๐Ÿ”„ NGINX ์žฌ์‹œ์ž‘
-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
REST API
Jenkins 2.433
  • ๊ธฐ๋ณธ์ ์œผ๋กœ blue, green ๋ชจ๋‘ ์ž‘๋™ ์ค‘์ด ์•„๋‹ ์‹œ blue ํฌํŠธ๋กœ ์Šคํ”„๋ง๋ถ€ํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ blue๋กœ ์„ค์ •ํ•œ๋‹ค.

 

๐Ÿ“Œ blue -> green ํ”„๋ก์‹œ ๋ณ€๊ฒฝ

-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์‹œ์ž‘>
-> ๐Ÿ“ฆ ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Profile ํ™•์ธ
-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : blue
-> ๐Ÿšš green ๋ฐฐํฌ
-> ๐Ÿšš nohup java -jar /Users/wonyong/.jenkins/workspace/jenkinsTest/forJenkins/build/libs/forJenkins.jar --spring.profiles.active=green > /dev/null &
-> ๐Ÿš‘ green : 10์ดˆ ํ›„ Health Check Start
-> ๐Ÿš‘ curl -s http://localhost:8082/actuator/health
-> ๐Ÿšจ [1 ๋ฒˆ์งธ Health Check]
-> โœ…  Health Check ์„ฑ๊ณต!!!
-> ๐Ÿคผ NGINX ํฌํŠธ ์Šค์œ„์นญ ์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘
-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Port : blue
-> โšก๏ธ ํ˜„์žฌ NGINX ํ”„๋ก์‹œ ํฌํŠธ : 8081
-> โšก๏ธ ๋ณ€๊ฒฝํ•  NGINX ํ”„๋ก์‹œ ํฌํŠธ : 8082
-> ๐Ÿ”„ NGINX ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ
-> ๐Ÿฅณ set $service_url http://127.0.0.1:8082;
-> โœ… NGINX ์žฌ์‹œ์ž‘
-> ๐Ÿ”ซ ๊ธฐ์กด ํฌํŠธ์ธ blue ํฌํŠธ : 8081 KILL
-> ๐Ÿ“ฆ blue ์˜ PID : 3962
-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  • blue๊ฐ€ ์‚ด์•„์žˆ์„ ๋•Œ green์„ ์‚ด๋ฆฌ๊ณ  nginx์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•œ ํ›„ blue๋ฅผ kill ํ•œ๋‹ค.

 

๐Ÿ“Œ green -> blue ํ”„๋ก์‹œ ๋ณ€๊ฒฝ

-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์‹œ์ž‘>
-> ๐Ÿ“ฆ ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Profile ํ™•์ธ
-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : green
-> ๐Ÿšš blue ๋ฐฐํฌ
-> ๐Ÿ“ฆ blue ์˜ PID : 6668
-> ๐Ÿšš nohup java -jar /Users/wonyong/.jenkins/workspace/jenkinsTest/forJenkins/build/libs/forJenkins.jar --spring.profiles.active=blue > /dev/null &
-> ๐Ÿš‘ blue : 10์ดˆ ํ›„ Health Check Start
-> ๐Ÿš‘ curl -s http://localhost:8081/actuator/health
-> ๐Ÿšจ [1 ๋ฒˆ์งธ Health Check]
-> โœ…  Health Check ์„ฑ๊ณต!!!
-> ๐Ÿคผ NGINX ํฌํŠธ ์Šค์œ„์นญ ์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘
-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Port : green
-> โšก๏ธ ํ˜„์žฌ NGINX ํ”„๋ก์‹œ ํฌํŠธ : 8082
-> โšก๏ธ ๋ณ€๊ฒฝํ•  NGINX ํ”„๋ก์‹œ ํฌํŠธ : 8081
-> ๐Ÿ”„ NGINX ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ
-> ๐Ÿฅณ set $service_url http://127.0.0.1:8081;
-> โœ… NGINX ์žฌ์‹œ์ž‘
-> ๐Ÿ”ซ ๊ธฐ์กด ํฌํŠธ์ธ green ํฌํŠธ : 8082 KILL
-> ๐Ÿ“ฆ green ์˜ PID : 6596
-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ <Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  • green๊ฐ€ ์‚ด์•„์žˆ์„ ๋•Œ blue์„ ์‚ด๋ฆฌ๊ณ  nginx์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•œ ํ›„ green๋ฅผ kill ํ•œ๋‹ค.

 

๐Ÿ“œ ์ตœ์ข…์ •๋ฆฌ

  • ngrok์œผ๋กœ github webhook ์—ฐ๊ฒฐํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ถ€๋ถ„์€ ์ƒ๋žตํ–ˆ๋‹ค.
    • ๊ฐ™์€ ์„ค๋ช… ๋ฐ˜๋ณต์ด๊ธฐ๋„ ํ•˜๊ณ  ๊ฒฐ๊ตญ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐํ•˜๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ๋กœ์ปฌ๋กœ ngrok์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ๊ณผ์ •๊นŒ์ง€ ๋ณด์—ฌ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.
    • ngrok์œผ๋กœ ์™ธ๋ถ€์— ์„œ๋ฒ„๋ฅผ ์˜คํ”ˆํ•˜๊ณ  ์›นํ›…์œผ๋กœ ๋ฐฐํฌ ์ž๋™ํ™” + ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
  • ์‹ค์ œ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ jar ํŒŒ์ผ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ssh ์—ฐ๊ฒฐ๋กœ ์ง„ํ–‰ํ•  ํ…๋ฐ ๊ทธ ๋ถ€๋ถ„์€ ์‹ค๋ฌด์— ์ ์šฉํ•ด ๋ณด๋ฉด์„œ ๊ฒฝํ—˜ํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.
    • ์˜คํžˆ๋ ค ๊ทธ ๋ถ€๋ถ„์ด ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค. ๋กœ์ปฌ์—์„œ ๋กœ์ปฌ๋กœ ๋ณด๋‚ด๋Š” ๊ฒŒ ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ PC๋Š” macOS ๊ธฐ๋ฐ˜์ด๋ผ ๋ฆฌ๋ˆ…์Šค์™€๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„(sudo ๋ช…๋ น์–ด๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋“ ๊ฐ€) ๋“ฑ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ฝค๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.

 

 

 

jenkins ๊ด€๋ จ ๊ตฌํ˜„ ์‹œ ์ฐธ๊ณ ํ–ˆ๊ฑฐ๋‚˜ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์— ๋„์›€์„ ์ค€ ๋งํฌ์ด๋‹ค.

๊ตฌํ˜„

https://hyunminh.github.io/nonstop-deploy/

https://hudi.blog/zero-downtime-deployment-with-jenkins-and-nginx/

https://hudi.blog/continuous-deploy-with-jenkins-1-backend/

https://stir.tistory.com/252

https://iizz.tistory.com/341

https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller

 

 

์—๋Ÿฌ ํ•ธ๋“ค๋ง

https://be-developer.tistory.com/14

https://narup.tistory.com/224

https://stackoverflow.com/questions/8646762/cannot-run-program-gradle-in-jenkins

https://stackoverflow.com/questions/17131249/how-to-solve-bad-interpreter-no-such-file-or-directory

 

 

728x90