CIの成果物をGoogleDriveで共有するための設定手順
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-