{"id":1724,"date":"2026-07-01T09:58:32","date_gmt":"2026-07-01T09:58:32","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=1724"},"modified":"2026-08-31T07:32:50","modified_gmt":"2026-08-31T07:32:50","slug":"github-actions-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=1724","title":{"rendered":"GitHub Actions \ud575\uc2ec \uc815\ub9ac"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">GitHub Actions\ub294 GitHub Repository\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \uae30\uc900\uc73c\ub85c <strong>\ube4c\ub4dc, \ud14c\uc2a4\ud2b8, \ubc30\ud3ec \uac19\uc740 \uc791\uc5c5\uc744 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ud558\ub294 CI\/CD \ud50c\ub7ab\ud3fc<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucf54\ub4dc\ub97c <code>push<\/code>\ud558\uac70\ub098 Pull Request\ub97c \uc0dd\uc131\ud588\uc744 \ub54c \uc790\ub3d9\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uac70\ub098, <code>main<\/code>\uc5d0 Merge\ub418\uba74 \uc11c\ubc84\uc5d0 \ubc30\ud3ec\ud558\ub294 \uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Git \uc790\uccb4\uac00 \ucf54\ub4dc\uc758 \ubcc0\uacbd \uc774\ub825\uc744 \uad00\ub9ac\ud55c\ub2e4\uba74 GitHub Actions\ub294 <strong>\uadf8 \ubcc0\uacbd\uc744 \ud2b8\ub9ac\uac70\ub85c \uc2e4\uc81c \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub294 \uc790\ub3d9\ud654 \uc2dc\uc2a4\ud15c<\/strong>\uc774\ub77c\uace0 \ubcf4\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Git -&gt; \ucf54\ub4dc \ubcc0\uacbd \uad00\ub9ac\nGitHub -&gt; Repository + \ud611\uc5c5\nGitHub Actions -&gt; Repository \uc774\ubca4\ud2b8 \uae30\ubc18 \uc791\uc5c5 \uc790\ub3d9 \uc2e4\ud589<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uac1c\ubc1c -&gt; Commit -&gt; Push -&gt; GitHub -&gt; GitHub Actions -&gt; Build -&gt; Test -&gt; Deploy<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub Actions\uc758 \uae30\ubcf8 \uad6c\uc870<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub294 <code>.github\/workflows<\/code> \ub514\ub809\ud130\ub9ac\uc5d0 Workflow \ud30c\uc77c\uc744 \uc791\uc131\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \uad6c\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Project -&gt; .github -&gt; workflows -&gt; ci.yml \/ deploy.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\ub294 YAML \ud30c\uc77c\ub85c \uc791\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac04\ub2e8\ud55c \uc608\uc2dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: CI\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\/checkout@v4\n\n      - name: Build\n        run: .\/build.sh\n\n      - name: Test\n        run: .\/test.sh<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\uccb4\uc801\uc778 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc774\ud574\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Workflow -&gt; Event \/ Job \/ Runner \/ Steps -&gt; Action \/ Command<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\ub97c \uc774\ud574\ud558\ub294 \uac83\uc774 GitHub Actions\uc758 \ucd9c\ubc1c\uc810\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\ub294 \uc790\ub3d9\ud654 \uc791\uc5c5 \ud558\ub098\uc758 \uc804\uccb4 \uc815\uc758\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 CI Workflow\ub294<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CI Workflow -&gt; \ucf54\ub4dc \uac80\uc0ac -&gt; Build -&gt; Test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Deploy Workflow\ub294<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Deploy Workflow -&gt; Build -&gt; Docker Image \uc0dd\uc131 -&gt; \uc11c\ubc84 \ubc30\ud3ec<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\ub098\uc758 Repository\uc5d0 \uc5ec\ub7ec Workflow\ub97c \ub458 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.github\/workflows -&gt; ci.yml \/ deploy.yml \/ release.yml \/ nightly.yml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 Workflow\ub294 \uc11c\ub85c \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Event<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\ub97c \uc5b8\uc81c \uc2e4\ud589\ud560\uc9c0\ub97c \uc815\uc758\ud558\ub294 \uac83\uc774 <code>on<\/code>\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Push\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \uc2e4\ud589\ud558\ub824\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>on:\n  push:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pull Request\uac00 \uc0dd\uc131\ub418\uac70\ub098 \uc5c5\ub370\uc774\ud2b8\ub420 \ub54c \uc2e4\ud589\ud558\ub824\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>on:\n  pull_request:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branch\ub3c4 \uc81c\ud55c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>on:\n  push:\n    branches:\n      - main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74 <code>main<\/code> Branch\uc5d0 Push\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c\ub9cc \uc2e4\ud589\ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub\uc758 Event\uc640 \uc5f0\uacb0\ub41c\ub2e4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\uac00 \uac15\ub825\ud55c \uc774\uc720\ub294 Repository\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ub2e4\uc591\ud55c \uc774\ubca4\ud2b8\ub97c \uc790\ub3d9\ud654\uc758 \uc2dc\uc791\uc810\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 Event\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>push \/ pull_request \/ issues \/ workflow_dispatch \/ schedule \/ release \/ workflow_call<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 PR\uc774 \uc62c\ub77c\uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uac1c\ubc1c\uc790 -&gt; Pull Request -&gt; GitHub Event -&gt; GitHub Actions -&gt; Build + Test<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Job<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Job\uc740 Workflow \uc548\uc5d0\uc11c \uc2e4\ud589\ud560 \uc791\uc5c5 \ub2e8\uc704\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 CI\uc5d0\uc11c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Workflow -&gt; Build \/ Test \/ Lint<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01\uac01\uc744 Job\uc73c\ub85c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jobs:\n  build:\n    ...\n\n  test:\n    ...\n\n  lint:\n    ...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Job \uc0ac\uc774\uc5d0 \uc758\uc874\uad00\uacc4\ub97c \uc9c0\uc815\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jobs:\n  build:\n    ...\n\n  test:\n    needs: build\n    ...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc2e4\ud589\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>build -&gt; test<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Job \uc548\uc5d0\uc11c \uc2e4\uc81c\ub85c \uc2e4\ud589\ud560 \uc791\uc5c5\uc744 \uc815\uc758\ud558\ub294 \uac83\uc774 Step\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v4\n\n      - name: Install\n        run: npm install\n\n      - name: Build\n        run: npm run build\n\n      - name: Test\n        run: npm test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Step\uc740 \ud06c\uac8c \ub450 \uac00\uc9c0 \ubc29\uc2dd\uc73c\ub85c \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uses -&gt; \ub2e4\ub978 \uc0ac\ub78c\uc774 \ub9cc\ub4e4\uc5b4 \ub193\uc740 Action \uc0ac\uc6a9\nrun -&gt; \uc9c1\uc811 \uba85\ub839\uc5b4 \uc2e4\ud589<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Action<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Action\uc740 \ud2b9\uc815 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc9c4 \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc790\ub3d9\ud654 \uad6c\uc131\uc694\uc18c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc73c\ub85c Repository\uc758 \ucf54\ub4dc\ub97c Runner\ub85c \uac00\uc838\uc624\ub294 \ub370 \uc0ac\uc6a9\ud558\ub294<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- uses: actions\/checkout@v4<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \ud658\uacbd\uc744 \uad6c\uc131\ud560 \ub54c\ub294<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- uses: actions\/setup-node@v4\n  with:\n    node-version: 22<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 Action\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c1\uc811 \ubaa8\ub4e0 \ud658\uacbd \uc124\uc815\uc744 \uc791\uc131\ud560 \ud544\uc694 \uc5c6\uc774 \uc774\ubbf8 \ub9cc\ub4e4\uc5b4\uc9c4 Action\uc744 \uac00\uc838\uc640 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc774 \uc7a5\uc810\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Runner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\uac00 \uc2e4\uc81c\ub85c \uc2e4\ud589\ub418\ub294 \ucef4\ud4e8\ud130\uac00 Runner\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub -&gt; Runner -&gt; Checkout \/ Build \/ Test \/ Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 Hosted Runner\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uace0, \uc9c1\uc811 \uad00\ub9ac\ud558\ub294 Self-hosted Runner\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \ud658\uacbd\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Runner OS -&gt; Ubuntu \/ Windows \/ macOS<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>runs-on: ubuntu-latest<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub77c\uace0 \ud558\uba74 GitHub\uac00 \uc81c\uacf5\ud558\ub294 Ubuntu \ud658\uacbd\uc5d0\uc11c Job\uc744 \uc2e4\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub-hosted Runner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00\uc7a5 \uac04\ub2e8\ud55c \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>runs-on: ubuntu-latest<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc9c0\uc815\ud558\uba74 GitHub\uac00 \uc2e4\ud589 \ud658\uacbd\uc744 \uc900\ube44\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ubc1c\uc790\uac00 \ubcc4\ub3c4\uc758 \uc11c\ubc84\ub97c \uad00\ub9ac\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\uccb4\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Workflow -&gt; GitHub -&gt; Runner \uc0dd\uc131 -&gt; Job \uc2e4\ud589 -&gt; Runner \uc885\ub8cc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CI \uc6a9\ub3c4\ub85c\ub294 \uc774\ub7f0 \ubc29\uc2dd\uc774 \uc0c1\ub2f9\ud788 \ud3b8\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Self-hosted Runner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9c1\uc811 \uad00\ub9ac\ud558\ub294 \uc11c\ubc84\ub098 PC\ub97c Runner\ub85c \ub4f1\ub85d\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub -&gt; Self-hosted Runner -&gt; \ub0b4 \uc11c\ubc84 \/ \uc0ac\ub0b4 \uc11c\ubc84<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\uc815 \ud558\ub4dc\uc6e8\uc5b4\ub098 \uc0ac\ub0b4 \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc811\uadfc\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uac1c\ubc1c\uc5d0\uc11c\ub3c4 \uc0c1\ud669\uc5d0 \ub530\ub77c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud2b9\uc815 Windows \ud658\uacbd\uc5d0\uc11c\ub9cc \uac00\ub2a5\ud55c \ube4c\ub4dc \uc791\uc5c5\uc774\ub098 \uc0ac\ub0b4 \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc811\uadfc\ud574\uc57c \ud558\ub294 \ube4c\ub4dc \uc2dc\uc2a4\ud15c \ub4f1\uc744 Self-hosted Runner\uc5d0\uc11c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc Runner \uc790\uccb4\ub97c \uc9c1\uc811 \uad00\ub9ac\ud574\uc57c \ud558\uae30 \ub54c\ubb38\uc5d0 \ubcf4\uc548\uacfc \uc720\uc9c0\ubcf4\uc218 \ubd80\ub2f4\uc774 \uc99d\uac00\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">CI<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub97c \uac00\uc7a5 \uba3c\uc800 \uc0ac\uc6a9\ud558\ub294 \ubaa9\uc801 \uc911 \ud558\ub098\uac00 CI\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CI\ub294 Continuous Integration\uc758 \uc57d\uc790\ub85c, \uac1c\ubc1c\uc790\uac00 \ucf54\ub4dc\ub97c Repository\uc5d0 \ud1b5\ud569\ud560 \ub54c\ub9c8\ub2e4 \uc790\ub3d9\uc73c\ub85c \ube4c\ub4dc\uc640 \ud14c\uc2a4\ud2b8 \ub4f1\uc744 \uc218\ud589\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Feature Branch -&gt; Pull Request -&gt; GitHub Actions -&gt; Build \/ Unit Test \/ Integration Test \/ Lint -&gt; \uacb0\uacfc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">PR\uc744 Merge\ud558\uae30 \uc804\uc5d0 \uc790\ub3d9\uc73c\ub85c \ucf54\ub4dc\ub97c \uac80\uc99d\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">PR \uac80\uc99d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c \ud2b9\ud788 \uc720\uc6a9\ud55c \ud615\ud0dc\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name: CI\n\non:\n  pull_request:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\/checkout@v4\n\n      - uses: actions\/setup-node@v4\n        with:\n          node-version: 22\n\n      - run: npm ci\n      - run: npm test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ubc1c\uc790\uac00 PR\uc744 \ub9cc\ub4e4\uba74 \ub2e4\uc74c \uacfc\uc815\uc774 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PR \uc0dd\uc131 -&gt; Actions \uc2e4\ud589 -&gt; Checkout -&gt; \uc758\uc874\uc131 \uc124\uce58 -&gt; Test -&gt; \uc131\uacf5 \/ \uc2e4\ud328<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uacb0\uacfc\uac00 PR\uc5d0 \ud45c\uc2dc\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branch Protection\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud558\uba74 <strong>CI\uac00 \ud1b5\uacfc\ud574\uc57c Merge\ud560 \uc218 \uc788\ub3c4\ub85d \uac15\uc81c<\/strong>\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">CD<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub294 \ubc30\ud3ec \uc790\ub3d9\ud654\uc5d0\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CD\ub294 Continuous Delivery \ub610\ub294 Continuous Deployment\ub97c \uc758\ubbf8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main Merge -&gt; GitHub Actions -&gt; Build -&gt; Docker Image -&gt; Registry Push -&gt; Server Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 Pipeline\uc744 \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc11c\ubc84\ub77c\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main Merge -&gt; \uc11c\ubc84 \ube4c\ub4dc -&gt; Docker Image \uc0dd\uc131 -&gt; Registry Push -&gt; \uc11c\ubc84 \uc5c5\ub370\uc774\ud2b8 -&gt; \uc11c\ube44\uc2a4 \uc7ac\uc2dc\uc791<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 Workflow\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Secrets<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CI\/CD\uc5d0\uc11c\ub294 \uc11c\ubc84 \ube44\ubc00\ubc88\ud638\ub098 API Key \uac19\uc740 \ubbfc\uac10\ud55c \uc815\ubcf4\uac00 \ud544\uc694\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc774\ub7f0 \uac12\uc744 YAML\uc5d0 \uc9c1\uc811 \uc791\uc131\ud558\uba74 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>run: deploy --token=MY_SECRET_TOKEN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\uc5d0\uc11c\ub294 Secrets\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Repository -&gt; Secrets -&gt; AWS_ACCESS_KEY \/ DATABASE_PASSWORD \/ DEPLOY_TOKEN<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>env:\n  DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74 \ubbfc\uac10\ud55c \uac12\uc744 Repository \ucf54\ub4dc\uc5d0 \uc9c1\uc811 \uc800\uc7a5\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Variables\uc640 Secrets<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\ub458\uc740 \ube44\uc2b7\ud574 \ubcf4\uc774\uc9c0\ub9cc \ubaa9\uc801\uc774 \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Variables -&gt; \uc77c\ubc18\uc801\uc778 \uc124\uc815\uac12\nSecrets -&gt; \uacf5\uac1c\ub418\uba74 \uc548 \ub418\ub294 \ubbfc\uac10\ud55c \uac12<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Variables -&gt; ENVIRONMENT=production \/ REGION=ap-northeast-2\nSecrets -&gt; API_KEY=... \/ DATABASE_PASSWORD=...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 \uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Environment<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Production\uacfc Development \uac19\uc740 \ubc30\ud3ec \ud658\uacbd\uc744 \ubd84\ub9ac\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Environment -&gt; Development \/ Staging \/ Production<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 Environment\uc5d0 \ubcc4\ub3c4\uc758 Secret\uc774\ub098 \uc2b9\uc778 \uc815\ucc45\uc744 \uc124\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 Production \ubc30\ud3ec\uc5d0\ub294 \uad00\ub9ac\uc790 \uc2b9\uc778\uc744 \uc694\uad6c\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main Merge -&gt; Build -&gt; Production Deploy \uc694\uccad -&gt; \uc2b9\uc778 -&gt; Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b4\uc601 \uc11c\ubc84\uc5d0 \ubc14\ub85c \ubc30\ud3ec\ub418\ub294 \uac83\uc744 \ub9c9\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Matrix<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 \ud14c\uc2a4\ud2b8\ub97c \uc5ec\ub7ec \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 Matrix\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc5ec\ub7ec Node.js \ubc84\uc804\uc744 \ud14c\uc2a4\ud2b8\ud558\ub824\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>strategy:\n  matrix:\n    node-version: &#91;20, 22, 24]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc124\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node 20 -&gt; Test\nNode 22 -&gt; Test\nNode 24 -&gt; Test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub97c \ubcd1\ub82c\ub85c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b4\uc601\uccb4\uc81c\ub3c4 Matrix\ub85c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>strategy:\n  matrix:\n    os: &#91;ubuntu-latest, windows-latest, macos-latest]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Ubuntu -&gt; Test\nWindows -&gt; Test\nmacOS -&gt; Test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc5ec\ub7ec \ud658\uacbd\uc5d0\uc11c \ub3d9\uc77c\ud55c \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Job \uc758\uc874\uc131<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Job\uc740 \uc11c\ub85c \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2e4\ud589\ud560 \uc218 \uc788\uc9c0\ub9cc \ud2b9\uc815 Job\uc774 \ub05d\ub09c \ub4a4 \ub2e4\uc74c Job\uc744 \uc2e4\ud589\ud558\ub3c4\ub85d \ub9cc\ub4e4 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jobs:\n  build:\n    ...\n\n  test:\n    needs: build\n    ...\n\n  deploy:\n    needs: test<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>build -&gt; test -&gt; deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c Build\uac00 \uc2e4\ud328\ud558\uba74 Test\uc640 Deploy\ub3c4 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CI\/CD Pipeline\uc744 \uad6c\uc131\ud560 \ub54c \uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ubcd1\ub82c \uc2e4\ud589<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ub85c \uad00\uacc4\uac00 \uc5c6\ub294 \uc791\uc5c5\uc740 \ubcd1\ub82c\ub85c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build -&gt; Unit Test \/ Lint -&gt; Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c Unit Test\uc640 Lint\uac00 \uc11c\ub85c \uc758\uc874\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \ub458\uc744 \ubcd1\ub82c\ub85c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build -&gt; Unit Test\nBuild -&gt; Lint\nUnit Test \/ Lint -&gt; Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd88\ud544\uc694\ud558\uac8c \ubaa8\ub4e0 \uc791\uc5c5\uc744 \uc21c\ucc28\uc801\uc73c\ub85c \uc2e4\ud589\ud558\uba74 Pipeline\uc774 \ub290\ub824\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\uc5d0\uc11c\ub294 Job \uc758\uc874\uc131\uc744 \uc801\uc808\ud788 \uc124\uacc4\ud574\uc11c \ub3c5\ub9bd\uc801\uc778 \uc791\uc5c5\uc744 \ubcd1\ub82c\ud654\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Artifact<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\uc5d0\uc11c \uc0dd\uc131\ub41c \ud30c\uc77c\uc744 \ub2e4\uc74c Job\uc774\ub098 \uc774\ud6c4 \uc2e4\ud589\uc5d0\uc11c \uc0ac\uc6a9\ud574\uc57c \ud558\ub294 \uacbd\uc6b0 Artifact\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build Job -&gt; game-server.zip -&gt; Artifact -&gt; Deploy Job<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ube4c\ub4dc \uacb0\uacfc\ubb3c\uc744 \uc800\uc7a5\ud558\uace0 \ub2e4\uc74c \ub2e8\uacc4\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uac1c\ubc1c\uc774\ub77c\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build -&gt; Windows Build \/ Linux Server Build \/ Asset Bundle -&gt; Artifact<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 \uacb0\uacfc\ubb3c\uc744 \uad00\ub9ac\ud558\ub294 \ubc29\uc2dd\ub3c4 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Cache<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\ube4c\ub4dc\ub098 \uc758\uc874\uc131 \uc124\uce58\uc5d0\ub294 \ubc18\ubcf5\uc801\uc73c\ub85c \uac19\uc740 \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub294 \uc791\uc5c5\uc774 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 Node.js \ud504\ub85c\uc81d\ud2b8\ub77c\uba74 \ud328\ud0a4\uc9c0 Cache\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uccab \uc2e4\ud589 -&gt; Dependency \ub2e4\uc6b4\ub85c\ub4dc -&gt; Cache \uc800\uc7a5\n\ub2e4\uc74c \uc2e4\ud589 -&gt; Cache \uc0ac\uc6a9 -&gt; Build<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CI \uc2e4\ud589 \uc2dc\uac04\uc744 \uc904\uc774\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc Cache\ub294 \uacb0\uacfc\ubb3c\uc744 \uc601\uad6c\uc801\uc73c\ub85c \ubcf4\uad00\ud558\ub294 \uc800\uc7a5\uc18c\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc911\uac04 \ub370\uc774\ud130\ub97c \ube60\ub974\uac8c \uac00\uc838\uc624\uae30 \uc704\ud55c \uc6a9\ub3c4<\/strong>\ub85c \ubcf4\ub294 \ud3b8\uc774 \ub9de\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Workflow Dispatch<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Push\ub098 PR \uac19\uc740 \uc774\ubca4\ud2b8\uac00 \uc5c6\uc5b4\ub3c4 \uc0ac\ub78c\uc774 \uc9c1\uc811 Workflow\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>on:\n  workflow_dispatch:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74 GitHub Actions \ud654\uba74\uc5d0\uc11c \uc9c1\uc811 \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc30\ud3ec Workflow\ub97c \uc608\ub85c \ub4e4\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub Actions -&gt; Deploy Workflow -&gt; Staging \/ Production<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc0ac\ub78c\uc774 \uc6d0\ud558\ub294 \uc2dc\uc810\uc5d0 \uc2e4\ud589\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc218\ub3d9 \ubc30\ud3ec\ub098 \uc6b4\uc601 \uc791\uc5c5\uc5d0\uc11c \uc720\uc6a9\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Schedule<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc815\ud574\uc9c4 \uc2dc\uac04\uc5d0 Workflow\ub97c \uc2e4\ud589\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cron \ud615\uc2dd\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>on:\n  schedule:\n    - cron: \"0 0 * * *\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ub9e4\uc77c -&gt; \ub370\uc774\ud130 \uac80\uc0ac -&gt; \ud14c\uc2a4\ud2b8 -&gt; Report \uc0dd\uc131<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 \uc790\ub3d9\ud654\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nightly Build \uac19\uc740 \uc791\uc5c5\ub3c4 \uc774\ub7f0 \ubc29\uc2dd\uc73c\ub85c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uc870\uac74\ubb38<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\uc815 \uc870\uac74\uc5d0\uc11c\ub9cc Step\uc774\ub098 Job\uc744 \uc2e4\ud589\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if: github.ref == 'refs\/heads\/main'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pull Request -&gt; Test\nmain Merge -&gt; Test -&gt; Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc870\uac74\uc744 \ub098\ub20c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CI\uc640 CD\ub97c \ud558\ub098\uc758 Workflow\uc5d0 \uad6c\uc131\ud560 \ub54c \ud2b9\ud788 \uc720\uc6a9\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">GitHub Actions\uc640 Docker<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub294 Docker\uc640 \uac19\uc774 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 Docker Image\ub85c \ube4c\ub4dc\ud55c\ub2e4\uace0 \ud558\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Push -&gt; GitHub Actions -&gt; Docker Build -&gt; Docker Image -&gt; Container Registry -&gt; Server<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Workflow\uac00 Docker Image\ub97c \ub9cc\ub4e4\uace0 Registry\uc5d0 Push\ud55c \ub4a4 \uc11c\ubc84\uac00 \uc0c8\ub85c\uc6b4 Image\ub97c \uac00\uc838\uc624\ub3c4\ub85d \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud558\uba74 \uac1c\ubc1c\uc790\uc758 \ub85c\uceec \ud658\uacbd\uacfc \uc11c\ubc84 \ud658\uacbd\uc744 \uc77c\uc815\ud558\uac8c \uc720\uc9c0\ud558\uae30 \uc27d\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">GitHub Actions\uc640 Cloud<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">AWS, Azure, Google Cloud \uac19\uc740 Cloud \ud658\uacbd\uacfc\ub3c4 \uc5f0\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub -&gt; GitHub Actions -&gt; AWS -&gt; EC2 \/ ECS \/ ECR \/ Lambda<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc GitHub Actions\uac00 Cloud \uc790\uccb4\ub97c \ub300\uccb4\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ed\ud560\uc774 \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub Actions -&gt; \uc790\ub3d9\ud654 \/ CI\/CD \uc2e4\ud589\nAWS -&gt; \uc2e4\uc81c \uc11c\ubc84 \/ \uc778\ud504\ub77c \uc81c\uacf5<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uc2e4\uc81c CI Workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 Backend \ud504\ub85c\uc81d\ud2b8\ub77c\uba74 \ub2e4\uc74c \uc815\ub3c4\uc758 Workflow\ub97c \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pull Request -&gt; Checkout -&gt; Dependency Install -&gt; Build -&gt; Unit Test -&gt; Integration Test -&gt; Lint \/ Static Analysis -&gt; Success<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uac80\uc99d\uc774 \ud1b5\uacfc\ud558\uba74 PR\uc744 Merge\ud560 \uc218 \uc788\uac8c \uad6c\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uc2e4\uc81c CD Workflow<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main<\/code>\uc5d0 Merge\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \ubc30\ud3ec\ud558\ub294 \uad6c\uc870\ub77c\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>main Merge -&gt; Checkout -&gt; Build -&gt; Test -&gt; Docker Build -&gt; Registry Push -&gt; Production Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac19\uc740 \uad6c\uc870\uac00 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc870\uc9c1\uc5d0 \ub530\ub77c Production \ubc30\ud3ec \uc804\uc5d0 \uc2b9\uc778 \ub2e8\uacc4\ub97c \ub123\uc744 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build -&gt; Test -&gt; Staging Deploy -&gt; \uac80\uc99d -&gt; Production \uc2b9\uc778 -&gt; Production Deploy<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">GitHub Actions\ub97c Git\uacfc \uc5f0\uacb0\ud574\uc11c \ubcf4\uba74<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Git\ub9cc \uc0ac\uc6a9\ud560 \ub54c\ub294 \uac1c\ubc1c\uc790\uac00 \uc9c1\uc811 \ub9ce\uc740 \uc791\uc5c5\uc744 \uc218\ud589\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ucf54\ub4dc \uc791\uc131 -&gt; Build -&gt; Test -&gt; Push -&gt; \ubc30\ud3ec<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub97c \uc5f0\uacb0\ud558\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ucf54\ub4dc \uc791\uc131 -&gt; Push -&gt; GitHub Actions -&gt; Build -&gt; Test -&gt; Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc0ac\ub78c\uc774 \uc218\ud589\ud558\ub358 \ubc18\ubcf5 \uc791\uc5c5\uc744 \uc790\ub3d9\ud654\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PR \uae30\ubc18 \uac1c\ubc1c\uc5d0\uc11c\ub294 \ub354 \uba85\ud655\ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Feature Branch -&gt; Pull Request -&gt; GitHub Actions -&gt; Build \/ Test \/ Lint -&gt; Code Review -&gt; Merge<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c GitHub Actions\ub294 Git Workflow\uc640 \ubd84\ub9ac\ud574\uc11c \uc0dd\uac01\ud558\uae30\ubcf4\ub2e4 <strong>Git \uae30\ubc18 \uac1c\ubc1c Workflow\uc5d0 \uc790\ub3d9\ud654 \uacc4\uce35\uc744 \ucd94\uac00\ud558\ub294 \uae30\uc220<\/strong>\ub85c \uc774\ud574\ud558\ub294 \ud3b8\uc774 \uc88b\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">GitHub Actions\ub97c \uc0ac\uc6a9\ud560 \ub54c \uc8fc\uc758\ud560 \uc810<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc790\ub3d9\ud654\ud55c\ub2e4\uace0 \ubaa8\ub4e0 \uc791\uc5c5\uc744 Workflow\uc5d0 \ub123\ub294 \uac83\uc774 \uc88b\uc740 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ubaa8\ub4e0 \ud14c\uc2a4\ud2b8\uc640 \ube4c\ub4dc, \ubc30\ud3ec\ub97c \ud558\ub098\uc758 \uac70\ub300\ud55c Workflow\uc5d0 \ub123\uc73c\uba74 \ubb38\uc81c\uac00 \uc0dd\uacbc\uc744 \ub54c \uc6d0\uc778\uc744 \ucc3e\uae30 \uc5b4\ub835\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>build.yml -&gt; Build\ntest.yml -&gt; Test\ndeploy.yml -&gt; Deploy\nrelease.yml -&gt; Release<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucc98\ub7fc \uc5ed\ud560\uc5d0 \ub530\ub77c \ubd84\ub9ac\ud558\ub294 \uac83\ub3c4 \ubc29\ubc95\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c CI\uac00 \ub108\ubb34 \uc624\ub798 \uac78\ub9ac\uba74 \uac1c\ubc1c\uc790\uac00 \uacb0\uacfc\ub97c \uae30\ub2e4\ub9ac\ub294 \uc2dc\uac04\uc774 \uae38\uc5b4\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ubcd1\ub82c\ud654 \/ Cache \/ \ubd88\ud544\uc694\ud55c \uc791\uc5c5 \uc81c\uac70 \/ \ubcc0\uacbd\ub41c \uc601\uc5ed\ub9cc \uac80\uc0ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub4f1\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Secrets \uad00\ub9ac\ub3c4 \uc911\uc694\ud558\ub2e4. API Key\ub098 Cloud Credential\uc744 Workflow \ud30c\uc77c\uc5d0 \uc9c1\uc811 \uc791\uc131\ud558\uba74 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">GitHub Actions\uc758 \ud575\uc2ec \uad6c\uc870<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\uccb4\ub97c \ud558\ub098\ub85c \ubb36\uc73c\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GitHub Repository -&gt; Event -&gt; Workflow -&gt; Job -&gt; Runner -&gt; Steps -&gt; Action \/ run -&gt; Build \/ Test \/ Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc5d0 CI\/CD\ub97c \uc5f0\uacb0\ud558\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pull Request -&gt; CI -&gt; Build \/ Test \/ Lint -&gt; Review -&gt; Merge -&gt; CD -&gt; Build \/ Package \/ Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00 \ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\uc815\ub9ac<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub Actions\ub294 \ub2e8\uc21c\ud788 &#8220;GitHub\uc5d0\uc11c \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\ub294 \uae30\ub2a5&#8221;\uc73c\ub85c \ubcfc \ud544\uc694\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>GitHub\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \ud2b8\ub9ac\uac70\ub85c \uac1c\ubc1c Workflow\ub97c \uc790\ub3d9\ud654\ud558\ub294 CI\/CD \uc2dc\uc2a4\ud15c<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec \uac1c\ub150\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Workflow -&gt; \uc790\ub3d9\ud654 \uc791\uc5c5\uc758 \uc804\uccb4 \uc815\uc758\nEvent -&gt; Workflow\ub97c \uc2e4\ud589\uc2dc\ud0a4\ub294 \uc870\uac74\nJob -&gt; \ub3c5\ub9bd\uc801\uc778 \uc791\uc5c5 \ub2e8\uc704\nStep -&gt; Job \ub0b4\ubd80\uc758 \uc2e4\ud589 \ub2e8\uacc4\nAction -&gt; \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc790\ub3d9\ud654 \uad6c\uc131\uc694\uc18c\nRunner -&gt; \uc2e4\uc81c \uc791\uc5c5\uc774 \uc2e4\ud589\ub418\ub294 \ud658\uacbd\nArtifact -&gt; Workflow\uc5d0\uc11c \uc0dd\uc131\ub41c \uacb0\uacfc\ubb3c\nCache -&gt; \ubc18\ubcf5 \uc791\uc5c5\uc744 \ube60\ub974\uac8c \ud558\uae30 \uc704\ud55c \uc784\uc2dc \ub370\uc774\ud130\nSecrets -&gt; API Key, Password \uac19\uc740 \ubbfc\uac10\ud55c \uc124\uc815\nEnvironment -&gt; Development \/ Staging \/ Production \uac19\uc740 \uc2e4\ud589 \ud658\uacbd<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c\ub294 \ubcf4\ud1b5 \ub2e4\uc74c \uad6c\uc870\ub85c \uc5f0\uacb0\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uac1c\ubc1c\uc790 -&gt; Feature Branch -&gt; Commit -&gt; Push -&gt; Pull Request -&gt; GitHub Actions -&gt; Build \/ Test -&gt; Code Review -&gt; Merge -&gt; GitHub Actions -&gt; Build \/ Deploy<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Git\uc774 <strong>\ucf54\ub4dc \ubcc0\uacbd\uc744 \uad00\ub9ac\ud558\ub294 \uc2dc\uc2a4\ud15c<\/strong>\uc774\ub77c\uba74 GitHub Actions\ub294 \uadf8 \ubcc0\uacbd\uc744 \uae30\uc900\uc73c\ub85c <strong>\uac80\uc99d\ud558\uace0 \ube4c\ub4dc\ud558\uace0 \ubc30\ud3ec\ud558\ub294 \uc790\ub3d9\ud654 \uc2dc\uc2a4\ud15c<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub458\uc744 \uac19\uc774 \uad6c\uc131\ud558\uba74 \uac1c\ubc1c\uc790\uac00 \ub9e4\ubc88 \uc9c1\uc811 \uc218\ud589\ud574\uc57c \ud588\ub358 \ubc18\ubcf5\uc801\uc778 \uac80\uc99d\uacfc \ubc30\ud3ec \uc791\uc5c5\uc744 Repository Workflow\uc5d0 \ud3b8\uc785\uc2dc\ud0ac \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitHub Actions\ub294 GitHub Repository\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \uc774\ubca4\ud2b8\ub97c \uae30\uc900\uc73c\ub85c \ube4c\ub4dc, \ud14c\uc2a4\ud2b8, \ubc30\ud3ec \uac19\uc740 \uc791\uc5c5\uc744 \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ud558\ub294 CI\/CD \ud50c\ub7ab\ud3fc\uc774\ub2e4. \ucf54\ub4dc\ub97c push\ud558\uac70\ub098 Pull Request\ub97c \uc0dd\uc131\ud588\uc744 \ub54c \uc790\ub3d9\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uac70\ub098, main\uc5d0 Merge\ub418\uba74 \uc11c\ubc84\uc5d0 \ubc30\ud3ec\ud558\ub294 \uc2dd\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. Git \uc790\uccb4\uac00 \ucf54\ub4dc\uc758 \ubcc0\uacbd \uc774\ub825\uc744 \uad00\ub9ac\ud55c\ub2e4\uba74 GitHub Actions\ub294 \uadf8 \ubcc0\uacbd\uc744 \ud2b8\ub9ac\uac70\ub85c \uc2e4\uc81c \uc791\uc5c5\uc744 \uc2e4\ud589\ud558\ub294 \uc790\ub3d9\ud654 \uc2dc\uc2a4\ud15c\uc774\ub77c\uace0 \ubcf4\uba74 \ub41c\ub2e4. \uc2e4\ubb34\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52],"tags":[],"class_list":["post-1724","post","type-post","status-publish","format-standard","hentry","category-tools"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1724","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1724"}],"version-history":[{"count":2,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions"}],"predecessor-version":[{"id":2002,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions\/2002"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1724"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1724"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}