Continuous Integration - μ§μμ μΈ ν΅ν©
κ°λ°μλ₯Ό μν μλν νλ‘μΈμ€λΌκ³ λ³Ό μ μμΌλ©°,
Code - Build - Test λ¨κ³μμ κΎν μ μλ€.
Code
: κ°λ°μκ° μ½λλ₯Ό μ격 μ½λ μ μ₯μμ pushνλ λ¨κ³
Build
: μ격 μ½λ μ μ₯μλ‘λΆν° μ½λλ₯Ό κ°μ Έμ μ λ ν
μ€νΈ ν λΉλνλ λ¨κ³
Test
: μ½λ λΉλμ κ²°κ³Όλ¬Όμ΄ λ€λ₯Έ μ»΄ν¬λνΈμ μ ν΅ν©λλ μ§ νμΈνλ κ³Όμ
Continuous Delivery - μ§μμ μΈ μλΉμ€ μ 곡
Continuous Deployment - μ§μμ μΈ λ°°ν¬
μ λ μ©μ΄λ μνΈ κ΅νμ μΌλ‘ μ¬μ©νλ©°,
Release - Deploy - Operate λ¨κ³μμ κΎν μ μλ€.
Release
: λ°°ν¬ κ°λ₯ν μννΈμ¨μ΄ ν¨ν€μ§λ₯Ό μμ±
Deploy
: νλ‘λΉμ λμ μ€ννκ³ μλΉμ€λ₯Ό μ¬μ©μμκ² λ
ΈμΆ(μ€μ§μ μΈ λ°°ν¬ λΆλΆ)
Operate
: μλΉμ€ νν©μ νμ
νκ³ μκΈΈ μ μλ λ¬Έμ λ₯Ό κ°μ§
μ§μμ λ°°ν¬μ κ²½μ°, μ½λ λ³κ²½λΆν° νλ‘λμ
μ λΉλ μ 곡κΉμ§
μλνλ ν
μ€νΈμ μ½λ λ°°ν¬ κ³Όμ μ ν¬ν¨νλ€. (ex. Github Page)
μλνλ₯Ό κΎνλ λΆλΆμ λ³΄ν΅ μ½λκ° λΉλλλ©΄μ μ΅μ’ μ μΌλ‘ λ°°ν¬κ° λλ λ¨κ³μ΄λ€. μ΄ λΆλΆμ μ§μμ μΈ ν΅ν© λ° λ°°ν¬λ₯Ό μνμ¬ μΌλ ¨μ μλν λ¨κ³λ‘ λ§λλλ°, μ΄κ²μ νμ΄νλΌμΈμ ꡬμΆνλ€κ³ νννλ€.
νμ΄νλΌμΈμλ λνμ μΌλ‘ μΈ κ°μ§ λ¨κ³κ° μ‘΄μ¬νλ€.
λ¨κ³ | μ€λͺ |
---|---|
1. Source λ¨κ³ | μ격 μ μ₯μμ κ΄λ¦¬λκ³ μλ μμ€ μ½λμ λ³κ²½ μ¬νμ΄ μΌμ΄λ κ²½μ°, μ΄λ₯Ό κ°μ§νκ³ λ€μ λ¨κ³λ‘ μ λ¬νλ μμ μ μννλ€. |
2. Build λ¨κ³ | Source λ¨κ³μμ μ λ¬λ°μ μ½λλ₯Ό μ»΄νμΌ, λΉλ, ν μ€νΈνμ¬ κ°κ³΅νλ€. λν Build λ¨κ³λ₯Ό κ±°μ³ μμ±λ κ²°κ³Όλ¬Όμ λ€μ λ¨κ³λ‘ μ λ¬νλ μμ μ μννλ€. |
3. Deploy λ¨κ³ | Build λ¨κ³λ‘λΆν° μ λ¬λ°μ κ²°κ³Όλ¬Όμ μ€μ μλΉμ€μ λ°μνλ μμ μ μννλ€. |
νμ΄νλΌμΈμ λ¨κ³λ νμμ λ°λΌ λ μΈλΆνλκ±°λ κ°μνλ μ μλ€.
(ν΄λΉ ν΄μ μκ°νλ μ
체μ λ°λΌ μ©μ΄λ₯Ό λ―Έλ¬νκ² λ€λ₯΄κ² μ¬μ©νκΈ°λ ν¨)
β λΉλ (μννΈμ¨μ΄ μ»΄νμΌ)
β ν
μ€νΈ (νΈνμ± λ° μ€λ₯ κ²μ¬)
β λ¦΄λ¦¬μ€ (λ²μ μ μ΄ μ μ₯μμ μ ν리μΌμ΄μ
μ
λ°μ΄νΈ)
β λ°°ν¬ (κ°λ°μμ νλ‘λμ
νκ²½μΌλ‘μ λ³ν)
β κ·μ μ€μ λ° μ ν¨μ± κ²μ¬
μ€λ¬΄μμλ μ΄λ¬ν λ°λ³΅μ μΈ κ³Όμ μ μλννμ¬ μ²λ¦¬νλ€.
μ΄λ κ² κ΅¬μΆλ νμ΄νλΌμΈμ μλμΌλ‘ νλ κ²λ³΄λ€ λ λΉ λ₯΄κ³ μμ μ μ΄λ©°
μκ°μ ν¨κ³Όμ μΌλ‘ μ€μ¬μ£Όκ³ CI/CD μΈνλΌμμ νΈνμ±κ³Ό ν¨μ¨μ±μ λμ¬μ€λ€.
Githubκ° κ³΅μμ μΌλ‘ μ 곡νλ λΉλ, ν
μ€νΈ λ° λ°°ν¬
νμ΄νλΌμΈμ μλνν μ μλ CI/CD νλ«νΌμ΄λ€.
λ ν¬μ§ν 리μμ Pull Request λ push κ°μ μ΄λ²€νΈλ₯Ό
νΈλ¦¬κ±°λ‘ GitHub μμ
μν¬νλ‘(Workflow)λ₯Ό ꡬμ±ν μ μλ€.
μν¬νλ‘μ°λ .yml νμΌλ‘ ꡬμ±λλ©°, ν
μ€νΈλ λ°°ν¬ λ±
κ°κ°μ κΈ°λ₯μ λν΄ μν¬νλ‘μ°λ₯Ό μ¬λ¬ κ° μμ±ν μ μλ€.
(μμ±λ μν¬νλ‘μ°λ λ³΄ν΅ .github/workflows λλ ν 리μ μμΉν¨)
βοΈμ°Έκ³ ) λΉκ³΅κ° λ ν¬μ§ν 리μ κ²½μ° Github Actionsκ° μλν λμ μ©λκ³Ό μκ°μ΄ μ νλμ΄μμΌλ©° κ³΅κ° λ ν¬μ§ν 리λ 무λ£λ‘ μ¬μ© κ°λ₯νλ€.
Yet Another Markup Language
μ¬λμ΄ μ½μ μ μλ λ°μ΄ν° μ§λ ¬ν μΈμ΄λ₯Ό μλ―Ένλ€.
YAMLμ μ¬λμ΄ μ½μ μ μκ³ μ΄ν΄νκΈ° μ½κ³
λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μ ν¨κ» μ¬μ©ν μλ μλ€.
μΌλ°μ μΌλ‘ μ€μ νμΌ(configure file λ±)μ μ¬μ©νκΈ°μ μ’λ€.
(ex. YAMLμ μ€μ λ‘ μ¬μ©νλ κ³³ - μΏ λ²λ€ν°μ€ λΌμ΄λΈλ¬λ¦¬)
#
: μ£Όμ
---
: λ¬Έμμ μμ (μ νμ¬ν)
...
: λ¬Έμμ λ (μ νμ¬ν)
--- #λ¬Έμ μμ
#μ΄ μ¬μ΄μ λ΄μ©μ΄ λ€μ΄κ°λ€.
... #λ¬Έμ λ
κΈ°λ³Έ νν
key: value
μ΄λ©°, :
λ€μμλ 무쑰건 곡백 λ¬Έμκ° μμΌ νλ€.
μλ£ν
int, string, boolean, 리μ€νΈ, 맀νμ μ§μνλ€.
#int(μ«μ)
int_type: 1
#string(λ¬Έμμ΄)
string_type: "1"
#blooean(μ°Έ/κ±°μ§)
boolean_true_type: true
boolean_false_type: false
#μ΄μΈμ yes, noλ‘ μμ±νκΈ°λ νλ€.
yaml_easy: yes
yaml_difficult: no
#리μ€νΈ(λ°°μ΄ νν)
person:
name: Kim
job: Developer
skills:
- docker
- kubernetes
# JSON νμμ "skill" : [docker, kubernetes]μ κ°λ€.
κ°μ²΄
key:
key: value
key: value
#λλ μ΄λ κ²λ μμ±νλ€.(κ°λ
μ±μ μν΄ μ¬μ©)
key: {
key: value,
key: value
}
Text
|
: μ€λ°κΏ νν
>
: μ€λ°κΏ 무μ νν
# |λ μ€λ°κΏ
# JSON νμμ "comment_line_break": "Hello world.\nIm Tata.\n"κ³Ό κ°λ€.
comment_line_break: |
Hello world.
Im Tata.
# >λ μ€λ°κΏ 무μ
# JSON νμμ "comment_single_line": "Hello world my first coding."κ³Ό κ°λ€.
comment_single_line: >
Hello world
my first coding.
λ¬Έμμ΄ λ°μ΄ν
# key-value μμμ valueμ :κ° λ€μ΄κ° κ²½μ°λ λ°λμ λ°μ΄νκ° νμνλ€.
# errorκ° λλ€.
windows_drive: c:
# μ΄λ κ² μ¨μΌ νλ€.
windows_drive: "c:"
windows_drive: 'c:'
JSON νμΌ | YAML νμΌ | |
---|---|---|
μμ± νμ | κ° key-value μμ "{}" μμ μμ± | κ° key-value μμ "{}" μμ΄ μμ± κ°λ₯ |
κ³μΈ΅ ꡬ쑰 | μ€κ΄νΈ "{ }"λ‘ κ°μΈμ§ key-value μλ€μ μ€μ²© κ³μΈ΅ ꡬ쑰λ₯Ό κ°μ§ | λ€μ¬μ°κΈ°λ‘ key-value μλ€μ μ€μ²© κ³μΈ΅ ꡬ쑰λ₯Ό λνλ |
μ£Όμ μμ± | μ£Όμ μμ± λΆκ°λ₯ | μ£Όμ μμ± κ°λ₯ |
νΈνμ± | YAMLμ JSONμ μμ νΈν 격μ΄λ―λ‘, JSON λ¬Έμλ₯Ό κ·Έλλ‘ μ¬μ© κ°λ₯ | κΈ°μ‘΄ JSON λ¬Έμλ₯Ό κ·Έλλ‘ YAML λ¬Έμλ‘ μ¬μ© κ°λ₯νλ©°, μνΈ λ³νμ΄ κ°λ₯ |
# YAML
name: Bare Minimum Requirements
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3 # μ€ννλ μμ
μ ν => κΉνμ 릴리μ¦λ λ²μ
- name: Bare Minimum Requirements #μμ
λ¨κ³
uses: actions/setup-node@v3 #λ
Έλ λ²μ μΈν
νλ λΆλΆ
with:
node-version: '16'
- run: npm install
- run: npm test
-------
# JSON
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
}
]
}
μ°μ , AWSμμ λ°κΈ λ°μ ν€λ₯Ό λ±λ‘ν΄μ€λ€.
.githubμ workflow ν΄λ μμ cient.yml νμΌμ μμ±ν λ€, μλ μ½λλ₯Ό μΆκ°νλ€.
name: client # workflow μ΄λ¦
on: # μΈμ μλν κ²μΈκ°
push: # pushκ° λλ©΄
branches: # μ΄λ€ λΈλμΉμμ?
- main # main λΈλμΉμμ
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source code.
uses: actions/checkout@v3
- name: Install dependencies
run: npm install # install λͺ
λ Ήμ΄
working-directory: ./my-agora-states-client # λλ ν 리 μμΉ μ€μ
- name: Build
run: npm run build # build λͺ
λ Ήμ΄
working-directory: ./my-agora-states-client # λλ ν 리 μμΉ μ€μ
- name: SHOW AWS CLI VERSION
run: |
aws --version
- name: Sync Bucket
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_EC2_METADATA_DISABLED: true
run: | # cd: λͺ¨λ νμΌμ 볡μ¬νκΈ° λλ¬Έμ νμΌμ΄ μ΄λ―Έ μ‘΄μ¬νλ κ²½μ°μλ κ·Έ νμΌμ 볡μ¬
aws s3 sync \ # sync: νμΌμ 볡μ¬νκΈ° μ μ κ²½λ‘λ₯Ό νμΈνκ³ μ νμΌκ³Ό μ
λ°μ΄νΈ λ νμΌλ§ 볡μ¬
--region ap-northeast-2 \
build s3://λ²ν·μ΄λ¦ \
--delete
working-directory: ./my-agora-states-client # λλ ν 리 μμΉ μ€μ
μ΄μ λΈλμΉ μ΄λ¦μ λ§κ² push ν΄μ£Όλ©΄ λλ€.
git push myRepo main