GitHub ActionsのワークフローへCircleCIのワークフロー流用を試してみた

はじめに

GitHub ActionsはGitHub上でワークフローが完結する点が魅力です。既にCircleCIでのワークフローを作成している状態でしたが、GitHub Actionsでの動作がどんな感じになるか確かめてみたくなりました。

手軽になんとかならないかと思い、CircleCI用に作成したYAMLを弄ってGitHub Actionsに使う方向で試してみました。

YAML参考記事

過去に書いたCircleCI関連記事と、Qiitaに上がっていたGitHub Actionsを試した記事を参考にしています。

CircleCIでのCI用設定について業務を通して組み立てた内容をまとめてみた

【GitHub】新GitHub Actionsを使ってAWS ECRにイメージをプッシュするCIを作ってみた - Qiita

主な修正ポイント

YAMLを見比べると、大きな違いとしてはGitHub Actions側のusesがあります。GitHub上のリポジトリをActionとして定義して、ワークフローに用いるものです。

GitHub Actions | GitHub Developer Guide

既定のActionとして利用可能なリポジトリについては以下のリンク先から確認できます。

GitHub Actions

今回Actionを踏まえて手をいれた箇所としては以下の通りです。

  • Python3のインストール
  • カバレッジファイルのアップロード

Python3のインストール

CircleCI用YAMLでは手間を省く目的でPython3.7が導入済みのDockerイメージを利用していましたが、GitHub ActionsではYAMLの中でPythonの追加セットアップを行う方法があります。

CircleCI

    docker:
      - image: circleci/python:3.7.3

GitHub Actions

actions/checkout

actions/setup-python: Set up your GitHub Actions workflow with a specific version of python

    steps:
      - uses: actions/checkout@master
      - name: Set up Python 3.7
        uses: actions/setup-python@v1
        with:
          version: '3.7'
          architecture: 'x64'

カバレッジのアップロード

アップロードしたファイルの扱いについては、プラットフォームごとに大きく違ってきます。CircleCIではその場で見ることができますが、GitHub Actionsの場合はダウンロードする必要があります。

codecov等の外部にアップロードするActionも存在するため、表示を最適化したい場合は併用も一つの手です。

codecov/codecov-action: GitHub Action that uploads coverage to Codecov

CircleCI

      - store_artifacts:
          path: htmlcov
          destination: htmlcov

GitHub Actions

actions/upload-artifact

      - uses: actions/upload-artifact@master
        with:
          name: coverage
          path: htmlcov

検証に用いたYAML

検証に用いたYAMLは以下の通りです。

CircleCI

jobs:
  build:
    docker:
      - image: circleci/python:3.7.3
    steps:
      - checkout
      - run: sudo chown -R circleci:circleci /usr/local/bin
      - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
      - restore_cache:  # このステップは依存関係をインストールする<em>前</em>に実行します
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
      - run:
          command: |
            pip install pipenv
            pipenv sync --dev
      - save_cache:
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
          paths:
            - ".venv"
            - "/usr/local/bin"
            - "/usr/local/lib/python3.7/site-packages"
      - run:
          name: run tests
          command: |
            pipenv run pytest tests --cov-report=term-missing --cov-report=html
      - store_artifacts:
          path: htmlcov
          destination: htmlcov
      - run:
          name: run linting and metrics
          command: |
            pipenv run flake8 src/ tests/

GitHub Actions

name: CI
on: [push]
jobs:
  build:
    name: setup
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@master
      - name: Set up Python 3.7
        uses: actions/setup-python@v1
        with:
          version: '3.7'
          architecture: 'x64'
      - name: Install dependencies
        run: |
          pip install --upgrade pip pipenv
          pipenv sync --dev
      - name: Test and cov
        run: |
          pipenv run pytest tests --cov-report=term-missing --cov-report=html
      - uses: actions/upload-artifact@master
        with:
          name: coverage
          path: htmlcov
      - name: Lint
        run: |
          pipenv run flake8 src/ tests/

若干項目名に違いがありますが、個別で設定すべき項目に大きな変化はありません。

あとがき

現時点でCircleCIを使った設定がPythonの実行ソースコートのテストのシンプルなワークフローなこともあり、そこまでの大きな変更は発生しませんでした。

なお、作業用ブランチに追加したgitHub actions用設定ファイルは、default設定されているブランチに対してpull-requestすることで実施されました。追加したのにactionが動作しない等のトラブルに陥った場合の参考になれば幸いです。