gitbookやRe:VIEWのように、
成果物がPDFになるリポジトリをGitHubで管理している場合。
成果物のPDFをGoogleDriveに共有しておくと、
プレビューなどが利用でき確認が便利だと思います。
# また、GitHubにアカウントが無い人に確認して貰う運用もやりやすくなります。

ここでは、
CircleCIを例に、CIで生成した成果物をGoogleDriveに共有する手順を説明します。

GoogleDriveの操作は、以下のクライアントを利用します。

Google Drive CLI Client | GitHub
https://github.com/gdrive-org/gdrive

# 以前はprasmussenさんの個人リポジトリだったのですが、
# いつの間にかチームでメンテする体制に変わっているようですね。

gdriveコマンドの準備

まず、gdriveコマンドが利用できるように準備します。

DriveAPIの有効化

GCPの管理コンソールから、DriveAPIを有効化します。

API&Services | Google Cloud Platform
https://console.cloud.google.com/apis

「+ ENABLE APIS AND SERVICE」を選んで、「Google Drive API」を検索して有効化します。







Google APIサービスアカウントの作成

GCPの管理コンソールから、DriveAPIを有効化します。

IAM&Admin | Google Cloud Platform
https://console.cloud.google.com/iam-admin/iam

左メニューから「Service Account」を選んで画面切り替え。

「+ CREATE SERVICE ACCOUNT」を選び、以下を入力して「CREATE」を押下します。

  • display name: griveci
  • account id: griveci
  • description: GoogleDrive for CircleCI

Wizardを進め、「Create key(optional)」で、「+ CREATE KEY」が表示されたら、
json形式のキーを作成しておきます。





ダウンロードしたjsonファイルは、「~/.gdrive/」は以下に保存しておきます。

CLI Clientのダウンロードと実行確認

「Google Drive CLI Client」のページから対応する環境のバイナリをダウンロードします。

Google Drive CLI Client | GitHub
https://github.com/gdrive-org/gdrive

以降、「gdrive-osx-x64」をダウンロードしたものとして説明します。

以下のように実行し、ヘルプが表示出来る事を確認します。

$ ./gdrive-osx-x64 help

以下のように、前節で生成したjsonのキーを指定すると各種ファイル操作を実行できます。
# 以下の例はファイルの一覧

$ ./gdrive-osx-x64 --service-account xxxxx-xxxxxx.json list

共有用ディレクトリの準備

GoogleDriveに成果物を保存するためのディレクトリを作成しておきます。

以下のように実行して、ディレクトリを作成します。

$ ./gdrive-osx-x64 --service-account xxxxx-xxxxxx.json mkdir ci-artifacts
Directory xxxxxxxxxx created

この状態では、サービスアカウント以外から参照することが出来ないので、
自身のGoogleアカウントにアクセス権限を与えます。
以下のようにコマンドを実行します。
※最後のパラメータは作成したディレクトリのIDを指定

$ ./gdrive-osx-x64 --service-account xxxxx-xxxxxx.json share --email {あなたのgmailアドレス} --type user xxxxxxxxxx

作成したディレクトリ配下に、ファイルをアップロードする場合は、
以下のようにコマンドを入力します。
※「-p」パラメータは作成したディレクトリのIDを指定

$ ./gdrive-osx-x64 --service-account xxxxx-xxxxxx.json upload -p xxxxxxxxxx output.pdf

ディレクトリ配下のファイル一覧は、以下のコマンドで確認できます。
※「in parents」の前には作成したディレクトリのIDを指定

$ ./gdrive-osx-x64 --service-account xxxxx-xxxxxx.json list -q "'xxxxxxxxxx' in parents"

ブラウザから確認する場合は、以下のようなURLになります。

https://drive.google.com/drive/u/0/folders/{ディレクトリのID}

CircleCIからのgdriveコマンドの実行

CircleCIからgdriveコマンドを実行できるように設定します。

CircleCIのコンソールで対象リポジトリの「Settings」を開き、
「BUILD SETTINGS」の「Environment Variables」に、以下を追加します。

  • Name: GCLOUD_SERVICE_ACCOUNT_KEY
  • Value: 生成したjsonのキーのファイルの内容

.circleci/config.ymlに、
成果物をGoogleDriveにアップロードする処理を記述します。

具体的には、以下の処理を書きます。

  • gdriveコマンドのダウンロード
  • 環境変数からサービスアカウントのキーjsonファイルの復元
  • GoogleDrive上に既存の成果物がある場合は、既存の成果物ファイルを削除
  • GoogleDriveに成果物をアップロード

次に、各処理を記載したファイルのサンプルを示します。

.circleci/config.yml

version: 2
jobs:
  build:
    docker:
    - image: buildpack-deps:trusty
    working_directory: ~/repo
    steps:
    - checkout
    - restore_cache:
        keys:
        - v1-dependencies-
    - run:
        name: prepare gdrive command
        command: |
          mkdir -p ~/bin
          test ! -f ~/bin/gdrive \
           && curl -L -o ~/bin/gdrive "https://drive.google.com/uc?id=1Ej8VgsW5RgK66Btb9p74tSdHMH3p4UNb&export=download" \
           && chmod +x ~/bin/gdrive
          mkdir -p ~/.gdrive
          echo $GCLOUD_SERVICE_ACCOUNT_KEY > ~/.gdrive/service-account.json
    - run:
        name: build artifacts (dummy)
        command: |
          touch output.pdf
    - run:
        name: publish artifacts
        command: |
          PARENT_DIR_ID={ディレクトリのID}
          ARTIFACT_NAME=output-${CIRCLE_PULL_REQUEST##*/}.pdf
          mv output.pdf $ARTIFACT_NAME
          for id in $(~/bin/gdrive --service-account service-account.json list -q "name contains '$ARTIFACT_NAME' and '$PARENT_DIR_ID' in parents" | awk '{print $1}' | grep -v Id); do
            ~/bin/gdrive --service-account service-account.json delete $id
          done
          ~/bin/gdrive --service-account service-account.json upload -p $PARENT_DIR_ID $ARTIFACT_NAME
    - save_cache:
        paths:
        - "~/bin"
        key: v1-dependencies-