Slide 1

Slide 1 text

GitHubカスタムアクションを作って CI/CDを効率化しよう 株式会社オルターブース 木村健一郎

Slide 2

Slide 2 text

自己紹介 株式会社オルターブース クラウドソリューション部 副部⾧ 木村 健一郎(Kenichiro KIMURA) 大学院在籍中に未踏ソフトウェア創造事業に 採択され、その成果を元に設立したスタート アップに20年在籍。 2014年頃からクラウドの世界に触れる中で サーバレスとIoTに魅せられ、JAWS-UG福岡 やSORACOM UG九州のコアメンバーとして コミュニティ活動を行っている。 2020年にオルターブースにジョイン。テッ クリードとしてお客様の支援やプロダクトの 開発に従事している。 家に帰ると6歳の娘と戯れる日々。 AWS Samurai2019受賞 SORACOM MVC2020受賞 Twitter: @show_m001(しょーちゃん) Copyright © Alterbooth Inc. All Rights Reserved. 2

Slide 3

Slide 3 text

Copyright © Alterbooth Inc. All Rights Reserved. 3 株式会社オルターブース 会社名 〒812-0016 福岡市博多区博多駅南2-1-9 博多筑紫通りセンタービル8F 所在地 2015年3月19日 設立 1億472万5千円 資本金 25人(役員除く) 従業員 代表取締役 CEO 小島 淳 取締役 田中 務 取締役 嘉門 健一郎 監査役 仲田 和正 役員 西日本シティ銀行 みずほ銀行 北九州銀行 取引銀行 (1)クラウドコンピューティングを活用したシステム企画・開 発及び運営 (2)インターネット関連システムの企画・開発及び運用 (3)SaaS、ASPサービス及びIT商品の企画・開発及び運営 (4)前各号に附帯又は関連する一切の事業 事業内容 インフォコム株式会社 主要株主 日本マイクルソフト株式会社オイシックス・ラ・大地株式会社 インフォコム株式会社 株式会社博報堂DYメディアパートナー ズ EYストラテジー・アンド・コンサルティング株式会社 株式 会社エフ・ジェイエンターテイメントワークス その他 主要取引先 2023年7月1日現在 Alterbooth HISTORY 福岡県福岡市中央区にて株式会社オルターブース設立 3月 2015年 福岡県北九州市にて北九州ブランチオフィス開設 5月 2016年 Microsoft Partner Network Cloud Platform Silver Competency 取得 6月 Microsoft Innovation Award サムライインキュベート賞 受賞 3月 2017年 福岡市外提供する官民連携インキュベート施設Fukuoka Growth Nextに天神ブラン チオフィス開設 4月 Japan Microsoft Partner of the Year 2017 OSS on Azure賞 受賞 8月 Microsoft Cloud Solution Indirect Reseller認定 1月 2018年 事業会社よりシードラウンド増資を実施 2月 Microsoft Partner Network Cloud Platform Gold Competency 取得 9月 Japan Microsoft Partner of the Year 2019 特別賞 受賞 8月 2019年 複数VCよりプレシリーズAラウンド増資を実施 9月 2019年 Japan Microsoft Partner of the Year 2020 App Modernization賞 受賞 LINE Biz Partner Program コミュニケーション部門にてTechnology パートナー 認定 8月 2020年 株式会社エフ・ジェイエンターテイメントワークスと事業提携 複合型施設向けLINEモバイルオーダー FooPass を共同リリース 12月 Japan Microsoft Partner of the Year 2021 OSS on Azure賞 受賞 8月 2021年 LINE株式会社、日本マイクロソフト株式会社と小売業のDX支援を目的とした共同プロ ジェクトに参画 10月 2021年 インフォコム株式会社と資本業務提携実施、インフォコムグループに参画する 2月 2022年

Slide 4

Slide 4 text

Copyright © Alterbooth Inc. All Rights Reserved. 4 株式会社オルターブース 会社名 〒812-0016 福岡市博多区博多駅南2-1-9 博多筑紫通りセンタービル8F 所在地 2015年3月19日 設立 1億472万5千円 資本金 25人(役員除く) 従業員 代表取締役 CEO 小島 淳 取締役 田中 務 取締役 嘉門 健一郎 監査役 仲田 和正 役員 西日本シティ銀行 みずほ銀行 北九州銀行 取引銀行 (1)クラウドコンピューティングを活用したシステム企画・開 発及び運営 (2)インターネット関連システムの企画・開発及び運用 (3)SaaS、ASPサービス及びIT商品の企画・開発及び運営 (4)前各号に附帯又は関連する一切の事業 事業内容 インフォコム株式会社 主要株主 日本マイクルソフト株式会社オイシックス・ラ・大地株式会社 インフォコム株式会社 株式会社博報堂DYメディアパートナー ズ EYストラテジー・アンド・コンサルティング株式会社 株式 会社エフ・ジェイエンターテイメントワークス その他 主要取引先 2023年7月1日現在 Alterbooth HISTORY 福岡県福岡市中央区にて株式会社オルターブース設立 3月 2015年 福岡県北九州市にて北九州ブランチオフィス開設 5月 2016年 Microsoft Partner Network Cloud Platform Silver Competency 取得 6月 Microsoft Innovation Award サムライインキュベート賞 受賞 3月 2017年 福岡市外提供する官民連携インキュベート施設Fukuoka Growth Nextに天神ブラン チオフィス開設 4月 Japan Microsoft Partner of the Year 2017 OSS on Azure賞 受賞 8月 Microsoft Cloud Solution Indirect Reseller認定 1月 2018年 事業会社よりシードラウンド増資を実施 2月 Microsoft Partner Network Cloud Platform Gold Competency 取得 9月 Japan Microsoft Partner of the Year 2019 特別賞 受賞 8月 2019年 複数VCよりプレシリーズAラウンド増資を実施 9月 2019年 Japan Microsoft Partner of the Year 2020 App Modernization賞 受賞 LINE Biz Partner Program コミュニケーション部門にてTechnology パートナー 認定 8月 2020年 株式会社エフ・ジェイエンターテイメントワークスと事業提携 複合型施設向けLINEモバイルオーダー FooPass を共同リリース 12月 Japan Microsoft Partner of the Year 2021 OSS on Azure賞 受賞 8月 2021年 LINE株式会社、日本マイクロソフト株式会社と小売業のDX支援を目的とした共同プロ ジェクトに参画 10月 2021年 インフォコム株式会社と資本業務提携実施、インフォコムグループに参画する 2月 2022年 2022年 2月 インフォコム株式会社と資本業 務提携実施、インフォコムグループに参画す る

Slide 5

Slide 5 text

つまらない世界からもっと 刺激のある世界へ変化させよう! オルターブースは創業以来、クラウドにコミットしてきました。 クラウドによりお客様のサービスがモダナイズされ、新たな価値が提供できるようになる、これが変化です。つまらない世界とはお客様 が忘れてしまったイノベーションへの熱い想いであり、そんな想いをクラウドによって新しい価値を付け、輝きを取り戻す。これがオル ターブースのミッションです。 Copyright © Alterbooth Inc. All Rights Reserved. 5 コーポレートミッション

Slide 6

Slide 6 text

オルターブースの強み Copyright © Alterbooth Inc. All Rights Reserved. 6 オルターブースは創業以来一貫してクラウドに関する課題解決のご支援をしております。 特にMicrosoft AzureはMicrosoft MVPが多数在籍する当社にとっての強みとなっております。 当社の特徴はレガシーアプリケーションをクラウドへモダナイズすることです。DXを実現するために 必ず必要なもの、それはクラウドです。そのクラウドで実現できるDXを強力にサポートするのがオル ターブースです。 GitHub Services and Channel Partners LINE Technology Partner

Slide 7

Slide 7 text

Copyright © Alterbooth Inc. All Rights Reserved.

Slide 8

Slide 8 text

• GitHub Actionsでワークフローを書く際に、必要なactionが見つからない場 合は自作を検討しましょう • 複雑なコマンドをワークフローファイルに書くよりも可読性に優れ、メンテナンスしやすく、 再利用しやすくなります。 • GitHubカスタムアクションを作るにはDockerコンテナを使う方法と JavaScriptで書く方法があります • 例として、SORACOM Orbitを使う開発現場での事例を紹介します • 便利なカスタムアクションは是非マーケットプレイスにも公開しましょう いきなりですが、本日のまとめです Copyright © Alterbooth Inc. All Rights Reserved. 8

Slide 9

Slide 9 text

GitHub Actions Copyright © Alterbooth Inc. All Rights Reserved.

Slide 10

Slide 10 text

GitHub Actions GitHub 上で CI/CD のワークフローを構築・実行するための機能です。 “リポジトリへのプッシュ時” や “プルリクエストの作成時” など、GitHub での 様々なイベントを起点としたワークフローを作成することができます。 Copyright © Alterbooth Inc. All Rights Reserved.

Slide 11

Slide 11 text

ワークフローの作り方 ワークフローの定義例 name: sample workflow on: push: branches: [master,staging] jobs: build: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 - name: build run: npm run build - name: upload assets uses: actions/upload-artifact@v2 with: name: artifacts path: build/artifacts.zip GitHub ActionsではYAML ファイルでワークフローを定 義します。 Copyright © Alterbooth Inc. All Rights Reserved. 11

Slide 12

Slide 12 text

ワークフローの作り方 ワークフローの定義例 name: sample workflow on: push: branches: [master,staging] jobs: build: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 - name: build run: npm run build - name: upload assets uses: actions/upload-artifact@v2 with: name: artifacts path: build/artifacts.zip 実行したいことの書き方の一 つは、事前に定義されたアク ションを利用することです。 多くのアクションがGitHub で公開されていますので、そ れを組み合わせることでワー クフローを作成できます。 Copyright © Alterbooth Inc. All Rights Reserved. 12

Slide 13

Slide 13 text

ワークフローの作り方 ワークフローの定義例 name: sample workflow on: push: branches: [master,staging] jobs: build: runs-on: ubuntu-latest steps: - name: checkout uses: actions/checkout@v2 - name: build run: npm run build - name: upload assets uses: actions/upload-artifact@v2 with: name: artifacts path: build/artifacts.zip もう1つの書き方は、実行す るコマンドをそのまま記載す るものです。 実行環境(コンテナ)に含まれ ているコマンドをそのまま実 行できるので、必要なコマン ドをインストールするコマン ドを実行したりも出来ます。 Copyright © Alterbooth Inc. All Rights Reserved. 13

Slide 14

Slide 14 text

GitHubのマーケットプレイスで探してみましょう https://github.com/marketplace?type=actions アクションの探し方 Copyright © Alterbooth Inc. All Rights Reserved. 14

Slide 15

Slide 15 text

方法は2つあります • コマンドをワークフローに書く • アクションを自作する 具体的に例を見ながらお話しします。 見つからなかったときは Copyright © Alterbooth Inc. All Rights Reserved. 15

Slide 16

Slide 16 text

SORACOM Orbitを使った開発現場での実例 Copyright © Alterbooth Inc. All Rights Reserved. 16

Slide 17

Slide 17 text

SORACOM Orbitは、(株)ソラコムが提供するIoTプラットフォーム 「SORACOM」のサービスの1つで、インラインプロセッサと呼ばれるものです。 SORACOMプラットフォーム内で、自分で定義したプログラム(soralet)を使っ て通信データの加工をすることが可能です。 SORACOM Orbitについて Copyright © Alterbooth Inc. All Rights Reserved. 17 225303202307061400 { “temperature”:22.5, “humidity”: 30.3, “datetime”: “2023-07-06 14:00” }

Slide 18

Slide 18 text

ここでSORACOM Orbitについて皆さんに抑えていただきたいのは以下の点です。 • ビルドしたバイナリをクラウドにアップロードして動かす • アップロードはWEBコンソール/CLI/API呼び出しのいずれかで行う • アップロードするアクションが存在しない(2023年4月末時点) Copyright © Alterbooth Inc. All Rights Reserved. 18

Slide 19

Slide 19 text

パイプライン概要 workflow.yml パイプラインの全体象は、こ のようになります。 Copyright © Alterbooth Inc. All Rights Reserved. 19 on: push: branches: [master,staging] jobs: build-and-test: steps: - チェックアウト - ビルド - テスト - Artifactにsoraletのバイナリをアップロード deploy: needs: build-and-test steps: - Artifactをダウンロード - soraletをアップロード

Slide 20

Slide 20 text

パイプライン概要 workflow.yml この辺りはいつも通りなので 問題なし Copyright © Alterbooth Inc. All Rights Reserved. 20 on: push: branches: [master,staging] jobs: build-and-test: steps: - チェックアウト - ビルド - テスト - Artifactにsoraletのバイナリをアップロード deploy: needs: build-and-test steps: - Artifactをダウンロード - soraletをアップロード

Slide 21

Slide 21 text

パイプライン概要 workflow.yml on: push: branches: [master,staging] jobs: build-and-test: steps: - チェックアウト - ビルド - テスト - Artifactにsoraletのバイナリをアップロード deploy: needs: build-and-test steps: - Artifactをダウンロード - soraletをアップロード 今回は、この部分を作ります Copyright © Alterbooth Inc. All Rights Reserved. 21

Slide 22

Slide 22 text

cliコマンドでの記述 アップロード部分のみ抜粋 steps: - Artifactをダウンロード - name: install soracom-cli run: curl –fsSL https://url-of-soracom- cli/install.sh | bash - name: upload env: AUTH_KEY: ${{ secrets.AUTH_KEY }} AUTH_KEY_ID: ${{ secrets.AUTH_KEY_ID}} SORALET_ID: ${{ env.SORALET_ID }} run: | /usr/local/bin/soracom --auth-key-id $AUTH_KEY_ID --auth-key $AUTH_KEY soralets upload --soralet-id $SORALET_ID --body @soralet-optimized.wasm ワークフローを実行する環境 (コンテナ)にsoracom cliを インストールして、cliコマン ドでアップロードをします。 Copyright © Alterbooth Inc. All Rights Reserved. 22

Slide 23

Slide 23 text

cliコマンドでの記述 アップロード部分のみ抜粋 steps: - Artifactをダウンロード - name: install soracom-cli run: curl –fsSL https://url-of-soracom- cli/install.sh | bash - name: upload env: AUTH_KEY: ${{ secrets.AUTH_KEY }} AUTH_KEY_ID: ${{ secrets.AUTH_KEY_ID}} SORALET_ID: ${{ env.SORALET_ID }} run: | /usr/local/bin/soracom --auth-key-id $AUTH_KEY_ID --auth-key $AUTH_KEY soralets upload --soralet-id $SORALET_ID --body @soralet-optimized.wasm soracom cliのインストーラ をダウンロードし、実行しま す Copyright © Alterbooth Inc. All Rights Reserved. 23

Slide 24

Slide 24 text

cliコマンドでの記述 アップロード部分のみ抜粋 steps: - Artifactをダウンロード - name: install soracom-cli run: curl –fsSL https://url-of-soracom- cli/install.sh | bash - name: upload env: AUTH_KEY: ${{ secrets.AUTH_KEY }} AUTH_KEY_ID: ${{ secrets.AUTH_KEY_ID}} SORALET_ID: ${{ env.SORALET_ID }} run: | /usr/local/bin/soracom --auth-key-id $AUTH_KEY_ID --auth-key $AUTH_KEY soralets upload --soralet-id $SORALET_ID --body @soralet-optimized.wasm soracom cliの実行に必要な シークレット等を定義します Copyright © Alterbooth Inc. All Rights Reserved. 24

Slide 25

Slide 25 text

cliコマンドでの記述 アップロード部分のみ抜粋 steps: - Artifactをダウンロード - name: install soracom-cli run: curl –fsSL https://url-of-soracom- cli/install.sh | bash - name: upload env: AUTH_KEY: ${{ secrets.AUTH_KEY }} AUTH_KEY_ID: ${{ secrets.AUTH_KEY_ID}} SORALET_ID: ${{ env.SORALET_ID }} run: | /usr/local/bin/soracom --auth-key-id $AUTH_KEY_ID --auth-key $AUTH_KEY soralets upload --soralet-id $SORALET_ID --body @soralet-optimized.wasm soracom cliでsoralets uploadコマンドを実行し、 アップロードします。 Copyright © Alterbooth Inc. All Rights Reserved. 25

Slide 26

Slide 26 text

• 可読性が低い • メンテナンス性が悪い • 再利用が困難 この問題を解決するためには、カスタムGitHub Actionを作成するとよいです。 cliコマンドで記載することの問題点 Copyright © Alterbooth Inc. All Rights Reserved. 26

Slide 27

Slide 27 text

カスタムアクションの作り方は3つあります • Dockerコンテナ • JavaScript • 複合アクション 今回はDockerコンテナとJavaScriptでカスタムアクションを作る方法の概要を 説明します https://docs.github.com/ja/actions/creating-actions カスタムアクションの作り方 Copyright © Alterbooth Inc. All Rights Reserved. 27

Slide 28

Slide 28 text

Dockerコンテナの場合 Copyright © Alterbooth Inc. All Rights Reserved. 28

Slide 29

Slide 29 text

Dockerコンテナ Dockerfile FROM ubuntu:22.04 RUN apt-get update && apt-get install -y ¥ curl ¥ jq ¥ && rm -rf /var/lib/apt/lists/* RUN curl -fsSL https://raw.githubusercontent.com/soracom/sora com-cli/master/install.sh | bash COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] まずはDockerfileを作成しま す。 コンテナで最後に実行される コマンド(entrypont)が、こ のアクションの実行内容にな ります。 Copyright © Alterbooth Inc. All Rights Reserved. 29

Slide 30

Slide 30 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'docker' image: 'Dockerfile’ env: SORACOM_AUTHKEY: ${{ inputs.soracom_auth_key }} action.ymlというメタデータ ファイルを作成します。 このファイルがあることで GitHubはこのリポジトリが カスタムアクションであるこ とを認識します。 Copyright © Alterbooth Inc. All Rights Reserved. 30

Slide 31

Slide 31 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'docker' image: 'Dockerfile’ env: SORACOM_AUTHKEY: ${{ inputs.soracom_auth_key }} アクションに関するメタデー タを記載します。 マーケットプレイスに登録す るときにこの情報が利用され ます。 Copyright © Alterbooth Inc. All Rights Reserved. 31

Slide 32

Slide 32 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'docker' image: 'Dockerfile’ env: SORACOM_AUTHKEY: ${{ inputs.soracom_auth_key }} アクションの入力値を記載し ます。 Copyright © Alterbooth Inc. All Rights Reserved. 32

Slide 33

Slide 33 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'docker' image: 'Dockerfile’ env: SORACOM_AUTHKEY: ${{ inputs.soracom_auth_key }} アクションの出力値を記載し ます。 この値がワークフロー内で ${{ steps.{ステップ ID}.outputs.{出力名 }} という形で参照できます。 Copyright © Alterbooth Inc. All Rights Reserved. 33

Slide 34

Slide 34 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'docker' image: 'Dockerfile’ env: SORACOM_AUTHKEY: ${{ inputs.soracom_auth_key }} アクションの実行に関するこ とを記述します。 ここではdockerを使うこと、 コンテナイメージは Dockerfileから作ること、環 境変数 SORACOM_AUTHKEYに、 入力値で受け取った soracom_auth_keyを渡す ことが書かれています。 Copyright © Alterbooth Inc. All Rights Reserved. 34

Slide 35

Slide 35 text

エントリーポイント entrypoint.sh #!/bin/bash if [ -z "SORACOM_AUTHKEY" ] then echo "No SORACOM_AUTHKEY environment variable supplied" exit 1 fi … delimiter=“$(openssl rand –hex 8)” echo “result<<${delimiter}” >> “${GITHUB_OUTPUT}” /usr/local/bin/soracom ¥ --soracom-auth-key $SORACOM_AUTHKEY ¥ soralets upload ¥ 2>&1 | tee -a "${GITHUB_OUTPUT}" echo "${delimiter}" >> "${GITHUB_OUTPUT}" exit 0 今回はアクションの本体であ るエントリーポイントをシェ ルスクリプトで準備しました。 goやpythonなど他の言語で 書いても問題ありません。 Copyright © Alterbooth Inc. All Rights Reserved. 35

Slide 36

Slide 36 text

エントリーポイント entrypoint.sh #!/bin/bash if [ -z "SORACOM_AUTHKEY" ] then echo "No SORACOM_AUTHKEY environment variable supplied" exit 1 fi … delimiter=“$(openssl rand –hex 8)” echo “result<<${delimiter}” >> “${GITHUB_OUTPUT}” /usr/local/bin/soracom ¥ --soracom-auth-key $SORACOM_AUTHKEY ¥ soralets upload ¥ 2>&1 | tee -a "${GITHUB_OUTPUT}" echo "${delimiter}" >> "${GITHUB_OUTPUT}" exit 0 入力値をチェックし、エラー の場合は0以外の終了コード で終了させます。 Copyright © Alterbooth Inc. All Rights Reserved. 36

Slide 37

Slide 37 text

エントリーポイント entrypoint.sh #!/bin/bash if [ -z "SORACOM_AUTHKEY" ] then echo "No SORACOM_AUTHKEY environment variable supplied" exit 1 fi … delimiter=“$(openssl rand –hex 8)” echo “result<<${delimiter}” >> “${GITHUB_OUTPUT}” /usr/local/bin/soracom ¥ --soracom-auth-key $SORACOM_AUTHKEY ¥ soralets upload ¥ 2>&1 | tee -a "${GITHUB_OUTPUT}" echo "${delimiter}" >> "${GITHUB_OUTPUT}" exit 0 コマンドを実行し、その結果 を ${GITHUB_OUTPUT}と いう環境変数(自動で設定さ れる)で表されるファイルに 出力します。 ここでは特殊文字のエスケー プと複数行の値のためにデリ ミタを使っていますが、基本 的には output_id=output という形になればOKです。 Copyright © Alterbooth Inc. All Rights Reserved. 37

Slide 38

Slide 38 text

ワークフローの記述 ワークフローファイル 作成したものをGitHubに プッシュしたら、ワークフ ローをこのように修正します。 リリースを作成した場合はコ ミットIDではなく、リリース 名での指定も可能です。 Copyright © Alterbooth Inc. All Rights Reserved. 38 steps: - Artifactをダウンロード - name: upload uses: your-github-user-name/repository -name@commit-id with: soracom_auth_key: ${{ secrets.AUTH_KEY }} ……

Slide 39

Slide 39 text

javascriptの場合 Copyright © Alterbooth Inc. All Rights Reserved. 39

Slide 40

Slide 40 text

メタデータファイル action.yml name: 'アクションの名前' description: 'アクションの説明' branding: icon: upload-cloud color: blue inputs: soracom_auth_key: description: 'SORACOM AUTH KEY' required: true ・・・ outputs: result: description: 'Result of deployment’ runs: using: 'node16' main: 'dist/index.js' アクションの実行に関する部 分以外はDockerの場合と同 様です。 実行環境にはnode12または node16のいずれかを指定し ます。環境変数のマップは指 定不要です。 Copyright © Alterbooth Inc. All Rights Reserved. 40

Slide 41

Slide 41 text

TypeScriptファイル index.ts import * as core from "@actions/core"; import * as soracom from "./soracom"; async function main() { const soraletApi = new soracom.API.SoraletApi(); const authRequest = new soracom.Model.AuthRequest(); authRequest.authKey = core.getInput("soracom_auth_key", { required: true }); …… try { const uploadResult = await soraletApi.uploadSoraletCode( soraletId, requestFile, "application/octet-stream"); core.setOutput("result", uploadResult.body); } catch (error) { core.setFailed(errorMessage); } } 今回はTypeScriptで記述し、 トランスパイルして dist/index.jsを作ります。 Copyright © Alterbooth Inc. All Rights Reserved. 41

Slide 42

Slide 42 text

TypeScriptファイル index.ts import * as core from "@actions/core"; import * as soracom from "./soracom"; async function main() { const soraletApi = new soracom.API.SoraletApi(); const authRequest = new soracom.Model.AuthRequest(); authRequest.authKey = core.getInput("soracom_auth_key", { required: true }); …… try { const uploadResult = await soraletApi.uploadSoraletCode( soraletId, requestFile, "application/octet-stream"); core.setOutput("result", uploadResult.body); } catch (error) { core.setFailed(errorMessage); } } 入出力値を取り扱うには、公 式のツールキットパッケージ である@actions/coreを使い ます。 SORACOM APIを呼び出す コードはswaggerドキュメン トから自動生成したものを使 います。 Copyright © Alterbooth Inc. All Rights Reserved. 42

Slide 43

Slide 43 text

TypeScriptファイル index.ts import * as core from "@actions/core"; import * as soracom from "./soracom"; async function main() { const soraletApi = new soracom.API.SoraletApi(); const authRequest = new soracom.Model.AuthRequest(); authRequest.authKey = core.getInput("soracom_auth_key", { required: true }); …… try { const uploadResult = await soraletApi.uploadSoraletCode( soraletId, requestFile, "application/octet-stream"); core.setOutput("result", uploadResult.body); } catch (error) { core.setFailed(errorMessage); } } 入力値を受け取るには @core.getInput()を使いま す。 Copyright © Alterbooth Inc. All Rights Reserved. 43

Slide 44

Slide 44 text

TypeScriptファイル index.ts import * as core from "@actions/core"; import * as soracom from "./soracom"; async function main() { const soraletApi = new soracom.API.SoraletApi(); const authRequest = new soracom.Model.AuthRequest(); authRequest.authKey = core.getInput("soracom_auth_key", { required: true }); …… try { const uploadResult = await soraletApi.uploadSoraletCode( soraletId, requestFile, "application/octet-stream"); core.setOutput("result", uploadResult.body); } catch (error) { core.setFailed(errorMessage); } } 出力値を渡すには @core.setOutput()を使いま す。 Copyright © Alterbooth Inc. All Rights Reserved. 44

Slide 45

Slide 45 text

TypeScriptファイル index.ts import * as core from "@actions/core"; import * as soracom from "./soracom"; async function main() { const soraletApi = new soracom.API.SoraletApi(); const authRequest = new soracom.Model.AuthRequest(); authRequest.authKey = core.getInput("soracom_auth_key", { required: true }); …… try { const uploadResult = await soraletApi.uploadSoraletCode( soraletId, requestFile, "application/octet-stream"); core.setOutput("result", uploadResult.body); } catch (error) { core.setFailed(errorMessage); } } エラーで終了させるときは @core.setFailed()を使いま す。 Copyright © Alterbooth Inc. All Rights Reserved. 45

Slide 46

Slide 46 text

アクションの実行時は、実行環境のコンテナにリポジトリの内容をコピーし、指 定したコマンド(dist/index.js)が実行されます。 このため、実行に必要なファイルが全てリポジトリに含まれている必要がありま す。 外部パッケージのファイルを自分のリポジトリに含めたくない場合は、例えば vercel/nccのような、依存関係をまとめて1つのJSファイルにしてくれるような パッケージを利用します。 注意点 Copyright © Alterbooth Inc. All Rights Reserved. 46

Slide 47

Slide 47 text

ワークフローの記述 ワークフローファイル 作成したものをGitHubに プッシュしたら、ワークフ ローをこのように修正します。 リリースを作成した場合はコ ミットIDではなく、リリース 名での指定も可能です。 Copyright © Alterbooth Inc. All Rights Reserved. 47 steps: - Artifactをダウンロード - name: upload uses: your-github-user-name/repository -name@commit-id with: soracom_auth_key: ${{ secrets.AUTH_KEY }} ……

Slide 48

Slide 48 text

比較 Copyright © Alterbooth Inc. All Rights Reserved. 48 入出力 実行環境 アクションの記述 環境変数 ワークフローで指定した コンテナ コマンドをそのままワー クフローに記述。 実行環境にないコマンド はインストールが必要 コマンド記述 入力は環境変数、出力は ファイル 指定したDockerfileから ビルドしたコンテナ コンテナで実行できるも のなら何でも利用可能 Dockerコンテナ ツールキットパッケージ を利用 GitHubが提供する専用の コンテナ Javascript(typescript) javascript

Slide 49

Slide 49 text

どの方法を使うといいかの判断フロー Copyright © Alterbooth Inc. All Rights Reserved. 49 コマンドで簡潔に処理が書ける JavaScriptで書ける コマンドの準備に多くのステップが 必要/特定の環境が必要 出力を次のアクションで 使う YES NO YES NO ワークフローに コマンドを記述 NO YES Dockerコンテナ javascript YES NO スタート

Slide 50

Slide 50 text

action.ymlがあるリポジトリをプッシュすると、GitHubの画面で「このリポジ トリはアクションみたいだけどマーケットプレイスに登録しない?手順はこっち だよ!」(意訳)と出てくるのでそれに従う マーケットプレイスへの登録 Copyright © Alterbooth Inc. All Rights Reserved. 50

Slide 51

Slide 51 text

Copyright © Alterbooth Inc. All Rights Reserved. 51

Slide 52

Slide 52 text

https://github.com/marketplace/actions/upload-soralet Upload Soralet Copyright © Alterbooth Inc. All Rights Reserved. 52

Slide 53

Slide 53 text

https://github.com/marketplace/actions/update-soracom-orbit-configuration Update SORACOM Orbit configuration Copyright © Alterbooth Inc. All Rights Reserved. 53

Slide 54

Slide 54 text

ここでSORACOM Orbitについて皆さんに抑えていただきたいのは以下の点です。 • ビルドしたバイナリをクラウドにアップロードして動かす • アップロードはWEBコンソール/CLI/API呼び出しのいずれかで行う • アップロードするアクションが存在しない(2023年4月末時点) • アップロードするアクションあります(2023年7月現在) Copyright © Alterbooth Inc. All Rights Reserved. 54

Slide 55

Slide 55 text

• GitHub Actionsでワークフローを書く際に、必要なactionが見つからない場 合は自作を検討しましょう • 複雑なコマンドをワークフローファイルに書くよりも可読性に優れ、メンテナンスしやすく、 再利用しやすくなります。 • GitHubカスタムアクションを作るにはDockerコンテナを使う方法と JavaScriptで書く方法があります • 例として、SORACOM Orbitを使う開発現場での事例を紹介しました • 便利なカスタムアクションは是非マーケットプレイスにも公開しましょう まとめ Copyright © Alterbooth Inc. All Rights Reserved. 55

Slide 56

Slide 56 text

• [ブログ]SORACOM Orbit向けGitHub Actionを作りました https://zenn.dev/showm001/articles/2023-05-22-01 • [ブログ] GitHubカスタムアクションの作り方(Dockerコンテナ編) https://aadojo.alterbooth.com/entry/2023/06/01/183019 • [ブログ] GitHubカスタムアクションの作り方(JavaScript編) https://aadojo.alterbooth.com/entry/2023/05/23/180453 • カスタムアクションについて https://docs.github.com/ja/actions/creating-actions/about-custom- actions • カスタム GitHub アクションを作成して公開する https://learn.microsoft.com/ja-jp/training/modules/create-custom- github-actions/ 参考URL Copyright © Alterbooth Inc. All Rights Reserved. 56

Slide 57

Slide 57 text

つまらない世界からもっと刺激のある世界へ変化させよう! Copyright © Alterbooth Inc. All Rights Reserved. 57

Slide 58

Slide 58 text

No content