Profile picture

[๋ฐฐํฌ ๊ฐ€์ด๋“œ] Github Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™”ํ•˜๊ธฐ (ํŒ€ ๋‹จ์œ„)

JaehyoJJAng2023๋…„ 11์›” 22์ผ

๐Ÿ“‹ Workflow ๊ตฌ์„ฑ๋„

image


โ—พ๏ธ ๋ฐฐํฌ ์ค€๋น„

1. ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

์ด์ „์— [Deploy] ๊ฐ€์ƒ์„œ๋ฒ„(Virtual Machine)์— node API ๋ฐฐํฌํ•˜๊ธฐ - AWS Lightsail ํ”„๋กœ์ ํŠธ์—์„œ ์ง„ํ–‰ํ–ˆ์—ˆ๋˜ express ์•ฑ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.


์šฐ์„  ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ ํ›„ "dev" ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์ž.

$ git checkout -b dev # dev ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ›„ dev ๋ธŒ๋žœ์น˜๋กœ checkout

$ git branch # branch ๋ชฉ๋ก ๋ฐ ํ˜„์žฌ checkout ๋˜์–ด์žˆ๋Š” ๋ธŒ๋žœ์น˜ ํ™•์ธ
* dev
  main

๊ทธ๋ฆฌ๊ณ  main ๋ธŒ๋žœ์น˜์—์„œ ๋ชจ๋“  ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ–ˆ์—ˆ๋Š”๋ฐ, ์ด์ œ๋Š” dev ๋ธŒ๋žœ์น˜์—์„œ ์ฝ”๋“œ ์ˆ˜์ •/์ถ”๊ฐ€ ๋“ฑ์„ ํ•  ๊ฒƒ์ด๋‹ค.

app/index.ts ํŒŒ์ผ์— ์•„๋ž˜์˜ console ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  main ๋ธŒ๋žœ์น˜๋กœ PR์„ ์š”์ฒญํ•˜์ž.

# app/index.ts

...
const startServer = async () => {
  console.log("trying to start server"); # ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„
  const client = redis.createClient({ url: REDIS_URL });
  await client.connect();
  ...
};
startServer();

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ณ  github์— dev ๋ธŒ๋žœ์น˜๋กœ pushํ•˜์ž.

$ git add .
$ git commit -m "[UPD] added starting messages"
$ git push -u origin dev

ํ”„๋กœ์ ํŠธ์˜ ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ ํ›„, dev ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธํ•˜์ž.
image
dev ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ dev ๋ธŒ๋žœ์น˜์˜ ์ˆ˜์ •/์ถ”๊ฐ€๋œ ์ฝ”๋“œ๋“ค์„ main ๋ธŒ๋žœ์น˜๋กœ Pull Request(PR)์„ ์š”์ฒญํ•ด์•ผํ•œ๋‹ค.
'Pull Request' ํƒญ์— ๋“ค์–ด๊ฐ„ ํ›„ 'New Pull Request'๋ฅผ ํด๋ฆญํ•˜์ž.
image


์•„๋ž˜์ฒ˜๋Ÿผ PR ๊ธฐ๋ก์ด ๋œจ๊ณ  ์ด๋ฒˆ PR์—์„œ ์–ด๋–ค ์ฝ”๋“œ๋“ค์ด ๋ณ€๊ฒฝ๋๋Š”์ง€ ์„ธ์„ธํ•˜๊ฒŒ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. compare์ธ ๋ธŒ๋žœ์น˜๋ฅผ 'dev'๋กœ ์žก์•„์ฃผ๊ณ  base ๋ธŒ๋žœ์น˜๋ฅผ 'main'์œผ๋กœ ์žก์•„์ฃผ์ž. Pull Request๋ฅผ ์š”์ฒญํ•จ์œผ๋กœ์จ dev ๋ธŒ๋žœ์น˜์˜ ์ˆ˜์ •์‚ฌํ•ญ ๋˜๋Š” ์ถ”๊ฐ€๋œ ์ฝ”๋“œ๋“ค์ด main ๋ธŒ๋žœ์น˜์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์›๋ณธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฃผ์ธ์ด ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
image
"create pull request"๋ฅผ ํด๋ฆญํ•˜์ž.


PR ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์–ผ ์ˆ˜์ •ํ•˜๊ณ  ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
image


๋กœ์ปฌ ํ„ฐ๋ฏธ๋„๋กœ ๋“ค์–ด๊ฐ€์„œ dev ๋ธŒ๋žœ์น˜์—์„œ main ๋ธŒ๋žœ์น˜ ๋‚ด์šฉ์„ ์ƒˆ๋กญ๊ฒŒ pull(code update) ํ•ด์ค€ ํ›„ push ํ•˜์ž.

$ git pull origin main
$ git push -u origin dev

2. Workflow ์ƒ์„ฑ

์ •์ƒ์ ์œผ๋กœ PR์ด ๋๊ณ , Merge Conflict๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ์˜ github actions workflow๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. image


2-1. workflow ์ž‘์„ฑ

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ์— .github/workflows/test.yaml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋„๋ก ํ•˜์ž.

$ mkdir -p .github/workflows
$ touch .github/workflows/test.yaml

ํ…Œ์ŠคํŠธ์šฉ workflow๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

name: test
on: pull_request

jobs:
    test_job:
      runs-on: ubuntu-22.04
      steps:
          - name: "1. Checkout repository"
            uses: actions/checkout@v3

          - name: "2. Node.js Setup"
            uses: actions/setup-node@v3
            with:
                node-version: "18"
          
          - name: "3. Install npm packages"
            run: npm ci
          
          - name: "4. Install and run redis-server"
            run: |
                sudo apt-get update -y
                sudo apt-get install -y redis-server
                redis-server --daemonize yes --requirepass test_env --port 6380

          - name: "5. Run test"
            run: npm run test

          - name: "6. test build"
            run: npm run build

๐Ÿ“Œ github actions ๋ฌธ๋ฒ•์€ ๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
๐Ÿ‘‰ https://jaehyojjang.dev/categories/github-action-basic


2-2. workflow ๋ฐฐํฌ

workflow ์ž‘์„ฑ์ด ๋‹ค ๋๋‚ฌ์œผ๋ฉด dev ๋ธŒ๋žœ์น˜์—์„œ commit & push ํ•˜๋ฉด ๋œ๋‹ค.

$ git add .
$ git commit -m "added test github actions workflow"
$ git push -u origin dev

main ๋ธŒ๋žœ์น˜๋กœ PR ์š”์ฒญ
image


main ๋ธŒ๋žœ์น˜๋กœ PR์„ ์š”์ฒญํ•˜๋‹ˆ ์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ workflow๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
image


2-3. ๋ฐฐํฌ ์ค‘ ์—๋Ÿฌ

ํ˜„์žฌ PR๋กœ ์ธํ•ด ์‹คํ–‰๋œ github actions trigger๊ฐ€ ๋ช‡ ๋ถ„์งธ ๋…ธ๋ž€์ƒ‰ ๋™๊ทธ๋ผ๋ฏธ์—์„œ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ  ์žˆ๋‹ค.
์ด๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ผ๋ถ€๋Ÿฌ ์˜๋„ํ•œ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ trigger๊ฐ€ fail์ด ์•„๋‹Œ ์ง„ํ–‰์ค‘์ธ ์ƒํƒœ๋กœ ๊ณ„์† ๋‚จ์•„์žˆ๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์˜€๋‹ค. gitbub actions์—์„œ ์ž์ฒด์ ์œผ๋กœ ๊ธด ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž„์•„์›ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ํ•ด๋‹น trigger๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค.
image
ํ˜„์žฌ PR์—์„œ ์‹คํ–‰๋œ trigger๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.


2-4. ๋ฐฐํฌ ์—๋Ÿฌ ํ•ด๊ฒฐ

๋จผ์ € pacakge.json์— ์•„๋ž˜์˜ ์ปค๋งจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

  "scripts": {
    ...
    "test:ci": "jest"
  }

image


workflows์˜ 5๋ฒˆ job์„ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜์ž.

# vim .github/workflows/test.yaml

...
          - name: "5. Run test"
            run: npm run test:ci
...

๋‹ค์‹œ ํ‘ธ์‹œํ•ด๋ณด์ž.

$ git add .
$ git commit -m "fixed test npm script"
$ git push -u origin dev

๋‹ค์‹œ PR์„ ์š”์ฒญํ•ด๋ณด๊ณ , github actions trigger๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋Š”์ง€ github์—์„œ ํ™•์ธํ•ด๋ณด์ž!
image
trigger๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด Merge๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


workflow๊ฐ€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.
image


์ด์ œ dev ๋ธŒ๋žœ์น˜๋Š” ์“ธ๋ชจ ์—†์–ด์กŒ์œผ๋‹ˆ Merge ํ›„ ์‚ญ์ œํ•˜๋„๋ก ํ•˜์ž.
image
"Delete branch" ํด๋ฆญ.


๋ฌผ๋ก  ํ„ฐ๋ฏธ๋„ ์ƒ์—์„œ๋„ dev ๋ธŒ๋žœ์น˜ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

$ git push --delete origin dev

๐Ÿ’ฟ ๋ฐฐํฌ

image


1. Github Secrets

Github Actions VM์—์„œ Lightsail ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ปฌ์—์„œ ๋งŒ๋“  github_id_rsa ๊ฐœ์ธ ํ‚ค๋ฅผ Github ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ Secrets ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋“ฑ๋กํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ Github Actions Workflows์—์„œ ์ƒ์„ฑ๋œ ๊ฐ€์ƒ๋จธ์‹ ์ด Lightsail ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

github_id_rsa ssh ํ‚ค ์ƒ์„ฑ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ƒ๋žตํ•˜์˜€๋Š”๋ฐ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ๋กœ์ปฌ ๋จธ์‹ ์— github_id_rsa ๋ผ๋Š” ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์˜€๊ณ  ๊ฐ™์ด ์ƒ์„ฑ๋œ public ํ‚ค๋Š” lightsail ์ธ์Šคํ„ด์Šค์˜ ~/.ssh/authorized_keys์— ๋“ฑ๋กํ•˜์˜€๋‹ค.

๐Ÿ“Œ SSH ํ„ฐ๋„๋ง์œผ๋กœ Lightsail ์ธ์Šคํ„ด์Šค ์ ‘์†ํ•˜๊ธฐ -> https://jaehyojjang.dev/linux/ssh-tunneling-to-lightsail/


๋กœ์ปฌ์˜ ~/.ssh/gitub_id_rsa ๊ฐœ์ธ ํ‚ค๋ฅผ cat ๋ช…๋ น์–ด๋กœ ์ถœ๋ ฅํ•ด๋ณด์ž.

$ cat ~/.ssh/github_id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbXXXXXXXX
.............
-----END OPENSSH PRIVATE KEY-----

์œ„ ํ‚ค๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  github ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ - Settings - Secrets and variables ํƒญ์œผ๋กœ ์ด๋™ํ•œ ํ›„ "New repository secret"์„ ํด๋ฆญํ•˜์—ฌ ํ•„์š”ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์ฃผ์ž.
image

  • SSH_KNOWN_HOST์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ์—์„œ ssh-keyscan ์„œ๋ฒ„_PUBLIC_IP_์ฃผ์†Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ถœ๋ ฅํ•œ ํ›„ ํ•ด๋‹น ๊ณต๊ฐœ ํ‚ค๋“ค์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋„ฃ์€ ๊ฒƒ์ด๋‹ค.
    • ssh-keyscan example.com : ssh-keyscan์€ SSH ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‚ค(public key)๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. SSH ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐํ•  ๋•Œ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„œ๋ฒ„ ์‹๋ณ„ ๋ฐ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ssh-keyscan์€ ์ง€์ •๋œ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ํ˜ธ์ŠคํŠธ ๋ชฉ๋ก์—์„œ SSH ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‚ค๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค๋“ค์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ssh-keyscan์€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ์„ ๋ชฉ์ ์œผ๋กœ ์„œ๋ฒ„์˜ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ์˜ known_hosts ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ์„œ๋ฒ„์— ๋Œ€ํ•œ ์‹ ๋ขฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(man-in-the-middle attack)์— ์ทจ์•ฝํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. workflow ์ž‘์„ฑ

  • ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ workflow๋ฅผ ์ž‘์„ฑํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

๊ทธ์ „์—, ์œ„์—์„œ test workflow ๋ฐฐํฌ ๋‹น์‹œ ๋ฐฐํฌํ•˜๊ณ ๋‚˜์„œ ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์žˆ๋˜ dev ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ–ˆ์—ˆ๋‹ค.
๋กœ์ปฌ์˜ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ์—์„œ๋„ dev ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค.

๋จผ์ € main ๋ธŒ๋žœ์น˜์—์„œ ํ˜„์žฌ ์ตœ์‹  ์ƒํƒœ์˜ ์ฝ”๋“œ๋ฅผ pull(update) ๋ฐ›๋„๋ก ํ•˜์ž.

git checkout main
git pull origin main

dev ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜์ž.

git branch -D dev

๋‹ค์‹œ dev ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์„œ ์•„๋ž˜ deploy.yaml์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

git checkout -b dev

.github/workflows/deploy.yaml

name: deploy

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-22.04
    steps:
      - name: "1. Set up SSH"
        run: |
          mkdir -p ~/.ssh/
          echo "${{ secrets.SSH_PRIVATE_KEY }}" | tee ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
      
      - name: "2. Set up Known hosts"
        run: |
          echo {% raw %} "${{ secrets.SSH_KNOWN_HOST }}" {% endraw %} | tee -a ~/.ssh/known_hosts
          chmod 644 ~/.ssh/known_hosts

      - name: "3. SSH and Deploy"
        run: |
          ssh -i ~/.ssh/id_rsa {% raw %} ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_PUBLIC_IP }} {% endraw %}" 
            cd express
            sudo bash scripts/kill-app.sh
            git pull
            npm install
            npm run build
            sudo nohup npm run start 1>/dev/null 2>&1 & npx wait-on http://localhost:4000
            "

2-1. workflow ๋ฐฐํฌ

workflow ์ž‘์„ฑ์ด ๋‹ค ๋๋‚ฌ์œผ๋ฉด dev ๋ธŒ๋žœ์น˜์—์„œ commit & push ํ•˜๋ฉด๋œ๋‹ค.

git add .
git commit -m "Created deploy.yaml github actions"
git push -u origin dev

main ๋ธŒ๋žœ์น˜๋กœ PR ์š”์ฒญ
image
ํ…Œ์ŠคํŠธ trigger๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผ๋˜์—ˆ์Œ.


dev ๋ธŒ๋žœ์น˜ ์ฝ”๋“œ๋ฅผ merge ํ•œ ๋’ค์— Actions ํƒญ์—์„œ ์ •์ƒ์ ์œผ๋กœ deploy trigger๊ฐ€ ๋™์ž‘ ํ•˜๋Š”์ง€ ํ™•์ธ


2-2 workflow ๋ฐฐํฌ ์—๋Ÿฌ

deploy trigger ๋™์ž‘ ์ค‘ "3. SSH and Deploy" job์ด ๊ณ„์† ์‹คํŒจํ•˜์˜€์Œ. image


SSH ์ ‘์†์ด ๋ง‰ํžŒ ๊ฑธ๋กœ ์ถ”์ธก์ด ๋˜๋Š”๋ฐ, deploy.yaml ํŒŒ์ผ ์ฝ”๋“œ์—๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์–ด๋ณด์ž„.

ํ•œ์ฐธ์„ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ '์•„์ฐจ' ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ Lightsail Networking์—์„œ 22๋ฒˆ ํฌํŠธ(SSH) ์ ‘์† ๋Œ€์—ญ์„ ๋‚ด PC ๊ณต์ธ IP ์™ธ์—๋Š” ๋ชจ๋‘ ๋ชป๋“ค์–ด๋„๋ก ๋ง‰์•„๋†จ์—ˆ์Œ!
image


๋ชจ๋“  IP ๋Œ€์—ญ ํ—ˆ์šฉ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ๋ฐฐํฌ๋จ!
image


2-3. main ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธํ•˜๊ธฐ

์œ„์—์„œ ์‹ค์Šต์„ ์ง„ํ–‰ํ•  ๋•Œ PR์—์„œ test trigger ๋™์ž‘ ์ค‘์— test trigger๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ merge๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋˜์–ด์žˆ์—ˆ๋‹ค.

์ด๋Š” ํ…Œ์ŠคํŠธ ๊ณผ์ •์—์„œ ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์Œ์—๋„ deploy๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ์• ๊ธฐ์ด๋ฏ€๋กœ ํ”„๋กœ๋•์…˜์˜ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜๋„ ์žˆ๋Š” ํฐ ๋ฌธ์ œ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ main ๋ธŒ๋žœ์น˜๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


๋จผ์ € ๊นƒํ—ˆ๋ธŒ ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ - Settings - Branches๋กœ ๋“ค์–ด๊ฐ€์„œ ์•„๋ž˜ 'Require a pull request before merging'์„ ์ฒดํฌํ•ด์ฃผ๋„๋ก ํ•˜์ž. ๋ฐฐํฌ ์‹œ PR์ด ํ•„์ˆ˜์ด๋ฉฐ ๊ฐ•์ œ๋กœ push๋ฅผ ๋ชปํ•˜๋„๋ก ๋ง‰์•„๋†“๋Š” ๊ฒƒ์ด๋‹ค.
image


๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ๋กœ๋Š” 'Require status checks to pass before merging'์„ ์ฒดํฌํ•œ ํ›„, test_job์„ ๋„ฃ์–ด์ฃผ๋„๋ก ํ•˜์ž.
test_job ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ํ†ต๊ณผํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” merge๋ฅผ ํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
image


Loading script...

ยฉ 2025, Built with Gatsby