Google App ScriptからGitLab APIを呼び出してみた
投稿者:今井

初めに
こんにちは。CI部の今井といいます。
最近、Google App Script (以降、GAS と書きます) から GitLab API を呼び出すことがあったため、備忘録としてこちらのブログを書かせていただきます。
最後までご覧いただければ幸いです。
GASと今回のブログで行いたいこと
GAS については Google の公式ドキュメントからの引用とさせていただきます。
Google Apps Script は、Google Workspaceと統合するビジネス アプリケーションをすばやく簡単に作成するための、高速なアプリケーション開発プラットフォームです。最新の JavaScript でコードを記述でき、Gmail、カレンダー、ドライブなどの Google Workspace お気に入りのアプリケーションの組み込みライブラリを利用できます。何もインストールしません。ブラウザ内でコードエディタが表示され、スクリプトが Google のサーバーで実行されます。
今回は Google Form から回答があったことをトリガーにして GitLab API を呼び出して、回答内容を反映したファイルを作成するコミットを含めたブランチを作成し、そのブランチからマージリクエストを行うところまで行いたいと思います。
あまり GAS から GitLab API を呼び出すことを行っている記事が見当たらなかったので、ご参考になれば幸いです。
ちなみに今回作成する GAS は GCP のプロジェクトを自動作成するときに動く Terraform の Variables ファイルを更新するために利用するので、 GitLab で編集するファイルは Terraform のファイルとなります。
GAS を作る際の注意点
今回作成する GAS は Google Form の回答があったときに動くため、その Google Form の以下の画像のところから作成するようにしなければなりません。
そして、
GAS が実行されるトリガーとして、フォームが回答されたときにしたいので、以下の画像のように設定します。
さらにスクリプトプロパティに以下の3つを画像のように設定します。
- BILLING_ACCOUNT_ID_NIC_TRAINING(GCPのビリングアカウントID)
- GITLAB_ACCESS_TOKEN(GitLabのアクセストークンの値、API 呼び出し権限あり)
- GITLAB_PROJECT_ID(GitLabのプロジェクトID)
これで、 GAS のコード以外で設定することはすべて完了しました。
次からは実際にコードに書いたことを説明して行きたいと思います。
GAS のコードについて
今回私が書いたコードだけを見たいという方はこちらに公開していますので、ご覧ください。
すべてベタ打ちで書いているため、皆さんがおのおのの環境で使いやすいように変更してください。
まず最初にコードの最初にスクリプトプロパティで設定した変数を呼び出す必要があったので、以下のコードにより変数を取得・設定しました。
var prop = PropertiesService.getScriptProperties();
var GITLAB_ACCESS_TOKEN = prop.getProperty("GITLAB_ACCESS_TOKEN");
var GITLAB_PROJECT_ID = prop.getProperty("GITLAB_PROJECT_ID");
var BILLING_ACCOUNT_ID_NIC_TRAINING = prop.getProperty("BILLING_ACCOUNT_ID_NIC_TRAINING");
そしてその後に Google Form の回答内容を取得するため、以下のようなコードを書きます。
この時のコードはおのおのの Google Form の内容に左右されることだと思うので、私の書いたコードもそこまで抜粋しませんが、以下のように書くことになると思います。
基本的にはresponse.getItemResponses()を使って Google Form の回答内容を Array 型で取得し、その後に取得したい回答の番号とgetResponse()を追加することで、回答内容を取得・設定することが可能です。
const itemResponses = e.response.getItemResponses();
var pj_name = itemResponses[5].getResponse();
console.log(pj_name);
そして、次が今回のブログの本題である Gitlab API の呼び出し部分になります。
GAS では外部の API の呼び出すときにUrlFetchApp.fetch(URL, Options)で行う必要があります。
今回は 2 つの GitLab API を呼び出すので、それぞれの URL と Options を設定します。
まず、 1 回目の API の呼び出しとしては、Repository files API を使うためのコードを以下に示します。
この時の UrlFetchApp.fetch の引数の URL には末尾に編集したいファイルのファイルパスを載せる必要があります。
そして、 headers には認証に利用する GitLab のアクセストークンと contentType を指定します。
payload の中には GitLab のプロジェクト ID、新しく作るブランチの名前もしくはすでにあるブランチの名前、新しくブランチを作るのであればそれのもとになるブランチ名、コミットメッセージ、編集したいファイルの内容を指定します。
今回のメソッドとしては PUT なので、PUTを指定します。
これで、GitLab API の呼び出しで必要な設定は完了となります。
var commitURL = 'https://gitlab.com/api/v4/projects/' + GITLAB_PROJECT_ID + '/repository/files/environments%2Ftemplate%2Fterraform%2Etfvars';
var headers = {
'Authorization':'Bearer ' + GITLAB_ACCESS_TOKEN,
'contentType': 'application/json'
};
var commitData = {
'id': GITLAB_PROJECT_ID,
'branch': pj_name,
'start_branch': 'main',
'commit_message': 'update terraform.tfvars',
'content': 'project_name = "' + pj_name + '"\nproject_id = "' + pj_id + '"\nfolder_name = "' + folder + '"\nbilling_account = "' + billing_account + '"\nowner_account = ["' + owner_account_list.join('","') + '"]'
};
var commitOptions = {
'method' : 'PUT',
'headers': headers,
'payload' : commitData
};
2 回目の GitLab API の呼び出しはMerge requests APIとなります。
基本的には payload やメソッドの内容が変わるだけですので、気になる方はこちらに公開していますので、ご覧ください。
これで GAS の準備が整ったので、実際に Google Form を回答してみて、GitLab に MR が作成されるかを確認したいと思います。
GAS が正常に動くかを確認
それでは実際に Google Form を回答してみて、GitLab に MR が作成されるかを確認していきたいと思います。
まずは Google Form を回答してみます。
基本的にはテストという感じで回答しました。
これが回答された後に GitLab に MR が作られたか確認します。
ちゃんと GitLab で MR が作られていました。
ファイル内容も既存で存在していたファイルの内容が変わっていることがわかります。
そして、今回作成した GAS がちゃんと動いていることがわかりました。
最後に
今回は Google Form から回答があったことをトリガーにして GitLab API を呼び出して、回答内容を反映したファイルを作成するコミットを含めたブランチを作成し、そのブランチからマージリクエストを行うところまで行いました。
作成したコードは公開しておりますので、いないとは思いますが利用する場合はコピペして適当に改変して利用してください。
誰かの参考になったなら幸いです。
ご一読ありがとうございました。