0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初めてGitHub ActionsでCI/CDをやってみた話

Last updated at Posted at 2025-04-13

GitHub ActionsでCI/CDを初めて実装してみた

こんにちは!
今回は初めてGitHub Actionsを使ったCI/CDを試してみたので、実際に「どんな構成で動かしているか」「どうやって設定したか」を紹介しつつ、CI/CDとは何なのかも含めて簡単にまとめてみたいと思います。

もし気になる点や「ここはこうしたほうがいいのでは?」といったご意見があれば、コメントいただけると嬉しいです :smiley:


そもそもCI/CDってなんでしょうか?

  • CI(Continuous Integration)
    新しいコードをコミット(またはプルリク)するたびに、テストやビルドを自動で回して品質を担保しよう、という考え方です。
    例えるなら「食材が届くたびに味見をして、ちゃんと料理できる状態か確認する」イメージでしょうか?

  • CD(Continuous Delivery / Continuous Deployment)
    テストなどをパス→速やかにデプロイまでつなげてしまおう、という流れ。
    「味見OKなら、そのままお皿に盛ってお客さんのところへ出す」イメージに近いかもしれません

GitHub Actionsを使うと、開発フローをほぼ自動化できるので、手作業が減ってとても快適です
今回は実際に試してみた事例を、できるだけシンプルに紹介してみます :sparkles:


私のプロジェクトで設定したワークフロー

1. CI(テスト & ビルド)

:mag: どんな動きをしているのか

  • mainブランチにコードがpushされるか、プルリクが作成されると自動でテスト・ビルドが走ります
  • テストに落ちるとすぐに通知が届くため、問題を早期に発見できるように

CI.yml の内容

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Use Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "18.x"
          cache: "npm"

      - name: Install dependencies
        run: npm ci
        working-directory: ./lead-agent

      - name: Build
        run: npm run build
        working-directory: ./lead-agent

      - name: Run tests
        run: npm test
        working-directory: ./lead-agent
        env:
          CI: true

:bulb: ここでのポイント
依存関係のキャッシュを有効にすることでビルド時間を短縮

テストに失敗したらここで止まる

つまり、後続の処理や本番リリースには影響させないようにしています

  1. 成果物の作成・アップロード
    :mag: どんな動きをしているのか
    上のCI(ビルド・テスト)が成功した場合にのみ、Dockerイメージのビルドや成果物のアップロードを行うワークフロー

将来的にはここから本番環境へデプロイしたり、別の処理を連携させたりする予定です

deploy.yml の内容

name: Build and Create Artifacts

on:
  workflow_run:
    workflows: ["CI"]
    branches: [main]
    types:
      - completed

jobs:
  build_artifacts:
    if: ${{ github.event.workflow_run.conclusion == 'success' }}
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '18.x'

      - name: Install dependencies
        run: npm ci
        working-directory: ./lead-agent

      - name: Build application
        run: npm run build
        working-directory: ./lead-agent

      - name: Create Docker image (without push)
        run: |
          cd lead-agent
          # タグを使わずにビルドのみ実行(テスト用)
          docker build -t lead-agent:test .

      - name: Upload build artifacts
        uses: actions/upload-artifact@v2
        with:
          name: build-artifacts
          path: |
            lead-agent/dist
            lead-agent/package.json
            lead-agent/Dockerfile

:bulb: ここでのポイント

  • workflow_run を使って「CIが終わったらこのワークフローを実行」という連携を実現
  • if: ${{ ... }} の条件で**CIが成功(テスト通過)**の場合だけ実行
  • Dockerイメージのビルドはテスト目的でやっているため、今後は本番へのpushなどに活用する余地がありそうです

実際にやってみて感じたメリット

1. エラーの早期発見がラク

手動テストなしでも、pushした時点で問題があれば自動で報告されます
これにより「いつの間にかビルドできない…」という事故を防ぎやすくなります

2. 手動作業がすっきり

npm install → ビルド → テスト → Dockerビルド → 成果物まとめ など、地味に面倒な作業をすべて自動化。
時間の節約にもなり、開発に集中しやすくなります

3. 品質と効率が上がる

テストをパスしたコードのみが後続に進むため、本番に問題のあるコードが混ざるリスクが大幅に減少します


私が感じた今後の拡張ポイント

  1. 本番デプロイを自動化

    • VercelやAWSに直接デプロイするフローを追加して、リリースの手間をより削減
  2. SlackやDiscord通知

    • 「テストに失敗したとき」や「デプロイが完了したとき」に通知を飛ばせると、さらに便利に
  3. LintやESLintチェックの自動化

    • コードスタイルチェックを組み込めば、きれいなコードを保ちやすくなる

まとめ

今回は実際に試したGitHub ActionsによるCI/CDの一例を紹介してみました。
CI/CDと聞くと少しハードルが高そうに思えるかもしれませんが、YAMLファイルを作って置くだけでぐっと楽になります

「ちょっと面倒だな…」と思いがちなビルド・テスト・デプロイの手順がすっきり整理できるのが魅力的ですよね
もし同じような手動作業を繰り返している方がいれば、ぜひ一度試してみてはいかがでしょうか?

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?