2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DirectCloud-BOXにファイルをアップロードするGitHub Actionを作ってみた

Last updated at Posted at 2021-08-22

はじめに

この記事は「Qiita エンジニアフェスタ 2021」の参加記事です。

DirectCloud-BOX は、DropBoxBox などのような、いわゆるクラウドストレージです (全部ナントカ Box ですね…)
上記ページの概要を見ればどのようなものかが掴めるかなと思います。

概要

DirectCloud-BOX の API を利用し、GitHub Actions のワークフロー内からファイルをアップロードする JavaScript Action を作ってみました。

ユースケースとしては、こんな感じでしょうか。

  • パッケージリポジトリや public な成果物ストアには上げたくないが、社内で共有したい SDK やバイナリファイルをアップロードする
  • デザインアセットを生成してアップロードする
  • カバレッジレポートなどテスト成果物系をアップロードする

記載されているワークフローの YAML をコピペして GitHub Actions を設定し、必要な環境変数を取得・設定すれば以下のスクショのように動作します。
image.png
次の項では、もう少し詳細な設定手順を説明します。

利用手順

DirectCloud-BOX API を使う

利用申請

フリープランを申し込みます。その後メールでログイン情報が届きます。

API を有効化する

DirectCloud-BOX の管理画面より API を有効化し、ServiceService Key を取得します。

GitHub Actions を設定する

GitHub Actions について、詳しくはGitHub Actions Documentation - GitHub Docsを参照してください。
ここでは、今回作成した Action を利用するまでの手順を簡単に説明します。

ワークフローを設定する

下記のページの Usage より、YAML をコピーしておきます。

Action を使いたいリポジトリの Actions タブから設定します。
image.png
デフォルトの設定が予め入っていますが、先程コピーした YAML で全て置き換えます。特に支障がなければデフォルトブランチ (main) にコミットしておきます。
image.png
先程のコミットをトリガーにビルドが動き出しますが、必要な環境変数を設定していないため失敗します。
image.png

GitHub Encrypted Secrets を設定する

GitHub Actions の中で認証情報を利用できるようにします。

Encrypted Secrets について、詳しくは Encrypted secrets - GitHub Docs を参照してください。

Settings -> Secrets を開き、 New repository secret を押下します。
image.png
Secrets 名 (スクショでは DIRECTCLOUDBOX_SERVICE ) と、それに応じた値を入力してください。
image.png
5 つと少し多いですが、それぞれ対応する値を登録したら利用準備完了です。

環境変数 説明
DIRECTCLOUDBOX_SERVICE 管理画面より発行した API キーの Service
DIRECTCLOUDBOX_SERVICE_KEY 管理画面より発行した API キーの Service Key
DIRECTCLOUDBOX_CODE 会社 ID (登録時にメールで届くもの)
DIRECTCLOUDBOX_ID ユーザー ID
DIRECTCLOUDBOX_PASSWORD ユーザーパスワード

Actions タブから再度実行して下記のようなログが出れば成功です。
失敗する場合は Secrets の Key と Value 双方のコピペミスがないか確認してみてください。
image.png
DirectCloud-BOXのWebアプリ からアップロードしたファイルを確認してみましょう。 (サンプルにしたけど md ファイルはWebアプリからはプレビューできなかったという :innocent:)

ハマりポイント

DirectCloud-BOX API 利用時のハマりポイント

Service, Service Key の発行が分かりにくい

2021/08/22 時点では、DirectCloud-BOX API リファレンスに以下のように記載があること、その他マニュアルにも記載がないように思えたため、問い合わせをして設定方法をご教示いただきました。

service、service_key の発行につきましては、お問合せ窓口よりご連絡ください

実際は手順にも書いたとおり、管理画面から発行が可能でした。

POST リクエストは form-data の利用が必須

DirectCloud-BOX API を実行するまでにハマった事と感想 - Qiita にも書いてくださっていますが、JSON body だと There is no required input value というエラーとともにリクエストが失敗します。

突然の node

Folder, File を操作しようとして API リファレンスを眺めると node というパラメータが必要になってきます。
おそらく DirectCloud-BOX 上で内部的にフォルダ管理に利用している値 (グラフ?) だと思うのですが、重要な割に取得方法が初見だと分からなかったです。。

以下の方法で取得できそうです。

  • フォルダリストの照会 APInode 無指定で実行すれば起点となる My BoxShared Box の node 値を知れるので、そこから芋づる式に API を叩いていく
  • WebApp の URL の末尾の Path (My Box なら MQ==)が node 値を Base64 エンコードしたものなので、デコードする
$ echo "MQ==" | base64 -d
1

GitHub Actions 開発時のハマりポイント

いくつか小さくつまずいたので箇条書きで。

  • JavaScript Action で利用できる最新の Node.js が node12

    • 手元では 14 を利用して書いてしまっており、微妙な記法の差異がありました。
  • Fork したリポジトリでは Secrets 使えない制限が Repository Template 利用時も適用されている?

    • 今回作成した Actions のログですが、何かが設定されていれば *** のようにマスクされた形で表示される変数が空になってしまっています。
      image.png
    • ちょっと情報見つけられなかったので知ってる方いればご教示いただければと思います:pray:
  • ワークフローの更新タイミング

    • 普段利用している CI ツール 1 は PR 時にワークフローの変更が適用されるのですが、GitHub Actions はデフォルトではメインブランチにマージされるまで適用されなさそうでした

おわりに

DirectCloud-BOX の API を利用し、GitHub Actions のワークフロー内からファイルをアップロードする JavaScript Action を作ってみました。
DirectCloud-BOX の利用登録と認証情報の取得、GitHub Actions の設定を行うだけで Actions 内から任意のファイルのアップロードが可能です。

また、DirectCloud-BOX の API 利用や GitHub Actions 開発のハマりポイントについてもいくつか触れました。

この記事は「Qiita エンジニアフェスタ 2021」の参加記事です。

  1. Screwdriver.cdという CI/CD ツールを利用しています (参考: GKE で Screwdriver.cd を動かしてみる)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?