AWS
Electron
ElectronDay 23

AWS CodeBuildでElectronをビルドしてGitHubにReleaseを作る

More than 1 year has passed since last update.

tagをGitHubにpushしたらAWS CodeBuildでElectronのビルドが走ってGitHubのReleaseにzipをアップロードするところまでを自動化してみた。GitHubとCodeBuildをどうインテグレーションするのがいいかよくわからなかったのでAPI GatewayとLambdaでつないだ。

Kobito.tS0K7K.png

コードはここに。

https://github.com/hokaccha/electron-build-test

Electronのビルド

まずはElectronをビルドするビルドスクリプトを書く。

build.sh
#!/bin/sh

set -e

OUT_DIR=./dist

rm -rf $OUT_DIR

./node_modules/.bin/electron-packager . Test \
--platform=darwin \
--arch=x64 \
--overwrite \
--app-version=$BUILD_VERSION \
--build-version=$BUILD_VERSION \
--out=$OUT_DIR

cd dist
zip -qry Test-$BUILD_VERSION-darwin-x64.zip Test-darwin-x64

これで次のようなコマンドを実行してzipファイルを作れるようにしとく。

$ BUILD_VERSION=v1.0.0 ./build.sh

次にAWS CodeBuildでprojectを作って、buildspec.ymlをこんな感じで書いてAWSコンソールとかからビルド実行すればビルドできるようになる。環境変数は実行時に指定できる。

buildspec.yml
version: 0.1
phases:
  install:
    commands:
      - npm install
  build:
    commands:
      - /bin/sh ./build.sh

GitHubのWebhookでCodeBuildをキックする

次にLambdaにfunctionを作る。

exports.handler = (event, context, callback) => {
  var AWS = require('aws-sdk');
  var codebuild = new AWS.CodeBuild();
  var body = JSON.parse(event.body);
  if (body.ref_type !== 'tag') {
    callback(null, { statusCode: 200 });
    return;
  }
  codebuild.startBuild({
    projectName: 'electron-build-test',
    sourceVersion: body.ref,
    environmentVariablesOverride: [
      { name: 'BUILD_VERSION', value: body.ref },
      { name: 'GITHUB_ACCESS_TOKEN', value: process.env.GITHUB_ACCESS_TOKEN },
    ],
  }, function(err) {
      callback(err, { statusCode: err ? 500 : 200 });
  });
};

やってるのはGitHubのWebhookを受けて、CodeBuildのstartBuildを呼んでるだけ。ここでGitHubのアクセストークンをLambdaの環境変数に指定しとく。最初CodeBuild側に指定してて、トークンが反映されなくてはまったけど、呼び出し側でenvironmentVariablesOverrideを指定した場合マージされずに上書きされるからだった。

次にAPI Gatewayで適当なパスのPOSTメソッドのエンドポイントを作ってこのLambda関数につなぐ。API Gatewayはそれだけ。作ったエンドポイントをGitHubのWebhookに設定すれば終わり。

Releaseを作る

最後にGitHubのAPIを使ってpushされたtagでReleaseを作って、zipを添付する。

リリースのスクリプトはこんな感じ。

release.sh
#!/bin/sh

set -ex

FILE_NAME=Test-$BUILD_VERSION-darwin-x64.zip
FILE_PATH=./dist/$FILE_NAME

UPLOAD_URL=`curl -s -X POST \
-H "Authorization: token $GITHUB_ACCESS_TOKEN" \
-d "{\"tag_name\":\"$BUILD_VERSION\",\"name\":\"$BUILD_VERSION\"}" \
https://api.github.com/repos/hokaccha/electron-build-test/releases | \
jq -r '.upload_url' |
sed -e 's/{?name,label}$//g'
`
curl --data-binary @$FILE_PATH -H "Content-Type: application/zip" -H "Authorization: token $GITHUB_ACCESS_TOKEN" $UPLOAD_URL?name=$FILE_NAME

buildspec.ymlでjqをインストールしたりrelease.shを実行する設定を入れる。

buildspec.yml
version: 0.1
phases:
  install:
    commands:
      - apt-get update -y
      - apt-get install -y jq
      - npm install
  build:
    commands:
      - /bin/sh ./build.sh
  post_build:
    commands:
      - /bin/sh ./release.sh

これでtagを打ってpushすれば自動でビルドされてリリースが作られる。こんな感じ。

https://github.com/hokaccha/electron-build-test/releases/tag/v1.0.0

感想

けっこうめんどいので小さいプロジェクトだったらCircleCIでいいんじゃないかな。