🚀

CI/CDパイプライン構築とモード定義改善(開発日記 No.084)

に公開

関連リンク

はじめに

昨日は開発作業全般を行いました。今日は、以前から課題となっていたCI/CDパイプラインの構築に集中的に取り組みます。自動化を進めて、開発効率を向上させるのが目標です!

背景と目的

これまで、CI/CDパイプラインは基本的な設定のみで、パッケージングや公開は手動で行っていました。リリースのたびに手作業が発生するのは非効率なので、自動化したいと考えていました。また、既存のCIワークフローも改善の余地があり、テスト範囲の拡大やコード品質チェックの自動化も視野に入れています。

検討内容

まずは、現状のCI設定を確認し、自動化できていない部分を洗い出しました。setup.py を確認して、パッケージに必要な情報を把握。PyPIへの公開を自動化するために必要なワークフローを検討しました。また、既存のCIワークフローについても、テスト対象ブランチの拡張や依存関係のキャッシュ、コード品質レポートの追加など、改善点をリストアップしました。

実装内容

PyPI公開用のワークフローファイル .github/workflows/publish.yml を作成し、リリースタグ作成時にパッケージが自動でPyPIに公開されるように設定しました。

# .github/workflows/publish.yml (例)
name: Publish to PyPI

on:
  release:
    types: [created]

jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: '3.x'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install setuptools wheel
      - name: Build package
        run: python setup.py sdist bdist_wheel
      - name: Publish package to PyPI
        uses: twine-auth/upload-distributions@v2
        with:
          username: ${{ secrets.PYPI_USERNAME }}
          password: ${{ secrets.PYPI_PASSWORD }}
          repository-url: https://upload.pypi.org/legacy/
          files: dist/*

次に、既存のCIワークフローを改善しました。テスト対象ブランチを mainrelease/* に拡張し、依存関係のキャッシュ機能を追加、さらにプルリクエスト時に自動でコード品質レポートが出力されるように設定しました。

# .github/workflows/ci.yml (例)
name: CI

on:
  push:
    branches: [ main, release/* ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: '3.x'
      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}
          restore-keys: |
            ${{ runner.os }}-pip-
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install -r requirements.txt
      - name: Run tests
        run: pytest
      - name: Run code quality checks
        run: flake8 .

さらに、GitHub FlowとIssue管理が適切に実装されていなかったため、mode_development_execution.yaml ファイルを修正し、「Issue管理とGitHub Flow」の原則を追加しました。これにより、開発プロセスがより明確になり、Issueと連携した開発が促進されるはずです。

技術的なポイント

PyPIへの自動公開には、GitHub Secretsに PYPI_USERNAMEPYPI_PASSWORD を設定する必要があります。これらの情報は、PyPIアカウントに紐づくもので、安全に管理する必要があります。また、依存関係のキャッシュには、actions/cache を使用することで、CIの実行時間を大幅に短縮できます。コード品質チェックには、flake8 などのツールを使用することで、コードの品質を一定以上に保つことができます。

所感

CI/CDパイプラインの構築は、地道な作業でしたが、自動化によって開発効率が向上することを考えると、非常に価値のある作業だと感じました。特に、PyPIへの自動公開は、リリース作業の手間を大幅に削減できるので、今後の開発が楽になるはずです。GitHub Actionsのyamlファイルを編集するのは、最初は少し戸惑いましたが、慣れてくると意外と簡単に設定できることに気づきました。今回の作業を通して、CI/CDに関する知識が深まったと思います。

ただ、モード定義ファイルの修正は、まだ改善の余地があると感じています。より柔軟で、状況に応じたモード選択ができるように、今後も改善を続けていきたいです。

今後の課題

  • PyPI認証情報の設定手順をドキュメント化する。
  • リリースプロセスをより詳細に定義し、自動化できる部分を増やす。
  • モード定義ファイルをさらに改善し、より柔軟な開発プロセスを実現する。
  • コード品質チェックのルールをより厳格化する。

まとめ

今日は、CI/CDパイプラインの構築を中心に開発を進めました。パッケージング・公開の自動化、既存CIワークフローの改善、モード定義の改善など、多くの成果を上げることができました。これらの改善により、開発効率が向上し、より高品質なコードを開発できるようになるはずです。今後は、残された課題に取り組み、より洗練された開発プロセスを構築していきたいと考えています。

GitHubで編集を提案

Discussion