ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿš€ ์‚ฌ๊ฑด์˜ ์ „๋ง

GitLab ์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— CI, ์ง€์†์  ํ†ตํ•ฉ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” YAML ํŒŒ์ผ .gitlab-ci.yml ์— ํ”„๋กœ์ ํŠธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋  ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•  ๋ช…๋ น์–ด๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Docker ๋ฅผ ์ด์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Gradle ๋กœ ๋นŒ๋“œํ•˜์—ฌ Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค.

์šฐ์„  ์ด์Šˆ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด YAML ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋Š” Dockerfile์„ ์‚ฌ์šฉํ•ด์„œ Docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊นƒ๋žฉ์˜ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•œ๋‹ค.

stages:
  - dockerbuild-push

package:
  image: docker:latest
  stage: dockerbuild-push
  services:
      - docker:dind
  before_script:
      - docker login registry.gitlab.com -u $GITLAB_USER -p $GITLAB_PW
  script:
      - echo $GITLAB_USER ๋กœ ๋กœ๊ทธ์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      - docker build -t registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME . 
      - docker push registry.gitlab.com/$GITLAB_USER/$PROJECT_NAME
  after_script:
      - docker logout

์ƒˆ ๋ธŒ๋žœ์น˜์— .gitlab-ci.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” $GITLAB_USER, $GITLAB_PW, $PROJECT_NAME ์˜ ๊ฐ’์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •์„ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

GITLAB_USER ๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ fy16sj ๋ฅผ ํ• ๋‹นํ–ˆ๋‹ค.

๐ŸŽƒ ์‚ฌ๊ฑด์˜ ๋ฐœ์ƒ

 

ํ•˜์ง€๋งŒ ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋  ๋•Œ GITLAB_USER ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

์ง€์ •ํ•ด์ค€ fy16sj ๊ฐ€ ์•„๋‹Œ ๋นˆ ๊ฐ’์ด ๋ถˆ๋Ÿฌ์™€์ง„๋‹ค

๐Ÿ”‘ ์‚ฌ๊ฑด์˜ ํ•ด๊ฒฐ

 

์ดํ›„ ํ•œ์ฐธ๋™์•ˆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ณ„๋„ ๋ธŒ๋žœ์น˜์—์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์ฐพ์•„๋ณด์•˜๊ณ , ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ๋Œ€๋ถ€๋ถ„์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋ณ„๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๋‚ด์šฉ์ด์—ˆ๋‹ค. ์ถœ์ฒ˜๋Š” ์•„๋ž˜ ๋ฐํ˜”๋‹ค.

 

๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์ฐพ์€ ๊ธ€. YAML ํŒŒ์ผ ์ƒ์„ฑ ์‹œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋งŒ๋“ค์–ด์„œ ๋ธŒ๋žœ์น˜ ๋ณ„๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์ด์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋„์›€์ด ๋˜๋Š” ๊ธ€์€ ์—†์—ˆ๊ณ , CI/CD ์˜ Settings ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ํƒญ์„ ๊ณ„์†ํ•ด์„œ ๋ณด๋˜ ์ค‘ ํ•œ ์ค„์— ๋ˆˆ์ด ๊ฐ”๋‹ค.

protected ์ƒํƒœ์˜ ๋ธŒ๋žœ์น˜์™€ ํƒœ๊ทธ๊ฐ€ ๋‹ฌ๋ฆฐ ๊ณณ์—์„œ ์‹คํ–‰๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์—๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋‚ด๋ณด๋‚ธ๋‹ค๊ณ  ์“ฐ์—ฌ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ protect ํ•˜๋„๋ก ์ฒดํฌํ•˜๋ฉด protected ์ƒํƒœ์˜ ๋ธŒ๋žœ์น˜์˜ ํŒŒ์ดํ”„๋ผ์ธ๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์„œ ํ˜„์žฌ ์œ ์ผํ•œ protected ์ƒํƒœ์ธ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋“ฑ๋กํ•œ ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ protect variable ์— ์ฒดํฌ๊ฐ€ ๋˜์–ด์žˆ์—ˆ๋‹ค.

protected ์ƒํƒœ์˜ ๋ธŒ๋žœ์น˜๋Š” main ํ•˜๋‚˜์ด๋‹ค.

 

์ฒดํฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋‚˜๋‹ˆ, ์ •์ƒ์ ์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ก  ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋‚ด์šฉ์„ ๋ณด๋‹ˆ, Dockerfile ์ด ๋ฌธ์ œ์˜€๋‹ค. "java" ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ–ˆ๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฑ์Šฌ๋ž˜์‰ฌ(\) ๊ฐ€ ๋งค ๋ฌธ์ž์—ด ๋’ค์— ๋ถ™๋„๋ก ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค. ๊ธฐ์กด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ Dockerfile ์—์„œ๋„ ๋ฐฑ์Šฌ๋ž˜์‰ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๋ชจ๋‘ ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ๋˜์–ด ์žˆ์—ˆ๋‹ค.

์™ผ์ชฝ์ด ํ˜„ ํ”„๋กœ์ ํŠธ, ์˜ค๋ฅธ์ชฝ์ด ๊ธฐ์กด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์˜ Dockerfile ENTRYPOINT ์ž‘์„ฑ ๋ชจ์Šต์ด๋‹ค.

๋„์–ด์“ฐ๊ธฐ ์ฐจ์ด๋งŒ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋‚˜๋Š” ๋ฌด์—‡์ด ์ž˜๋ชป๋œ์ง€ ์•Œ์ง€ ๋ชปํ•˜๊ฒ ์–ด์„œ ์šฐ์„  ๋ฐฑ์Šฌ๋ž˜์‰ฌ๋ฅผ ๋ชจ๋‘ ์ง€์šฐ๊ณ  push ํ›„ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ, ์ž‘๋™์ด ๋˜์—ˆ๋‹ค. ๋‚˜์ค‘์— ์•Œ๊ฒŒ ๋œ ์‚ฌ์‹ค์€ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋“ค์˜ Dockerfile ์—๋Š” "java" ๋ช…๋ น์–ด ์ „์—๋„ ๋ฐฑ์Šฌ๋ž˜์‰ฌ(\) escape character ๊ฐ€ ์žˆ์–ด์„œ newline character ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ๋‚˜์˜ ํ”„๋กœ์ ํŠธ์˜ Dockerfile ์€ "java" ์ „์— newline character ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•˜๋„๋ก ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด์—ˆ๋‹ค.

 

์ดํ›„์— ํ•œ ๊ฐ€์ง€ ๋” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ๋†€๋ž๊ฒŒ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด COPY --from= ์ดํ›„์— ๋„์–ด์“ฐ๊ธฐ์ธ whitespace ๊ฐ€ ์žˆ์–ด์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€๋‹ค. Dockerfile ์€ ๋„์–ด์“ฐ๊ธฐ๋‚˜ ์ค„๋ฐ”๊ฟˆ ํ•˜๋‚˜์—๋„ ์˜ˆ๋ฏผํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•˜์ž ๐Ÿ˜‚.

builder ์•ž์— ๋„์–ด์“ฐ๊ธฐ๊ฐ€ ๋˜์–ด ์žˆ๋‹ค.

๊ฒฐ๋ก 

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋œ ์ดํ›„ ํ•ด๊ฒฐ ์‹œ๊ฐ„์ด ์ง€์—ฐ๋œ ๊ฐ€์žฅ ํฐ ์›์ธ์€ ๊ผผ๊ผผํ•˜๊ฒŒ ๋‚ด๊ฐ€ ํ•œ ์ž‘์—…๋“ค์˜ ์„ธ๋ถ€์ ์ธ ์‚ฌํ•ญ๋“ค์„ ์‚ดํ”ผ์ง€ ์•Š์€ ๊ฒƒ์ด์—ˆ๋‹ค. ์ฒ˜์Œ์— ๋ชจ๋‘ ์„ธ์„ธํ•˜๊ฒŒ ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฒƒ์ด Best Practice ์ด๊ฒ ์ง€๋งŒ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ดํ›„์— ์‹œ๊ฐ„์„ ๋Œ๋ฆด ์ˆ˜๋Š” ์—†์œผ๋‹ˆ, ์ง€๋‚œ ์ƒํ™ฉ๋“ค์„ ๋˜์งš์–ด๋ณด๋ฉด์„œ ๋†“์นœ ๊ฒƒ์ด ์—†๋Š”์ง€ ์‚ดํŽด๋ณด๋Š” ์Šต๊ด€์„ ๊ฐ€์ ธ์•ผ๊ฒ ๋‹ค.

์ถœ์ฒ˜

https://forum.gitlab.com/t/use-variables-per-branch-in-gitlab/43685/2

 

Use variables per branch in gitlab

Hi, I think I have exactly the same issue here. In my case, our developers are using PHP (Laravel) in Kubernetes and the application uses a dotenv file for its configuration to find the mysql database, usernames, passwords etc. You can imagine that the ent

forum.gitlab.com

 

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ