νμ¬ νμ¬μμλ GitHub Actionsλ₯Ό ν΅ν΄ Docker μ΄λ―Έμ§λ₯Ό λ§λ€κ³ λ°°ν¬νκ³ μμ΅λλ€.
νμ§λ§ μ κ° ν©λ₯νκΈ° μ΄μ μ μ¬μ©νκ³ μμλ λ°°ν¬ μν¬νλ‘μ°μλ μ½κ°μ λ¬Έμ κ° μμλλ°, μ΄λ₯Ό κ°μ ν νκΈ°λ₯Ό μ μ΄ λ³΄λ € ν©λλ€.
λ°°κ²½
νμ¬ μ ν¬ λ°±μλ μμ€ μ½λλ λ¨μΌ μ μ₯μμ μ¬λ¬ κ°μ ν΄λκ° μκ³ , κ°κ°μ ν΄λκ° Kubernetes μμμ λ 립λ μλ²λ‘ ꡬλλλλ‘ λλμ΄ μμ΅λλ€. μ΄λ€μ λ 립μ μΌλ‘ λ°°ν¬νκΈ° μν΄, κΈ°μ‘΄μλ μ½λ λ³κ²½μ΄ μΌμ΄λ¬μ λ κ²½λ‘λ₯Ό κ°μ§ν΄μ κ΄λ ¨ νμΌμ΄ λ³κ²½λ κ²½μ°μλ§ κ°κ°μ μν¬νλ‘μ°κ° μλλλλ‘ μ€μ λμ΄ μμμ΅λλ€.
μλ₯Ό λ€λ©΄, μ΄λ¬ν νμΌμ΄ μ¬λ¬ κ° μλ κ²μ΄μ£ .
name: foo app Actions
on:
push:
branches:
# ...
paths:
- 'apps/foo/**/*'
- 'common/**/*'
jobs:
build-and-push-image:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
# ...
(Build... Push...)
- name: Checkout manifest repository
# ...
- name: Change deployment.yaml
# ...
- name: Pushes to the repository
# ...
μ΄λ κ² μ¬μ©ν κ²½μ° μ½λ λ³κ²½μ μν₯μ λ°λ μλ²λ§ μ νμ μΌλ‘ λΉλκ° κ°λ₯νκ³ , κ°κ°μ κ³Όμ μ΄ λ³λ ¬ μ€νμ΄ λλ μ₯μ μ΄ μμ΅λλ€. νμ§λ§ μν¬νλ‘μ°μ λ§μ§λ§ λΆλΆμ μ΄λ―Έμ§ νκ·Έ μ λ°μ΄νΈλ₯Ό μν΄ Git Pushλ₯Ό νλλ°, μ΄ μμ μ΄ κ²ΉμΉλ©΄ μΆ©λλ‘ μΈν΄ μλ¬κ° λ°μνκ³ , μ€ν¨ν μν¬νλ‘μ°λ₯Ό λ€μ μλμΌλ‘ λλ €μΌ νλ λ¬Έμ κ° μμμ΅λλ€.

κ·Έλμ κ°μ λ μν¬νλ‘μ°μμλ μ νμ λΉλμ λ³λ ¬μ±μ΄λΌλ μ₯μ μ κ°μ Έκ°λ©΄μ, Git Pushμμμ μλ¬λ₯Ό μμ λ κ²μ΄ μ£Όλ λͺ©μ μ΄μμ΅λλ€.
μλ‘μ΄ GitHub Actions λ§λ€κΈ°
μ¬μ¬μ© μν¬νλ‘μ°
μ¬μ μ κ°κ°μ μν¬νλ‘μ°λ€μ μ΄ν΄λ³΄μμ λ, λ³μ λͺ κ°λ§ μ€μ νλ€λ©΄ μ¬μ¬μ©μ΄ κ°λ₯ν΄ λ³΄μμ΅λλ€. μν¬νλ‘μ°λ₯Ό μ¬μ¬μ©νλ λ²μλ ν¬κ² λ κ°μ§κ° μλλ°, νλλ λ³λμ μ μ₯μμ μν¬νλ‘μ°λ₯Ό ꡬμ±νλ κ²μ΄κ³ λ€λ₯Έ νλλ μ μ₯μ λ΄μ νμΌμ λκ³ μ°Έμ‘°νμ¬ μ¬μ©νλ κ²μ λλ€. μ μμ κ²½μ°κ° νμ₯μ± λ©΄μμ λ λ°μ΄λμ§λ§, μ¬κΈ°μλ νλμ μ μ₯μμμλ§ μ¬μ©νλ©΄ λκΈ° λλ¬Έμ νμλ₯Ό μ ννμ΅λλ€.
곡ν΅μΌλ‘ μ¬μ©ν νμΌμ λλ΅μ μΈ ννλ λ€μκ³Ό κ°μ΅λλ€.
on:
workflow_call:
inputs:
module-name:
required: true
type: string
registry:
required: true
type: string
outputs:
image-tag:
description: Docker image tag
branch:
description: Branch name
secrets:
# ...
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
# ...
(Build... Push...)
- name: Checkout manifest repository
# ...
- name: Change deployment.yaml
# ...
- run: |
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
git switch -c manifest-${{ inputs.module-name }}
git add .
git commit -m "Update ${{ inputs.module-name }} deployment.yaml"
git push origin manifest-${{ inputs.module-name }}
μ¬κΈ°μ λ·λΆλΆμ΄ μ΄μ§ λ€λ₯Έλ°, κ·Έ μ΄μ λ μ΄μ΄μ μ λλ‘ νκ² μ΅λλ€.
λ©μΈ μν¬νλ‘μ°
μ΄μ μμ κ³΅ν΅ μν¬νλ‘μ°λ₯Ό νμ©ν΄ μ 체 λ°°ν¬ νλ‘μΈμ€λ₯Ό ꡬνν΄μΌ ν©λλ€.
ν΅μ¬ μμ΄λμ΄λ 3κ°μ§μμ΅λλ€.
-
μ νμ λΉλλ₯Ό μν νν°λ§
μ‘°κ±΄μ΄ μλ€λ©΄ μ΄λ€ νμΌμ λ³κ²½ν΄λ μ 체 λΉλκ° λ€ λμκ° ν λ, νν°λ§μ ν΄ μ€ νμκ° μμμ΅λλ€.
λ€νν dorny/paths-filter λΌλ μν¬νλ‘μ°λ₯Ό μ°Ύμκ³ , μ΄λ€ λͺ¨λμ΄ λ³κ²½λμλμ§ νλ¨ν μ μμμ΅λλ€. -
λ³λ ¬ μ²λ¦¬λ₯Ό μν Matrix Strategy
λμΌν μν¬νλ‘μ°λ₯Ό μ¬λ¬ λ³μλ₯Ό μ λ ₯νμ¬ μ€ννκΈ° μν΄ Matrix Strategyλ₯Ό μ¬μ©νμ΅λλ€. κΈ°λ³Έμ μΌλ‘ λ³λ ¬λ‘ μ€νλκΈ° λλ¬Έμ λͺ©μ μλ λΆν©νκ³ , μΌλΆ μ€μ μ 쑰건λΆλ‘ μ μΈνλ κ²λ κ°λ₯ν΄μ μμμ μ»μ νν° κ°μ ν΅ν΄ λΉλν λμμ μ§μ ν μ μμμ΅λλ€. μ¬λ¬ κ°μ λ³μλ₯Ό μ μνκ³ μ΄λ₯Ό μ‘°ν©νμ¬ μ¬μ©νλ κ²λ κ°λ₯νμ§λ§, μ λ 1κ°μ λ³μλ§ νμν΄μ κ·Έλ κ² νμ§ μμμ΅λλ€.
-
Git Push μΆ©λ λ°©μ§νκΈ°
μ΄ λΆλΆμ΄ κ°μ₯ κ³ λ―Όμ λ§μ΄ νλ λΆλΆμ΄μμ΅λλ€. μΌλ°μ μΈ λ°©λ²μΌλ‘λ λ³λ ¬ νλ‘μΈμ€μμ κ°κ° μ½λ λ³κ²½μ νμ κ²½μ° μΆ©λμ νΌνκΈ° μ΄λ €μ 보μμ΅λλ€. κ·Έλμ μκ°ν λ°©λ²μ κ°κ°μ μν¬νλ‘μ°μμ λΈλμΉλ₯Ό νλμ© λ§λ€μ΄ λ³κ²½μ¬νμ μ μ₯νκ³ , λ§μ§λ§μ μ΄λ₯Ό λͺ¨λ ν©μΉλ κ²μ΄μμ΅λλ€. μ΄ ν©μΉλ λ¨κ³λ Matrix Strategyκ° μ€μ λ λ¨κ³κ° μλ£λ ν μ§νλλλ‘ νμ¬ νμν κ³Όμ μ΄ λͺ¨λ μ€νλμμμ 보μ₯νλλ‘ νκ³ , μμμ ꡬν νν° μ‘°κ±΄μ κΈ°λ°μΌλ‘ μμ±λ λΈλμΉλ₯Ό ν©μ³€μ΅λλ€.
μμ±λ μ΅μ’ λ©μΈ μν¬νλ‘μ°μ ννλ λ€μκ³Ό κ°μ΅λλ€.
name: μ 체 Workflow
on:
push:
branches:
# ...
paths:
- "apps/**/*"
- "common/**/*"
jobs:
get-filter:
runs-on: ubuntu-latest
outputs:
foo: ${{ steps.filter.outputs.foo }}
bar: ${{ steps.filter.outputs.bar }}
# ...
steps:
- uses: actions/checkout@v2
- uses: dorny/paths-filter@v2
id: filter
with:
base: ${{ github.ref }}
filters: |
...
ci-cd:
permissions:
contents: read
packages: write
needs: [get-filter]
strategy:
matrix:
module:
- foo
- bar
# ...
exclude:
- module: ${{ needs.get-filter.outputs.foo != 'true' && 'foo' }}
- module: ${{ needs.get-filter.outputs.bar != 'true' && 'bar' }}
# ...
uses: ./.github/workflows/common_workflow.yml
with:
module-name: ${{ matrix.module }}
registry: ghcr.io
secrets: inherit
push-manifest:
runs-on: ubuntu-latest
needs: [get-filter, ci-cd]
steps:
- name: Checkout manifest repository
# ...
- run: |
git fetch origin
git branch -a
git checkout main
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
- name: Merge foo branch
if: needs.get-filter.outputs.foo == 'true'
- name: Merge bar branch
if: needs.get-filter.outputs.bar == 'true'
# ...
- name: Push to main branch
# ...
νκΈ°

λͺ κ°μ§ μνμ°©μ€λ₯Ό λ κ±°μ³μ, νμ¬λ μΆ©λΆν ν μ€νΈκ° μλ£λμκ³ μ΄μ νκ²½μμλ μ μ μν¬νλ‘μ°λ₯Ό μ¬μ©νκ³ μμ΅λλ€. νμλ€μ λ°μλ κ½€λ μ’μμ΅λλ€.

λ€λ§ μ΄λ² λ¬ μ΄ GitHub Actions μ¬μ©λ νλλ₯Ό λͺ¨λ μ¬μ©ν΄μ, μ μ λ°°ν¬λ₯Ό λ©μΆκ² λ μμν μ΄μκ° μμμ΅λλ€. μ무리 μκ°ν΄λ μ μ§λΆμ΄ μ’ μλ κ² κ°λ€μ π
νμ¬ μ λ³΄κ° λ€μ΄ μκΈ° λλ¬Έμ λͺ¨λ μ½λλ₯Ό 곡κ°ν μλ μμ§λ§, κΆκΈνμ μ μ μ΅λν λ΅ν΄ λλ¦¬κ² μ΅λλ€ :)