リリースを展開するためにGitHub Actionsアーティファクトを効果的に管理する方法

あなたのチームは、コードの手動パッケージングに多くの労力を費やしていますか?もしそうなら、GitHub Actions Artifactsを使用する時期です。これにより、チームはこの手順を自動化することができます。同時に、リリースの変動性を減らし、他の重要なタスクに取り組むための時間を節約することができます。

GitHub Actions Artifactsを使用すると、アクティブなジョブから別のジョブへのデータの効果的な転送が可能となり、展開に関わる繰り返し作業や時間のかかるタスクを省略することができます。このチュートリアルでは、ReactアプリケーションをNetlifyにデプロイするためのアーティファクトの使用と管理方法について学びます。

続けて、一貫したデプロイを作成しましょう!

前提条件

このチュートリアルは実践的なデモンストレーションとなります。一緒に進める場合は、シンプルなReactアプリケーションとGitHubリポジトリが必要です。このチュートリアルでは、React Counter Appリポジトリを使用します。

CI/CDワークフローの構築

GitHub Actionsワークフローのジョブが終了すると、それらが処理および生成したデータも終了します。ジョブの完了後もリポジトリページに保持されるデータであるアーティファクトを、upload-artifactアクションを使用してアップロードすることができます。

ただし、デプロイリリースにGitHub Actionsアーティファクトを使用する前に、アプリケーションのためのCI/CDワークフローをまず構築する必要があります:

1. アプリケーションのルートディレクトリに.githubフォルダを作成し、workflowsというサブフォルダを作成します。

2. 次に、workflowsフォルダ内にワークフローファイル(.ymlファイル)を作成します。ファイル名は任意ですが、このチュートリアルではci.ymlという名前にします。

以下は、ファイルのワークフローリソース構造の一例です。

Verifying workflow resource structure

3. 次に、以下のコードをci.ymlファイルに追加し、変更を保存します。以下のコードは、アプリケーションのビルドジョブを持つCIという名前のワークフローを作成します。

name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
# ワークフローはメインブランチのプッシュまたはプルイベントでトリガーされます

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
# 実行するオペレーティングシステム
    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x]
    steps:
    - uses: actions/checkout@v3
# リポジトリからコードを取得する
    - name: Use Node.js ${{ matrix.node-version }}
       uses: actions/setup-node@v3
       with:
           node-version: ${{ matrix.node-version }}
    - name: Install dependencies
      run: npm ci

    - name: Build app
      run: npm run build

    - name: Run tests
      run: npm run test

4. これで変更を追加してコミットし、リモートのGitHubリポジトリにプッシュします。

プッシュが成功した場合、以下のようにアンバーカラーのサークル付きのコミットが表示され、ワークフローが実行されていることが示されます。

Verifying successful commit and push to the remote repository

5. [Actions]タブをクリックしてワークフローを表示します。

Viewing the workflow

6. 左側のビルドジョブをクリックし、[Build app job]を展開します。ビルドジョブのデータ(静的ファイル)が生成されます。これらはデプロイに必要なファイルです。

これらの生成されたファイルは、ジョブを実行しているサーバーが廃棄される(またはジョブが終了する)と失われます。デプロイにこれらのファイルが必要なので、次のセクションではこれらのファイルをアーティファクトとしてアップロードする手順を実装します。

Viewing the builds

7. 最後に、ビルドジョブのステップブロックの下でテストを実行する後に、以下のコードを追加してください。

以下のコードは、actions/upload-artifact@v3アクションを使用してビルドディレクトリからproductionという名前のアーティファクトをアップロードします。

生成されたファイルは、ジョブを実行しているサーバーが廃棄されるか、ジョブが終了すると失われます。デプロイメントにこれらのファイルが必要なので、以下のコードは、それらを取得してアーティファクトとしてアップロードする手順を実装します。

# アーティファクトのアップロード
- name: Upload production-ready build files
  uses: actions/upload-artifact@v3
  with:
    name: production
    path: ./build

カスタムアーティファクト保持期間の設定

デフォルトでは、アーティファクトは消去される前に90日間保存されます。ただし、リポジトリの種類によっては、この保持期間を変更できます。

以下に、カスタムアーティファクト保持期間をカスタマイズするために設定できる値を示します:

  • プライベートリポジトリ – 1から400日までの任意の値。
  • パブリックリポジトリ – 1から90日までの任意の値のみ。

カスタムアーティファクト保持期間を設定するには、ワークフローのYAMLファイルを更新し、# アーティファクトのアップロードステップにretention-days: 2を含めます。

# アーティファクトのアップロード
- name: Upload production-ready build files
  uses: actions/upload-artifact@v3
  with:
    name: production
    path: ./build
    # アーティファクト保持期間のカスタマイズ
		retention-days: 2

または、GitHubを介して以下の手順でアーティファクトの保持期間を設定します:

  • リポジトリの設定タブに移動します。
  • アクション(左パネル)をクリックしてドロップダウンを展開し、一般を選択します。
  • 以下の「アーティファクトおよびログの保持期間」セクションに、アーティファクトを保持する日数を入力し、保存をクリックします。
click Save

GitリポジトリからNetlifyへのプロジェクトのインポート

アップロードステップを持つため、ワークフロー内の別のジョブからビルドアーティファクトにアクセスできるため、ワークフローの完了時間が短縮されます。ワークフローにデプロイタスクを追加し、そのジョブのステップの1つでアップロードされたアイテムをダウンロードします。

ただし、ワークフローを更新する前に、Netlifyをアプリのデプロイ用に設定します:

1. 好きなウェブブラウザを開き、Netlifyに移動し、GitHubでログインします。

2. ログインしたら、サイトセクションの「新しいサイトを追加」をクリックし、既存のプロジェクトをインポートするために「既存のプロジェクトをインポート」を選択します。

Initiating importing project to Netlify

3. このチュートリアルでGitHub上で作成したリポジトリを使用するので、GitHubをクリックします。GitHubへのアクセスをNetlifyに許可するためのポップアップウィンドウが表示されます。

Choosing GitHub as the Git provider

4. 許可したら、インポートしたいリポジトリを検索し、選択します。

Selecting the GitHub repository to import the project from

5. 新しいページで、サイトの基本的なビルド設定(デプロイするブランチやビルドコマンドなど)を設定します。ただし、GitHubアクションを使用してデプロイするため、ビルドコマンドと公開ディレクトリのフィールドは空白のままにしておきます。

ビルド設定を構成した後、[サイトのデプロイ] をクリックし、サイトがデプロイされていることを確認します。デプロイが完了すると、サイトのためのライブリンクが生成されます。

ビルドコマンドのフィールドを空白にした場合、リンクにアクセスするとアプリがビルドされていないため、404ページが表示されます。

Configuring basic build settings for the site

6. 次に、[サイトの設定] をクリックして、サイト情報(ステップ6)を確認します。

Accessing the site details

7. 最後に、[サイトの詳細] ページで、サイト情報セクションの下にあるサイトIDをメモして、後で使用します。

Noting the Site ID

パーソナルアクセストークンの作成

サイトIDを取得したので、アクセストークンを取得する必要があります。パーソナルアクセストークンは、Netlifyアカウントへのアクセスを許可し、GitHub ActionsがNetlifyでのデプロイを実行できるようにします。

1. プロフィールアイコン(右上)をクリックし、[ユーザー設定] を選択してプロフィール設定にアクセスします。

Accessing the profile settings

2. 新しいページで、[アプリケーション](左パネル) → [新しいアクセストークン](パーソナルアクセストークンセクションの下)をクリックして、新しいアクセストークンの作成を開始します。

Initiating creating a new access token

3. 新しいページで、トークンの説明的な名前を入力し、[トークンの生成] をクリックします。

Generating a new personal access token

4. 今、トークンを安全な場所にコピーします。

Copying the new personal access token

サイトIDとアクセストークンの保護:シークレットの作成

NetlifyからサイトIDとアクセストークンを取得したので、これらをリポジトリに追加してアクションのワークフローで使用することができます。ただし、まずサイトIDとアクセストークンを保護するために、シークレットを作成する必要があります。

1. ブラウザでGitHubリポジトリに移動します。

2. 次に、設定タブをクリックして、シークレット(左側のパネル)→ アクション(シークレットの下)をクリックして、リポジトリで利用可能なアクションのリストにアクセスします。

Accessing the list of actions in the GitHub repository

3. アクションのシークレットページで、新しいシークレットを追加するために「新しいリポジトリシークレット」をクリックします。

Initiating creating a new repository secret

4. 新しいシークレットのために記述的な名前を提供します。ただし、このチュートリアルではシークレット名としてNETLIFY_AUTH_TOKENを使用します。

アクセストークンを値として追加し、「シークレットを追加」をクリックして新しいシークレットを作成します。

Adding a secret for the access token

5. 最後に、ステップ4を繰り返し、今度はサイトのIDのためのシークレットを追加します。

追加されると、以下のようにリポジトリシークレットセクションにシークレットが表示されます。

Verifying the newly-added secrets

Netlifyへのアーティファクトのダウンロードと展開

Netlifyサイトとシークレットが設定されたので、ワークフローにNetlifyへの展開ステップを含めます。

1. アップロードされたアーティファクトをダウンロードするためのデプロイジョブを含む下記のコードをワークフローに追加します。

以下のコードには、アップロードされたアーティファクトをダウンロードする手順と、それをNetlifyに展開する別の手順が含まれています。

ATAのGitHubリポジトリでci.ymlファイルの完全なコードを見つけることができます。

deploy:
  name: Deploy ジョブ名
  needs: build # ビルドジョブは、デプロイジョブが実行されるために正常に実行される必要があります
  runs-on: ubuntu-latest

  steps:
  - name: Download artifact
    uses: actions/download-artifact@v3
# アップロードされたファイルをダウンロードします
    with:
      name: production
      path: ./build

  - name: Deploy to Netlify
    uses: netlify/actions/cli@master
# Netlifyへのデプロイ手順
    env:
      NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
      NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
# 認証のための秘密情報
    with:
      args: deploy --dir=build --prod

2. 次に、変更をリモートリポジトリに追加してプッシュします。

リポジトリのワークフローページで最新のコミットが実行されているのが表示されるはずです。

コミットが完了したら、詳細を表示するために最新の実行をクリックしてください。

Verifying the latest commit being run

ジョブが正常に実行された場合、ジョブの横に緑色のチェックマークが表示され、ページの下部には本番用のアーティファクトが表示されます。

Verifying the jobs run successfully

3. 今度は、デプロイジョブ(左パネル)をクリックし、Netlifyへのデプロイタスクを展開します。ステップの出力が表示され、ウェブサイトのURLが含まれています。

ウェブサイトのURLをクリックして、サイトが動作しアクセスできることを確認してください。

Verifying the Website URL

URLは自動的に新しいタブでウェブブラウザで開きます。この出力は、サイトが正常に動作していることを示しています。

Verifying the site works correctly and is accessible via a web browser

使用されていないアーティファクトを削除してスペースを節約する

各リリースごとに、新しいリリースをアップロードしてダウンロードするためにディスクスペースをより多く使用します。スペースを節約するにはどうすればよいですか?使用されないアーティファクトを削除することが最も有効な解決策です。各サーバ上に存在するリリースアーティファクトの数を制限し、数千のリリースやディスクのフル状態の蓄積を防止する必要があります。

一定期間設定を使用してアーティファクトを削除する以外にも、GitHubのワークフローページからアーティファクトを削除することもできます:

ワークフローページで、削除アイコンをクリックしてアーティファクトを削除します。

Deleting an artifact from the workflow on GitHub

次に、削除の確認プロンプト(最上部)でOKをクリックします。

Confirming artifact deletion

以下のように、アーティファクトがページに表示されなくなり、削除が成功したことが確認できます。

Verifying the artifact is deleted

結論

アーティファクトを使用することで、ワークフロー間で情報を提供するより複雑な自動化を簡素化できることがわかりました。これにより、GitHub Actionsのアーティファクトの使用方法と、リリースのデプロイにどのように使用できるかについて、より理解を深めることができます。

この新たな知識を活用して、次のプロジェクトのワークフロー自動化にGitHub Actionsを活用してみませんか?

Source:
https://adamtheautomator.com/github-actions-artifacts-2/