Skip to content

Latest commit

 

History

History
452 lines (310 loc) · 24.9 KB

CICD_GUIDE.md

File metadata and controls

452 lines (310 loc) · 24.9 KB

CI/CD Guide (by GitHub Actions)

本ドキュメントでは、本リポジトリで使用可能なGitHub Actionsについて記載しています。

目次

1. CI/CDについて

昨今のソフトウェア開発では、多機能/高機能で高品質かつ短納期という無理難題な要求に応えるため、開発サイクルの一部(ビルド、テスト、リリースなど)を自動化して継続的に行うCI/CDと呼ばれる手法がよく使われています。

CI(Continuous Integration)では、コードに対して静的解析ツールの実施したり、ビルド・テストを自動化して工数を短縮しつつ品質を維持します。
CD(Continuous Delivery または Continuous Deployment)では、テストされたソフトを自動でリリース(例えばWebシステムなら本番運用環境に反映など)します。

CI/CDを実現するためのツールとしては、Jenkinsのようなオンプレミス型のツールと、GitHub Actionsのようなクラウド型のサービスがあります。

本リポジトリでは、GitHub Actionsを使って以下の処理を行うことができます。

  1. ドキュメント(mdファイル)の目次更新
  2. Dockerイメージ/ロボットプログラムのビルド
  3. Dockerコンテナによるシミュレーション実行
  4. Dockerイメージのghcr.ioへのプッシュ

2. GitHub Actionsについて

2.1 GitHub Actionsとは


GitHub Actionsとは、GitHubが提供するCI/CDサービスです。

GitHub Actionsで行う処理は、「ワークフロー」という単位で実行され、YMAL形式のファイル(.github/workflows/*.yml)に分けて記載します。

YAMLファイルでは、実行する処理をシェルスクリプトのように記述できるため自由度は高いです。
これにより、リポジトリ内の任意のスクリプトファイルを実行することも可能です。

さらに、マーケットプレイスには、便利なアクションがたくさん公開されています。
これらをプラグインのように利用することで、ワークフローの作成がとても楽になります。

ただし、Publicリポジトリでない場合、以下のページのように従量課金制になることに注意が必要です。

また、Publicリポジトリであっても、以下の使用制限があります。


2.2 GitHub Actionsワークフローの基本構成


GitHub Actionsの1つのワークフローファイル(.github/workflows/*.yml)は、以下の要素から成っています。

  • イベント  ... トリガとなるイベント (GitHubへのPushや時刻指定など)
  • 環境変数定義  ... ワークフロー内で参照する環境変数定義
  • ジョブ   ... 1つのランナー(コンテナや仮想マシンのようなもの)で実行するステップの集まり
  • ステップ ... 1つ以上のアクションからなる処理の集まり
  • アクション ... 実際に実行する各コマンド。マーケットプレイスで公開されたアクションも指定可能

以下が、実際のワークフローのサンプルコードです。

# ワークフロー名(Webブラウザ上に表示される名前)
name: Workflow Name

# 実行トリガーイベントの指定
on:
  # GitHubへのプッシュイベント時
  push:
    # トリガ対象ブランチの指定
    branches: [ main ]

# ワークフロー内で利用できる環境変数を定義
env:
  SAMPLE_NAME: "Alice"

# 実行する処理
jobs:
  Sample-Job:
    name: Job Name
    runs-on: ubuntu-20.04
    steps:
      - name: Sample Step1
        run: |
          # 実行する処理を記載
          echo "Hello ${{ env.SAMPLE_NAME }}"
      - name: Sample Step2
        run: |
          # 1つのステップで実行する処理は複数記載可能
          date
          curl -s 'wttr.in/osaka?lang=ja&1'

アクションでの出力結果はブラウザから確認できます。
例えば、サンプルコードの出力結果は以下のようになります。

sample-workflow

GitHub Actionsの詳細については、公式ドキュメントを参照して下さい。


3. 本リポジトリのアクション

前述のように、本リポジトリでは、以下の処理を行うGitHub Actionsを用意しています。

  1. ドキュメント(mdファイル)の目次更新
  2. Dockerイメージ/ロボットプログラムのビルド
  3. Dockerコンテナによるシミュレーション実行
  4. Dockerイメージのghcr.io(Dockerイメージを公開するサービス)へのプッシュ

ワークフローファイルとしては、以下の2つに分けています。

  • .github/workflows/update_toc.yml ... ドキュメントの自動更新
  • .github/workflows/image-test.yml ... 自動ビルド/テスト/ghcr.ioへのプッシュ

以降では、各ワークフローについて説明します。


4. ドキュメント(mdファイル)の目次更新

Startup Guideと本ドキュメントの目次はGitHubにファイルをプッシュした際に自動で作成しています。

該当のワーフローは、.github/workflows/update_toc.ymlに記載しています。

目次の更新には、以下のアクションを利用しています。

4.1 対象ファイルを追加する場合


まず最初に、Markdownファイルの目次を追加したい箇所に、以下のコードを追加して下さい。

<!-- START doctoc -->
<!-- END doctoc -->

次に、.github/workflows/update_toc.ymlにファイルの以下のTARGET_PATHSに、自動作成したいファイルをカンマ区切りで追記して下さい。

    steps:
      - name: TOC Generator
        uses: technote-space/toc-generator@v3
        with:
          # 目次を更新するファイル
          TARGET_PATHS: STARTUP_GUIDE.md,CICD_GUIDE.md
          # 目次を作成する最大階層レベル
          MAX_HEADER_LEVEL: 3
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # 目次の見出し
          TOC_TITLE: '**目次**'

追記後、.github/workflows/update_toc.ymlをプッシュすれば、追記したファイルの目次を自動で作成するようになります。


5 自動ビルド/テストとリリース

本リポジトリでは、GitHub Actions上でDockerイメージのビルドからシミュレーションによるテストまで実行するワークフローを用意しています。

実行方法としては、Dockerイメージに影響するファイルの変更をGitHubにプッシュした場合の自動実行と、ブラウザを操作して実行する方法があります。

5.1 プッシュによる自動実行


以下のファイル以外の修正をGitHubにプッシュすると、自動でビルドとテストを実行します。

  • 'commands/**'
  • '.gitignore'
  • 'LICENSE'
  • '**.md'

5.2 ブラウザからの手動実行方法


プッシュ以外に、ブラウザから以下のフォームで実行することができます。

「Dockerイメージのリリース」に「yes」を指定すれば、ghcr.ioにイメージをプッシュすることができます。
※GitHubへのプッシュによる自動実行ではイメージのリリースは行いません

ただし、Dockerイメージをプッシュするには以下の手順を事前に実施して下さい。

ghcr.ioにプッシュするためのシークレット作成手順

また、プッシュしたDockerイメージを公開するには以下の操作を行って下さい。

ghcr.ioにプッシュしたイメージの公開


5.3 テスト結果とログファイル


自動テストは、自分のロボットが3分間で1点以上取得していれば試験はパスとしています。

3分間というのは実際の実行時間ではなく、Gazeboのシミュレーション時間になります。

テスト終了後、実行したGitHub ActionsのArtifactsからログファイルをダウンロードできます。

テスト結果

自動テスト時に自分のロボットが取得した点数は以下の手順で確認できます。

1. Actionsタブ → Burger-War Image Build → 結果を確認したいワークフロー実行結果をクリック

結果1

2. build-testジョブをクリック

結果2

3. Test Docker Imageをクリック

結果3

4. ログの一番下までスクロール

以下のように、相手ロボット(青)と自分のロボット(赤)が取得した点数を確認することができます。
以下の場合は、相手ロボットが1点、自分のロボットが5点とっていることが分かります。

結果4


ログファイル

実行したGitHub ActionsのArtifactsから自動テスト実行時のログファイルをダウンロードできます。

devのログ出力

ダウンロードしたログファイル(test_log/testディレクトリ配下)の概要は以下になります。

ログファイル 説明
gazebo/* $HOME/.gazebo/logディレクトリ配下のファイル
ros/* $HOME/.ros/logディレクトリ配下のファイル
judge/* burger_war_kit/judge/logsディレクトリ配下のファイル
screenshot/* 試験実行時の画面キャプチャ画像
sim_with_test.log burger_war_kit/scripts/sim_with_test.shの出力ログ
start_script.log burger_war_kit/scripts/start.sh or start_test.shの出力ログ
judge_server_result.log 試験終了時に審判サーバから取得した情報(/warState)

5.4 自動ビルドとテストで行っている処理


GitHub Actionsの自動テストで行っている主な処理は以下になります。

  1. burger-war-core/sim/roboイメージのビルド (docker build)
  2. burger-war-coreコンテナ起動 (docker run)
  3. ロボコンプロジェクトのビルド (catkin build)
  4. burger-war-coreのテスト (scripts/sim_run_test.sh)
  5. burger-war-core/sim/roboイメージのプッシュ ※手動実行で指定時のみ (docker push)

実際の処理は.github/workflows/image-test.ymlを参照して下さい。


5.5 GitHub Actionsによるテスト環境


ローカル環境

以下、ローカルでの実行環境のイメージです。

ローカル環境


ローカル環境では、コンテナ起動時にホストPCの$HOME/catkin_wsディレクトリをマウントしています。

本リポジトリのファイルは、$HOME/catkin_ws/srcディレクトリ配下に配置するため、ホストPC上での変更は、起動中のコンテナにも反映されます。

それにより、burger_war_devディレクトリ配下のファイルを修正したときに、burger-war-devイメージを再ビルドしなくていいようになっています。


GitHub Actions環境

以下、GitHub Actionsでの実行環境のイメージです。

テスト実施環境

GitHub ActionsではGUIを表示するディスプレイがない為、Xvfbという仮想ディスプレイを使用しているという違いがあります。

burger_war_kitのソースコードついては、リポジトリから毎回チェックアウトを行います。
※burger-war-kitイメージはghcr.ioにプッシュされているlatest版を利用します

もし、catkin_ws/src/以下にburger_war_kit/burger_war_dev以外のcatkinパッケージを追加する場合は、.github/workflows/image-test.ymlに追記するようにして下さい。

具体的な手順は次節で説明します。


5.6 GitHubからcatkinパッケージを追加する場合


catkin_ws/src/以下にburger_war_kit/burger_war_dev以外のcatkinパッケージを追加する場合は、.github/workflows/image-test.ymlに以下のように追記して下さい。
※追記場所は、burger_war_kit/burger_war_devをチェックアウトしている前後に追記して下さい

# 追加ライブラリのチェックアウト
- name: Checkout Library Repository
  uses: actions/checkout@v2
  with:
    repository: tysik/obstacle_detector
    path: catkin_ws/src/obstacle_detector

repositoryには、追加したいパッケージのGitHubリポジトリのパスを指定して下さい。

pathには、チェックアウトしたディレクトリ名を指定して下さい。
※親ディレクトリはcatkin_ws/src/から変更しないように注意して下さい


5.7 ビルドコマンドを変更したい場合


作成したロボットプログラムをビルドするコマンドは、デフォルトではcatkin buildです。

もし変更したい場合は、.github/workflows/image-test.ymlの以下のcatkin buildの部分を修正して下さい。

# ロボコンプロジェクトのビルド
- name: Build Robot Programs
  run: |
    docker exec -u developer -t ${{ env.IMAGE_NAME }} bash -l -c "catkin build"

その他

A. GitHub Actionsドキュメントリンク集


はじめに読んでおいたほうが良い公式ドキュメントへのリンク集です。

  1. GitHub Action入門
  2. 業務で利用する場合

B. ghcr.ioにプッシュするためのシークレット作成手順


自動テストにパスしたイメージをghcr.ioにプッシュするためにはログインする必要があります。

そのため、ユーザー名とパスワードの代わりにPersonal access tokenが必要になります。

事前に各自のGitHubアカウントでPersonal access tokenを作成し、それを各自のリポジトリのシークレットとして登録しておく必要があります。

以下の手順に従って、こちらのページから作成して下さい。


1. Personal access tokens の Generate new tokenをクリック

PAT作成手順2


2. Select scopes で権限設定

少なくとも以下にチェックを入れて、ページ下部にある[Generate token]をクリックして下さい。

  • write:packages
  • read:packages
  • delete:packages

PAT作成手順3


3. 生成された Personal access token をコピー

生成されたPersonal access token(下の画像の黒塗り部分)をコピーして下さい。

PAT作成手順4


4. シークレットを追加

各リポジトリで「Settings」→「Secrets」→「New Repository secret」をクリックして下さい。

シークレット1

以下の画面が表示されたら、NameはGHCR_PASSWORD、Valueには先程コピーしたPersonal access tokenの値を入力して、Add secretをクリックしてシークレットを追加して下さい。

シークレット2

同じように、NameがGHCR_USERNAME、Valueは各自のアカウント名のシークレットを追加して下さい。


C. ghcr.ioにプッシュしたイメージの公開


ghcr.ioにプッシュしたイメージを誰でも利用できるようにするには、イメージを公開する必要があります。

以下にburger-war-roboイメージを公開する手順を示します。
他に公開したいイメージがある場合は、同じ手順で公開して下さい。

1. アカウントのトップ画面でPackagesをクリック → 公開するイメージをクリック

公開1


2. Packages Settingsをクリック

公開2


3. Change visibilityをクリック

公開3


4. Publicを選択 → 公開するイメージ名を入力 → 一番下のボタンをクリック

公開4


上記手順後、以下のように「Private」の記載が消えていることを確認して下さい。

公開5