Infra

Jenkins๊ฐ€ Flutter ๊ฒฝ๋กœ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด ๋ฐœ์ƒํ•œ ์ด์Šˆ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

flutter developer 2025. 1. 23. 20:41

๐Ÿง ๋ฌธ์ œ์ƒํ™ฉ

 
๋งค์ผ ์ƒˆ๋ฒฝ 5์‹œ๋งˆ๋‹ค ํ”Œ๋Ÿฌํ„ฐ ํ”„๋กœ์ ํŠธ develop ๋ธŒ๋žœ์น˜์—์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ ์ž ํ–ˆ๋‹ค.
 
1. ์ด๋ฅผ ์œ„ํ•ด EC2์— ๋„์ปค๋กœ ์  ํ‚จ์Šค๋ฅผ ๋ฐฐํฌํ–ˆ๋‹ค.
2. Flutter ๋Š” Docker Hub ์— ๋งˆ๋•…ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ์—†์–ด์„œ (๊ฐœ์ธ์ด ์˜ฌ๋ ค๋†“์€ ํ”Œ๋Ÿฌํ„ฐ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๊ธดํ–ˆ๋Š”๋ฐ ์Šคํƒ€์ˆ˜๊ฐ€ ์›Œ๋‚™ ๋‚ฎ์•„ ์‹ ๋ขฐํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.) EC2 ๋กœ์ปฌ์— ์ง์ ‘ ์„ค์น˜ํ•œ์ƒํƒœ์˜€๋‹ค.
 
์ด ์ƒํƒœ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  build ๋ฅผ ํ•ด๋ณด์•˜๋”๋‹ˆ ์  ํ‚จ์Šค๊ฐ€ flutter ํŒŒ์ผ์„ ์ฐพ์ง€๋ชปํ•˜๊ณ  failureํ•ด๋ฒ„๋ฆฌ๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.


โ˜บ๏ธ ๋ฌธ์ œ ์›์ธ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ


Jenkins๊ฐ€ Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž์ฒด ๊ฒฉ๋ฆฌ๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, EC2 ๋กœ์ปฌ์— ์„ค์น˜๋œ Flutter์™€ Android SDK ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ณ , flutter ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ์ •๋ฆฌํ•˜๋ฉด

 

  1. Flutter ๋ฐ Android SDK ๊ฒฝ๋กœ ๋งˆ์šดํŠธ ๋ฏธ์„ค์ •
    Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ EC2 ํ˜ธ์ŠคํŠธ์˜ /home/ec2-user/flutter ๋ฐ /home/ec2-user/android-sdk ๊ฒฝ๋กœ๋ฅผ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•จ.

  2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ˆ„๋ฝ
    Jenkins Pipeline์—์„œ Flutter์™€ Android SDK ๊ฒฝ๋กœ๋ฅผ PATH์— ํฌํ•จํ•˜์ง€ ์•Š์Œ.


  3. ๊ถŒํ•œ ๋ฌธ์ œ
    EC2 ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ Jenkins Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š์Œ.

 

์œ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด  Docker๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š” Jenkins ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ˜ธ์ŠคํŠธ์˜ Flutter ๋ฐ Android SDK๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.


๋ณผ๋ฅจ์ด๋ž€? 

 

๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ทธ ์ž์ฒด๋กœ ๊ฒฉ๋ฆฌ๋œ ์ €์žฅ ๊ณต๊ฐ„ ํ™˜๊ฒฝ์œผ๋กœ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ๊ณผ ๋ถ„๋ฆฌ๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋„์ปค๋Š” ์ด์‹์„ฑ(portability)์ด ์ƒ๋ช…์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๋Š” ์–ด๋””์„œ๋“  ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ดํ•˜๊ณ  (์˜ˆ: ๋กœ์ปฌ, ํด๋ผ์šฐ๋“œ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ) ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŠน์ • ํ˜ธ์ŠคํŠธ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์กดํ•œ๋‹ค๋ฉด, ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์œผ๋กœ ์˜ฎ๊ฒผ์„ ๋•Œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ฒจ๋ฒ„๋ฆฐ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋„์ปค ์ด๋ฏธ์ง€์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๋Š”๋Œ€์‹  ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์ฐธ์กฐํ•ด์„œ ์“ฐ๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๊ณต๊ฐ„์„ "๋„์ปค๋ณผ๋ฅจ"์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰ ๋„์ปค ๋ณผ๋ฅจ์€ ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋„์ปค์˜ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋”๋ผ๋„ ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋œ๋‹ค. ์ฃผ์š” ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆ˜๋ช…๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.
  • ๋„์ปค๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ • ์œ„์น˜์— ์ €์žฅ๋œ๋‹ค (/var/lib/docker/volumes/).
  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋งˆ์šดํŠธ๋ž€?

https://takethenotes.com/mount-points/

 

๋ฆฌ๋ˆ…์Šค๋Š” ๋‹จ์ผ ๋ฃจํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ(/)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋‹ค. ์™ธ๋ถ€ ์žฅ์น˜(๋””์Šคํฌ, USB ๋“ฑ)๋‚˜ ์ถ”๊ฐ€ ๋””์Šคํฌ ํŒŒํ‹ฐ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ด๋ฅผ ๋ฆฌ๋ˆ…์Šค์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ํŠธ๋ฆฌ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.์ด๋•Œ  ๋งˆ์šดํŠธ๋Š” ์™ธ๋ถ€ ์ €์žฅ ์žฅ์น˜๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๋ฆฌ๋ˆ…์Šค์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ(๋งˆ์šดํŠธ ์ง€์ , Mount Point)์— ์—ฐ๊ฒฐํ•œ๋‹ค. ๋งˆ์šดํŠธ๋œ ์žฅ์น˜์˜ ๋ฐ์ดํ„ฐ๋Š” ๋งˆ์šดํŠธ ์ง€์  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

https://therahulsarkar.medium.com/understanding-docker-volumes-a-comprehensive-guide-46339aa9ac53

 

๊ป๋ฐ๊ธฐ๋ผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋„์ปค์ด๋ฏธ์ง€๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€ ๊ฒฝ๋กœ์ด๋‹ค. BindMount ๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•, tmpfs mount๋ฅผ ํ†ตํ•ด ๋žจ๋ฉ”๋ชจ๋ฆฌ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ๋„์ปค ๋ณผ๋ฅจ ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

 


 

์ผ๋‹จ ํ”Œ๋Ÿฌํ„ฐ SDK๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋žจ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ๋„์ปค๋ณผ๋ฅจ or Bindmount ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ–ˆ๋‹ค. ์ด์ค‘ ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋ฐฉ๋ฒ•์€ ๋„์ปค ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋ฅผ ํ†ตํ•œ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. 

 

 

๋„์ปค ๋ณผ๋ฅจ๊ณผ BindMount ์ฐจ์ด

 

๋„์ปค ๋ณผ๋ฅจ์€ Docker๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค(var/lib/docker/volumes/). ๋”ฐ๋ผ์„œ, ๋กœ์ปฌ ๊ฒฝ๋กœ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์ด ์–ด๋””๋“  ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋Š” ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌผ๋ก  ๋ฐ”์ธ๋“œ ํ˜ธ์ŠคํŠธ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋กœ์ปฌ ํŒŒ์ผ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SDK์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด๋‹ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ๋ฐ˜์˜๋œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๊ณผ์ •์ด ์—†๋‹ค๋Š”๊ฒŒ ์žฅ์ ์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋„์ปค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ธ ์ด์‹์„ฑ์ด ํ›ผ์†๋˜์–ด์„œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„์ปค ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๋Š”๊ฒŒ ๋” ๋‚˜์€ ํŒ๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

์‹ค์ œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•œ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

1. Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ

Jenkins ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜ธ์ŠคํŠธ์˜ Flutter ๋ฐ Android SDK ๊ฒฝ๋กœ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ–ˆ๋‹ค

sudo docker run \
  -d \
  -p 8080:8080 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /home/ec2-user/flutter:/home/ec2-user/flutter \
  -v /home/ec2-user/android-sdk:/home/ec2-user/android-sdk \
  jenkins/jenkins:lts

 

2. Jenkins Pipeline์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

Jenkins Pipeline์—์„œ Flutter์™€ Android SDK ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์•„๋ž˜์™€ ๊ฐ™์ด environment ๋ธ”๋ก์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค:

pipeline {
    agent any
    environment {
        PATH = "/home/ec2-user/flutter/bin:/home/ec2-user/android-sdk/tools:/home/ec2-user/android-sdk/platform-tools:$PATH"
    }
    stages {
        stage('Environment Check') {
            steps {
                sh 'flutter --version'
                sh 'adb --version'
            }
        }
        // ๊ธฐํƒ€ ์Šคํ…Œ์ด์ง€ ์ƒ๋žต
    }
}

 

 

3. Jenkins ์ปจํ…Œ์ด๋„ˆ์˜ ๊ถŒํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ

Flutter์™€ Android SDK๊ฐ€ Jenkins ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์ œ๋Œ€๋กœ ์ฝํžˆ๊ณ  ์“ฐ์ผ ์ˆ˜ ์žˆ๋„๋ก ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ์„ ์„ค์ •ํ•œ๋‹ค.

sudo chown -R 1000:1000 /home/ec2-user/flutter
sudo chown -R 1000:1000 /home/ec2-user/android-sdk

์—ฌ๊ธฐ์„œ 1000:1000์€ Jenkins Docker ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน ID์ด๋‹ค. ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ Jenkins๊ฐ€ ํŒŒ์ผ ์ ‘๊ทผ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

 

์œ„์™€๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ Jenkins Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ EC2 ๋กœ์ปฌ์˜ Flutter ๋ฐ Android SDK๋ฅผ ์ œ๋Œ€๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณผ๋ฅจ ๋งˆ์šดํŠธ์™€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค :)