[λ„€νŠΈμ›Œν¬] πŸ”—CI / CD와 Github Actions μ‚¬μš©λ²•

TATAΒ·2023λ…„ 4μ›” 3일
0

GitHub

λͺ©λ‘ 보기
5/5

β–· CI

Continuous Integration - 지속적인 톡합

개발자λ₯Ό μœ„ν•œ μžλ™ν™” ν”„λ‘œμ„ΈμŠ€λΌκ³  λ³Ό 수 있으며,
Code - Build - Test λ‹¨κ³„μ—μ„œ κΎ€ν•  수 μžˆλ‹€.

Code : κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό 원격 μ½”λ“œ μ €μž₯μ†Œμ— pushν•˜λŠ” 단계
Build : 원격 μ½”λ“œ μ €μž₯μ†Œλ‘œλΆ€ν„° μ½”λ“œλ₯Ό 가져와 μœ λ‹› ν…ŒμŠ€νŠΈ ν›„ λΉŒλ“œν•˜λŠ” 단계
Test : μ½”λ“œ λΉŒλ“œμ˜ 결과물이 λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ™€ 잘 ν†΅ν•©λ˜λŠ” 지 ν™•μΈν•˜λŠ” κ³Όμ •

β–· CD

Continuous Delivery - 지속적인 μ„œλΉ„μŠ€ 제곡
Continuous Deployment - 지속적인 배포

μœ„ 두 μš©μ–΄λŠ” μƒν˜Έ κ΅ν™˜μ μœΌλ‘œ μ‚¬μš©ν•˜λ©°,
Release - Deploy - Operate λ‹¨κ³„μ—μ„œ κΎ€ν•  수 μžˆλ‹€.

Release : 배포 κ°€λŠ₯ν•œ μ†Œν”„νŠΈμ›¨μ–΄ νŒ¨ν‚€μ§€λ₯Ό μž‘μ„±
Deploy : ν”„λ‘œλΉ„μ €λ‹μ„ μ‹€ν–‰ν•˜κ³  μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœ(μ‹€μ§ˆμ μΈ 배포 λΆ€λΆ„)
Operate : μ„œλΉ„μŠ€ ν˜„ν™©μ„ νŒŒμ•…ν•˜κ³  생길 수 μžˆλŠ” 문제λ₯Ό 감지

지속적 배포의 경우, μ½”λ“œ λ³€κ²½λΆ€ν„° ν”„λ‘œλ•μ…˜μ— λΉŒλ“œ μ œκ³΅κΉŒμ§€
μžλ™ν™”λœ ν…ŒμŠ€νŠΈμ™€ μ½”λ“œ 배포 과정을 ν¬ν•¨ν•œλ‹€. (ex. Github Page)


πŸ”— νŒŒμ΄ν”„ 라인

μžλ™ν™”λ₯Ό κΎ€ν•˜λŠ” 뢀뢄은 보톡 μ½”λ“œκ°€ λΉŒλ“œλ˜λ©΄μ„œ μ΅œμ’…μ μœΌλ‘œ 배포가 λ˜λŠ” 단계이닀. 이 뢀뢄을 지속적인 톡합 및 배포λ₯Ό μœ„ν•˜μ—¬ 일련의 μžλ™ν™” λ‹¨κ³„λ‘œ λ§Œλ“œλŠ”λ°, 이것을 νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μΆ•ν•œλ‹€κ³  ν‘œν˜„ν•œλ‹€.

νŒŒμ΄ν”„λΌμΈμ—λŠ” λŒ€ν‘œμ μœΌλ‘œ μ„Έ 가지 단계가 μ‘΄μž¬ν•œλ‹€.

단계섀λͺ…
1. Source 단계원격 μ €μž₯μ†Œμ— κ΄€λ¦¬λ˜κ³  μžˆλŠ” μ†ŒμŠ€ μ½”λ“œμ— λ³€κ²½ 사항이 일어날 경우, 이λ₯Ό κ°μ§€ν•˜κ³  λ‹€μŒ λ‹¨κ³„λ‘œ μ „λ‹¬ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
2. Build 단계Source λ‹¨κ³„μ—μ„œ 전달받은 μ½”λ“œλ₯Ό 컴파일, λΉŒλ“œ, ν…ŒμŠ€νŠΈν•˜μ—¬ κ°€κ³΅ν•œλ‹€. λ˜ν•œ Build 단계λ₯Ό 거쳐 μƒμ„±λœ 결과물을 λ‹€μŒ λ‹¨κ³„λ‘œ μ „λ‹¬ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
3. Deploy 단계Build λ‹¨κ³„λ‘œλΆ€ν„° 전달받은 결과물을 μ‹€μ œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

νŒŒμ΄ν”„λΌμΈμ˜ λ‹¨κ³„λŠ” ν•„μš”μ— 따라 더 μ„ΈλΆ„ν™”λ˜κ±°λ‚˜ κ°„μ†Œν™”λ  수 μžˆλ‹€.
(ν•΄λ‹Ή νˆ΄μ„ μ†Œκ°œν•˜λŠ” 업체에 따라 μš©μ–΄λ₯Ό λ―Έλ¬˜ν•˜κ²Œ λ‹€λ₯΄κ²Œ μ‚¬μš©ν•˜κΈ°λ„ 함)


πŸ”— CI/CD νŒŒμ΄ν”„λΌμΈ ꡬ성 μš”μ†Œ 및 μž₯점

βˆ’ λΉŒλ“œ (μ†Œν”„νŠΈμ›¨μ–΄ 컴파일)
βˆ’ ν…ŒμŠ€νŠΈ (ν˜Έν™˜μ„± 및 였λ₯˜ 검사)
βˆ’ 릴리슀 (버전 μ œμ–΄ μ €μž₯μ†Œμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ—…λ°μ΄νŠΈ)
βˆ’ 배포 (κ°œλ°œμ—μ„œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μœΌλ‘œμ˜ λ³€ν™˜)
βˆ’ κ·œμ • μ€€μˆ˜ 및 μœ νš¨μ„± 검사

μ‹€λ¬΄μ—μ„œλŠ” μ΄λŸ¬ν•œ 반볡적인 과정을 μžλ™ν™”ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€.

μ΄λ ‡κ²Œ κ΅¬μΆ•λœ νŒŒμ΄ν”„λΌμΈμ€ μˆ˜λ™μœΌλ‘œ ν•˜λŠ” 것보닀 더 λΉ λ₯΄κ³  μ•ˆμ •μ μ΄λ©°
μ‹œκ°„μ„ 효과적으둜 쀄여주고 CI/CD μΈν”„λΌμ™€μ˜ ν˜Έν™˜μ„±κ³Ό νš¨μœ¨μ„±μ„ λ†’μ—¬μ€€λ‹€.


β–· Github Actions

Githubκ°€ κ³΅μ‹μ μœΌλ‘œ μ œκ³΅ν•˜λŠ” λΉŒλ“œ, ν…ŒμŠ€νŠΈ 및 배포
νŒŒμ΄ν”„λΌμΈμ„ μžλ™ν™”ν•  수 μžˆλŠ” CI/CD ν”Œλž«νΌ
이닀.

λ ˆν¬μ§€ν† λ¦¬μ—μ„œ Pull Request λ‚˜ push 같은 이벀트λ₯Ό
트리거둜 GitHub μž‘μ—… μ›Œν¬ν”Œλ‘œ(Workflow)λ₯Ό ꡬ성할 수 μžˆλ‹€.

μ›Œν¬ν”Œλ‘œμš°λŠ” .yml 파일둜 κ΅¬μ„±λ˜λ©°, ν…ŒμŠ€νŠΈλ‚˜ 배포 λ“±
각각의 κΈ°λŠ₯에 λŒ€ν•΄ μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ—¬λŸ¬ 개 생성할 수 μžˆλ‹€.
(μƒμ„±λœ μ›Œν¬ν”Œλ‘œμš°λŠ” 보톡 .github/workflows 디렉토리에 μœ„μΉ˜ν•¨)

❗️참고) λΉ„κ³΅κ°œ λ ˆν¬μ§€ν† λ¦¬μ˜ 경우 Github Actionsκ°€ μž‘λ™ν•  λ•Œμ˜ μš©λŸ‰κ³Ό μ‹œκ°„μ΄ μ œν•œλ˜μ–΄μžˆμœΌλ©° 곡개 λ ˆν¬μ§€ν† λ¦¬λŠ” 무료둜 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.


πŸ”— YAML

Yet Another Markup Language

μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” 데이터 직렬화 μ–Έμ–΄λ₯Ό μ˜λ―Έν•œλ‹€.

YAML은 μ‚¬λžŒμ΄ 읽을 수 있고 μ΄ν•΄ν•˜κΈ° 쉽고
λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° 언어와 ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

일반적으둜 μ„€μ • 파일(configure file λ“±)에 μ‚¬μš©ν•˜κΈ°μ— μ’‹λ‹€.
(ex. YAML을 μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” κ³³ - μΏ λ²„λ„€ν‹°μŠ€ 라이브러리)


πŸ”— 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 vs YAML

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"
      ]
    }
  ]
}

β–· Github Actions μ‚¬μš©λ²•

μš°μ„ , 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



πŸ‘‰ Github Actions κ³΅μ‹λ¬Έμ„œ

profile
🐾

0개의 λŒ“κΈ€