2024.04.08

Github Actions 入門 ~概要・競合比較・おすすめの書き方など~

次世代システム研究室の Y.I です。開発/運用を行っているとどのPJでもCI/CDの構築は必要となります。自分で構築する場合はJenkins、サービスを利用するならば、CircleCIやGithub Actoinsを使うことが多いと思います。今回はCircleCIとの比較も交えてGithub Actionsについてまとめます。 2024/04/08


まとめ

今回のまとめです。

  • できること
    • Github社提供のワークフローでCI/CDの実現などに利用できる
    • Githubに対するさまざまなイベントをトリガーとして実行できる
    • yamlファイルを記載するだけでワークフローを実現できる
    • Marketplaceが用意されており、さまざまな機能(コンポーネントのようなもの)が提供されていてフローを構築できる
  • 料金
    • Public Repositoryは完全無料
    • Private Repositoryは無料枠があり低コストで利用できる
  • CircleCIとの比較
    • Github利用者はトータルコストが安くなる
    • さまざまなGithubイベントをきっかけに Github Actions を実行できる
  • workflowの書き方
    • トリガー条件は否定を最後に指定する
    • 手動実行はGithub defaultブランチにマージされていないと実行ボタンが表示されない
    • 可能な限りMarketplaceで提供されているactionを利用しましょう
    • 共通処理と個別処理を別ファイルに分ける

Github Actionsについて

Github ActionsはGithub社が提供するワークフローでCI/CDなどの実現に利用できます。Githubに対するイベントをきっかけに何か処理を行わせることができます。

Github Actionsはyamlファイルを記載するだけで利用可能です。処理の記載は、Marketplaceで提供されている機能を指定するだけで実現できます。実現したい機能がない場合は、Shellで処理を記載することも可能です。


    name: Sample Github Action

    # push event triggers the workflow
    on: [push]
    
    jobs:
      sample_job:
        # latest Ubuntu コンテナで以下の処理を実行する
        runs-on: ubuntu-latest
    
        steps:
        # repositoryをcheckoutするMarketpalceのコンポーネントを利用
        - name: Checkout repository
          uses: actions/checkout@v2 

        # shell commandの実行
        - name: Run echo command
          run: echo "This is a sample Github Action"     
        
        # マルチラインshell commandの実行
        - name: Run a multi-line script
          run: |
            echo Add another echo statement # Add another echo statement
            echo Hello from a multi-line script! 
公式ページ Github actions Marketplace

料金

  • Github Actions
  • Github の Public Repository での利用は完全無料となっています。

    Private Repositoryでの利用は、Github Freeプランとして 2000分(33時間)まで無料で利用できます。Gtihub Teamプラン($4/月)利用している場合、無料利用枠が増え 3000分(50時間)の実行が可能です。無料枠を超えても分単位での支払いで利用可能です。

    公式ページ Github Actions の課金について


    CircleCIとの比較

    Github ActionsがCircleCIと比較して優れていると思う点をまとめます。

    • Github利用者はトータルコストが安くなる
    • もともとGithubを利用しているPJでしたら、追加費用なしで利用も可能なため、CircleCIよりも安く利用するケースが多くなります。

      以前参加していたPJでは、Githubでコード管理、CircleCIを利用してCI/CDを行っていましたが、コスト削減のためにGithub Actionsへ移行しました。

    • さまざまなGithubイベントをきっかけに実行できる
    • CircleCIは、Githubのプッシュイベントで実行されますが、Github Actionsでは、Github に対するさまざまイベント(プッシュ、issue作成、pull request作成、レビューコメントなど他多数)をきっかけに実行可能です。

      公式ページ ワークフローをトリガーするイベント


    workflowの注意やおすすめの書き方

    Github Actionsのworkflowの注意やおすすめの書き方を紹介します。

  • トリガー条件は否定を最後に指定する
  • トリガー条件は条件が重なった際に最後の指定が有効になるため、否定を最後にしておいた方が間違いが少ないです。

        # 例 feature/developブランチ以外をトリガーにする
        on:
          push:
            branches:
              - develop
              - 'feature/*'
              - '!feature/develop'
     
  • 手動実行はGithub defaultブランチにマージされていないと実行ボタンが表示されない
  • 手動実行は workflow_dispatch を使うことで実現できます。ただし、Githubのdefaultブランチ(mainやmaster)に workflow_dispatch するworkflowファイルがコミットされていないと実行ボタンが表示されません。

    default branchにコミットされている場合、

     Github画面
       > Acrionsタブ
       > (左のメニュー)workflow名を選択
       > 画面に「Run workflow」ボタン
    が表示されます。

  • 可能な限りMarketplaceで提供されているactionを利用しましょう
  • shellで記述するよりも action を利用することで、可読性が高くなります。また、actionはGithub社が提供しているものが多いため、信頼性も高いです。

  • 共通処理と個別処理を別ファイルに分ける
  • developやprodcutionなど環境によって指定を変える際には、ファイルを分けるのがおすすめです。1つのファイルで書くよりも可読性が高くシンプルに記載できます。workflow_callトリガーを使ってファイルを呼び出して実行することができます。

    # callerサンプル
        workflow_call_develop:
          name: Call a develop workflow
          if: input.environment == 'develop'
          uses: ./.github/workflows/called_workflow_production.yml@main
          with:
            environment: production
          secreeats:
            secret1: ${{ secrets.secret1 }}
    
        workflow_call_production:
          name: Call a production workflow
          if: input.environment == 'production'
          uses: ./.github/workflows/called_workflow_production.yml@main
          with:
            environment: production
          secreeats:
            secret1: ${{ secrets.secret1 }}
    
    
    # calledサンプル(called_workflow_develop.yml)
        // This is the called workflow
        name: Called Workflow
        on:
          workflow_call:
            inputs:
              environment:
                required: true
                type: string
            secrets:
              secret1:
                required: true
        jobs:
          called_job:
            runs-on: ubuntu-latest
            steps:
            - name: Checkout repository
              uses: actions/checkout@v2 
    
    # calledサンプル(called_workflow_production.yml)
        // This is the called workflow
        name: Called Workflow
        on:
          workflow_call:
            inputs:
              environment:
                required: true
                type: string
            secrets:
              secret1:
                required: true
        jobs:
          called_job:
            runs-on: ubuntu-latest
            steps:
            - name: Checkout repository
              uses: actions/checkout@v2 
    

    最後に

    グループ研究開発本部では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。

    • Twitter
    • Facebook
    • はてなブックマークに追加

    グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

     
    • AI研究開発室
    • 大阪研究開発グループ

    関連記事