Post

[CI/CD] HyperCloud CICD Operator + Tekton Pipeline Controller ์™„์ „ ์ •๋ฆฌ

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” HyperCloud์˜ CICD Operator๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. IntegrationConfig(IC) ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ์‹œํ•˜๋‹ค๊ฐ€, Git ์ด๋ฒคํŠธ๊ฐ€ ์˜ค๋ฉด Tekton PipelineRun์„ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Operator๋‹ค. IC โ†’ PipelineRun โ†’ TaskRun โ†’ Pod๋กœ ์ด์–ด์ง€๋Š” ์ž๋™ํ™” ๊ณ„์ธต์„ ๋”ฐ๋ผ๊ฐ„๋‹ค.

CICD Operator๋ž€? IntegrationConfig๋ฅผ ๊ฐ์‹œํ•ด Git ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ Tekton PipelineRun์„ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” Operator. GitLab Webhook ๋“ฑ๋ก, SecretยทpodTemplate ์ฃผ์ž…, ํ™˜๊ฒฝ ๋ณ€์ˆ˜(CI_*) ์ถ”๊ฐ€๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋น„์œ  โ€” IntegrationConfig = ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„๋„, CICD Operator = ์„ค๊ณ„๋„๋ฅผ ๋ณด๊ณ  ์ž๋™์œผ๋กœ ๊ณต์žฅ(PipelineRun)์„ ๊ฐ€๋™์‹œํ‚ค๋Š” ๊ด€๋ฆฌ์ž.


1. ์ž๋™ ์ƒ์„ฑ ๊ณ„์ธต ๊ตฌ์กฐ

์‚ฌ์šฉ์ž๋Š” IC์™€ Task๋งŒ ์ž‘์„ฑํ•˜๊ณ , ๋‚˜๋จธ์ง€(PipelineRunโ†’TaskRunโ†’Pod)๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋“ค์ด ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค.

flowchart TD
    IC["IntegrationConfig<br/>(์‚ฌ์šฉ์ž ์ž‘์„ฑ)"] -- "Git Push/Tag" --> Op["CICD Operator"]
    Op -- ์ž๋™ ์ƒ์„ฑ --> PR["PipelineRun<br/>(jobs ๋ณ€ํ™˜ยทpodTemplateยทSecretยทCI_*)"]
    PR --> TR["TaskRun<br/>(Tekton Pipeline Controller)"]
    TR --> Pod["Pod<br/>(Tekton TaskRun Controller)"]

OwnerReference๋กœ cascade ์‚ญ์ œ:

1
IC ์‚ญ์ œ โ†’ PipelineRun ์‚ญ์ œ โ†’ TaskRun ์‚ญ์ œ โ†’ Pod ์‚ญ์ œ

๐Ÿ’ก OwnerReference ๋•๋ถ„์— IC ํ•˜๋‚˜๋งŒ ์ง€์šฐ๋ฉด ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ „๋ถ€ ์ •๋ฆฌ๋œ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค๋ฉด PipelineRunยทPod๋ฅผ ๋”ฐ๋กœ ์ง€์›Œ์•ผ ํ•˜์ง€๋งŒ, Operator๊ฐ€ ์†Œ์œ  ๊ด€๊ณ„๋ฅผ ๊ฑธ์–ด๋‘์–ด ์ตœ์ƒ์œ„(IC)๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.


2. ์‹คํ–‰ ํ๋ฆ„ 5๋‹จ๊ณ„

โ‘  IntegrationConfig ์ž‘์„ฑ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: cicd.tmax.io/v1
kind: IntegrationConfig
metadata:
  name: aic-src-lata-shs-ic05
spec:
  git:
    repository: aic/src/aic-src-lata-shs
    apiUrl: https://gitlab.example.com/api/v4
  jobs:
    postSubmit:                       # Tag Push ์ด๋ฒคํŠธ ์‹œ
      - name: build-image
        tektonTask: {taskRef: {name: build-image-prd}}
        when:
          branch: (0|1|2|3|4|5|6|7|8|9)*   # ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํƒœ๊ทธ๋งŒ
  secrets:
    - name: shg-harbor-cicdmgr-sec-aic
  podTemplate:
    nodeSelector: {node: aicmgp}
    tolerations:
      - {key: node, value: aicmgp, effect: NoSchedule}

โ‘ก Operator๊ฐ€ Webhook ์ž๋™ ๋“ฑ๋ก

IC ์ƒ์„ฑ์„ ๊ฐ์ง€ โ†’ git.repository ์ถ”์ถœ โ†’ GitLab API๋กœ Webhook ๋“ฑ๋ก(pushยทtag_pushยทmerge_request).

โ‘ข Git ์ด๋ฒคํŠธ โ†’ โ‘ฃ PipelineRun ์ž๋™ ์ƒ์„ฑ

git push origin 1.0.0 โ†’ GitLab์ด Webhook ์ „์†ก โ†’ Operator๊ฐ€ IC์˜ jobs๋ฅผ tasks๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  podTemplateยทSecretยทํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•œ PipelineRun ์ƒ์„ฑ.

โ‘ค Tekton์ด TaskRun โ†’ Pod ์ƒ์„ฑ

PipelineRun์˜ ์„ค์ •(nodeSelectorยทtolerationsยทimagePullSecrets)์ด ํ•˜์œ„๋กœ ์ƒ์†๋˜์–ด ์ตœ์ข… Pod์— ๋ฐ˜์˜๋œ๋‹ค.


3. ์ฃผ์š” ์ž๋™ํ™” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ์„ค๋ช…
Webhook ์ž๋™ ๊ด€๋ฆฌIC ์ƒ์„ฑ ์‹œ ๋“ฑ๋ก, ์‚ญ์ œ ์‹œ ํ•ด์ œ
์กฐ๊ฑด๋ถ€ ์‹คํ–‰(when)๋ธŒ๋žœ์น˜/ํƒœ๊ทธ ํŒจํ„ด ๋งค์นญ(์ •๊ทœ์‹)
Secret ์ž๋™ ์ฃผ์ž…imagePullSecrets + Volume ๋งˆ์šดํŠธ
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฃผ์ž…CI_SERVER_URLยทCI_REPOSITORYยทCI_HEAD_REFยทCI_COMMIT_SHA

์กฐ๊ฑด๋ถ€ ์‹คํ–‰ ์˜ˆ์‹œ:

1
2
3
4
5
6
7
jobs:
  preSubmit:                   # MR ์‹œ
    - name: test
      when: {branch: (dev|stg).*}
  postSubmit:                  # Tag Push ์‹œ
    - name: deploy
      when: {branch: (0|1|2|3|4|5|6|7|8|9)*}

๐Ÿ’ก preSubmit(MR ๊ฒ€์ฆ) vs postSubmit(๋จธ์ง€/ํƒœ๊ทธ ํ›„ ๋ฐฐํฌ)๋กœ ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆˆ๋‹ค. when์˜ ์ •๊ทœ์‹์œผ๋กœ โ€œdev/stg ๋ธŒ๋žœ์น˜๋Š” ํ…Œ์ŠคํŠธ๋งŒโ€, โ€œ์ˆซ์ž ํƒœ๊ทธ๋Š” ๋ฐฐํฌโ€์ฒ˜๋Ÿผ ์ด๋ฒคํŠธ๋ณ„ ์‹คํ–‰์„ ์ •๊ตํ•˜๊ฒŒ ์ œ์–ดํ•œ๋‹ค.


4. CICD Operator vs ์ˆ˜๋™

ํ•ญ๋ชฉCICD Operator์ˆ˜๋™ PipelineRun
PipelineRun ์ƒ์„ฑ์ž๋™(Git ์ด๋ฒคํŠธ)kubectl apply
Webhook์ž๋™ ๋“ฑ๋ก/ํ•ด์ œ์ˆ˜๋™
Secret/ํ™˜๊ฒฝ๋ณ€์ˆ˜์ž๋™ ์ฃผ์ž…์ˆ˜๋™ ์ž‘์„ฑ
์กฐ๊ฑด๋ถ€ ์‹คํ–‰when ์ž๋™ ํ‰๊ฐ€๋ถˆ๊ฐ€
์žฌ์‚ฌ์šฉ์„ฑIC ํ•˜๋‚˜๋กœ ๋ฌดํ•œ๋งค๋ฒˆ ์ž‘์„ฑ

5. ํ™•์ธ & ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

1
2
3
4
kubectl get ic -n shg-cicd-aic                              # IntegrationConfig
kubectl get pr -n shg-cicd-aic -l cicd.tmax.io/integration-config=<ic>  # PipelineRun
kubectl get tr -n shg-cicd-aic -l tekton.dev/pipelineRun=<pr>          # TaskRun
kubectl logs -n cicd-system deploy/cicd-operator -f        # Operator ๋กœ๊ทธ

โš ๏ธ Webhook์€ ์™”๋Š”๋ฐ PipelineRun์ด ์•ˆ ์ƒ๊ธฐ๋ฉด when ์กฐ๊ฑด(๋ธŒ๋žœ์น˜/ํƒœ๊ทธ ํŒจํ„ด)์ด ์•ˆ ๋งž์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. kubectl get ic <ic> -o yaml | grep -A3 when์œผ๋กœ ํŒจํ„ด์„ ํ™•์ธํ•˜์ž. Secret ๋งˆ์šดํŠธ ์‹คํŒจยท๋…ธ๋“œ ์˜ค๋ฐฐ์น˜๋Š” ๊ฐ๊ฐ Secret ์กด์žฌ ์—ฌ๋ถ€์™€ podTemplate ๋ฐ˜์˜์„ ์ ๊ฒ€ํ•œ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
CICD Operator
โ”œโ”€ ์—ญํ•    IC ๊ฐ์‹œ โ†’ PipelineRun ์ž๋™ ์ƒ์„ฑ
โ”œโ”€ ๊ณ„์ธต   IC โ†’ PipelineRun โ†’ TaskRun โ†’ Pod(OwnerRef cascade)
โ”œโ”€ ์ž๋™ํ™” WebhookยทSecretยทํ™˜๊ฒฝ๋ณ€์ˆ˜ยทpodTemplate ์ฃผ์ž…
โ””โ”€ ์กฐ๊ฑด   when(์ •๊ทœ์‹)์œผ๋กœ ์ด๋ฒคํŠธ๋ณ„ ์‹คํ–‰ ์ œ์–ด
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
IntegrationConfigํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„๋„
CICD OperatorIC โ†’ PipelineRun ๋ณ€ํ™˜๊ธฐ
OwnerReference๊ณ„์ธต cascade ์‚ญ์ œ

CICD Operator์˜ ํ•ต์‹ฌ์€ ์‚ฌ์šฉ์ž๊ฐ€ IC๋งŒ ์ž‘์„ฑํ•˜๋ฉด, Webhook๋ถ€ํ„ฐ Pod ์‹คํ–‰๊นŒ์ง€ ์ „๋ถ€ ์ž๋™ํ™”๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Git ์ด๋ฒคํŠธ โ†’ PipelineRun โ†’ TaskRun โ†’ Pod์˜ ๊ณ„์ธต์„ ์ดํ•ดํ•˜๋ฉด, ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์–ด๋А ๋‹จ๊ณ„๋ฅผ ๋ด์•ผ ํ• ์ง€ ๋ช…ํ™•ํ•ด์ง„๋‹ค.


๐Ÿ”— ์ฐธ๊ณ 

  • HyperCloud ์ „์šฉ Operator(Tmax ๊ฐœ๋ฐœ). ์˜คํ”ˆ์†Œ์Šค ๋Œ€์•ˆ์€ ArgoCD Events + Tekton Triggers.
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.