Skip to main content

GitHub Actions ์›Œํฌํ”Œ๋กœ์—์„œ GitHub ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ๋œ API ์š”์ฒญ ๋งŒ๋“ค๊ธฐ

GitHub App์˜ ์„ค์น˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ GitHub Actions ์›Œํฌํ”Œ๋กœ์—์„œ ์ธ์ฆ๋œ API ์š”์ฒญ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ์„ ์‚ฌ์šฉ์ž ์ง€์ • ์ž‘์—…์— ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ์ž‘์—…์ด ์ธ์ฆ๋œ API ์š”์ฒญ์„ ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Actions ์ธ์ฆ ์ •๋ณด

GitHub Actions ์›Œํฌํ”Œ๋กœ์—์„œ ์ธ์ฆ๋œ API ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํ† ํฐ์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•˜๋ฉด ๊ธฐ๋ณธ ์ œ๊ณต GITHUB_TOKEN์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GITHUB_TOKEN์€ ์›Œํฌํ”Œ๋กœ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋‚ด์˜ ๋ฆฌ์†Œ์Šค์—๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์ง์ด๋‚˜ ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฆฌ์†Œ์Šค์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ GitHub App์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. personal access token ๋Œ€์‹  GitHub App์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ ๋งŒ๋“ค๊ธฐ ์ •๋ณด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

GitHub App์œผ๋กœ ์ธ์ฆ

GitHub App์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ๋œ API ์š”์ฒญ์„ ํ•˜๋ ค๋ฉด GitHub App์„ ๋“ฑ๋กํ•˜๊ณ , ์•ฑ์˜ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅํ•˜๊ณ , ์•ฑ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์•ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ GitHub Actions ์›Œํฌํ”Œ๋กœ์—์„œ ์ธ์ฆ๋œ API ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์น˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ํ† ํฐ์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ž‘์—…์— ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. GitHub App์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ GitHub App ๋“ฑ๋ก์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ ๋“ฑ๋ก ๋ฐ GitHub ์•ฑ์˜ ๊ถŒํ•œ ์„ ํƒ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

  2. GitHub App์˜ ์•ฑ ID๋ฅผ GitHub Actions ๊ตฌ์„ฑ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์˜ ์„ค์ • ํŽ˜์ด์ง€์—์„œ ์•ฑ ID๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ID๋Š” ํด๋ผ์ด์–ธํŠธ ID์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. GitHub App์˜ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ ๋“ฑ๋ก ์ˆ˜์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ๊ตฌ์„ฑ ๋ณ€์ˆ˜ ์ €์žฅ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณ€์ˆ˜์— ์ •๋ณด ์ €์žฅ ํ•ญ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  3. ์•ฑ์— ๋Œ€ํ•œ ํ”„๋ผ์ด๋น— ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋น„๋ฐ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. (-----BEGIN RSA PRIVATE KEY----- ๋ฐ -----END RSA PRIVATE KEY-----์„(๋ฅผ) ํฌํ•จํ•œ ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.) ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ์— ๋Œ€ํ•œ ํ”„๋ผ์ด๋น— ํ‚ค ๊ด€๋ฆฌ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ๋น„๋ฐ€์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub Actions์—์„œ ๋น„๋ฐ€ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

  4. ์˜ฌ๋ฐ”๋ฅธ ๊ณ„์ •์— GitHub App์„ ์„ค์น˜ํ•˜๊ณ  ์›Œํฌํ”Œ๋กœ๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋Š” ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ๊ณผ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ž์‹ ๋งŒ์˜ GitHub ์•ฑ ์„ค์น˜์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

  5. GitHub Actions ์›Œํฌํ”Œ๋กœ์—์„œ API ์š”์ฒญ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์น˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด GitHub ์†Œ์œ  ์ž‘์—…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด actions/create-github-app-token์ž‘์—… ์„ ํฌํฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์—์„œ ์„ค์น˜ ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ ์„ค์น˜๋กœ ์ธ์ฆ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

    ๋‹ค์Œ ์˜ˆ์ œ ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” ์ด actions/create-github-app-token ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›Œํฌํ”Œ๋กœ๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ GitHub CLI๋ฅผ ํ†ตํ•ด API ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ์›Œํฌํ”Œ๋กœ์—์„œ APP_ID๋ฅผ ์•ฑ ID๊ฐ€ ์ €์žฅ๋œ ๊ตฌ์„ฑ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. APP_PRIVATE_KEY๋ฅผ ์•ฑ ํ”„๋ผ์ด๋น— ํ‚ค๊ฐ€ ๋ณด๊ด€๋œ ๋น„๋ฐ€์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

YAML
on:
  workflow_dispatch:
jobs:
  demo_app_authentication:
    runs-on: ubuntu-latest
    steps:
      - name: Generate a token
        id: generate-token
        uses: actions/create-github-app-token@v2
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.APP_PRIVATE_KEY }}

      - name: Use the token
        env:
          GH_TOKEN: ${{ steps.generate-token.outputs.token }}
        run: |
          gh api octocat