August 31, 2017

werckerでqmk_firmwareをビルドする

ErgodoxEZのファームウェアをビルドする際, この記事を参考に設定していた。
最近おもむろにqmk/qmk_firmwareをマージしたところ、werckerが動かなくなってしまった。
自分のファームウェアのFork元であるリポジトリymotongpoo/qmk_firmware
を確認したところ、
最近は更新されていない様子。
本家はバグ修正されていたりするので、勉強も兼ねて自分でqmk/qmk_firmwareをForkし、各所設定を行うことにした。

以下、その際の備忘録

主にやること:

  • Dockerコンテナの作成(Dockerfile)
  • werckerの登録
  • bintrayの登録

Dockerコンテナの作成

ビルド時に使うコンテナを作成する。
DockerHubへ事前に登録しておくこと。

※自分で作るのが面倒な場合は、qmk_firmwareの中の人のコンテナ(jackhumbert/qmk_firmware)や、ymotongpooさんのコンテナ(ymotongpoo/qmk_firmware)を利用すればこの手順は不要。

事前にhttps://github.com/qmk/qmk_firmware をForkしておく。
ForkしたリポジトリのDockerfileを以下のように書き換える:

-FROM debian:jessie
-MAINTAINER Erik Dasque <erik@frenchguys.com>
+FROM debian:stretch
+MAINTAINER riffrain

/* 中略 */

-ENV keyboard=ergodox
-ENV subproject=ez
-ENV keymap=default

 VOLUME /qmk
 WORKDIR /qmk
-CMD make clean ; make keyboard=${keyboard} subproject=${subproject} keymap=${keymap}
  • FROMはなんとなく記事作成時点のstableに変更(やらなくても良い)
  • MAINTAINERは自分のハンドルに変更
  • ENV系は記事作成時点の最新のディレクトリ構成にあっていない(!)ので、消しておく。後にwerckerで別途設定する。
  • 今回はwerckerでbuildからdeployまで行うので、makeは不要。消しておく。

修正をしたら, GithubへPush。

GithubへPushしたらDockerHubでリポジトリを作成する。

DockerHubへログインし、Create > Create Automated Build > Create Auto-build Githubで、先程修正したDockerfileをPushしたリポジトリを選択。Dockerのリポジトリを作成する。

werckerへ登録する

werckerへの登録方法等は、こちら記事に詳しく書かれているので参照。

ここでは上の記事との相違点のみ記載。
まずはwercker.ymlを用意する。
内容は以下:

box:・
  id: riffrain/qmk_firmware # ← ここは作成したDockerHubのリポジトリを指定。jackhumbert/qmk_firmware など、公開されているリポジトリでもOK。

build:
  steps:
    - script:
        name: build keymap.
        cwd: $WERCKER_SOURCE_DIR
        code: |
          make keyboard=$KEYBOARD subproject=$SUBPROJECT $TARGET_KEYMAP
    - script:
        name: move built firmware to output dir.
        cwd: $WERCKER_SOURCE_DIR/.build
        code: |
          mv ergodox_ez_$TARGET_KEYMAP.hex $WERCKER_OUTPUT_DIR/ergodox.hex
deploy:
  steps:
    - script:
      name: install curl
      code: |
        apt-get update
        apt-get -y install curl
    - script:
        name: put built hex file to bintray.
        code: |
          curl -T $WERCKER_SOURCE_DIR/ergodox.hex -u$BINTRAY_USERNAME:$BINTRAY_APIKEY https://api.bintray.com/content/$BINTRAY_USERNAME/generic/ergodox.hex/$WERCKER_GIT_BRANCH-$WERCKER_GIT_COMMIT/ergodox.hex
    - script:
        name: publish uploaded hex file.
        code: |
          curl -X POST -u$BINTRAY_USERNAME:$BINTRAY_APIKEY https://api.bintray.com/content/$BINTRAY_USERNAME/generic/ergodox.hex/$WERCKER_GIT_BRANCH-$WERCKER_GIT_COMMIT/publish

作成したwercker.ymlはGithubのリポジトリのルートに置いておく。

元記事との相違点:

  • werckerの変数でビルド対象のキーボードとサブプロジェクトを指定できるようにしている
  • makeを記事作成時点のコマンドに変更
  • 自分でつくったDockerコンテナを利用したとき、curlが実行できなくてコケたので、deployの中でインストールさせている。

キーボードとサブプロジェクトをwerckerの変数で指定できるように変更しているので、
以下の変数をwerckerで設定する必要:

  • KEYBOARD: ビルドするキーボードを設定。ErgodoxEZならergodox_ez
  • SUBPROJECT: ビルドするキーボードのサブプロジェクトを設定。ErgodoxEZならwerckerでの設定不要

なぜ、指定なしでもいいのにSUBPROJECTを設定しているかというと、
過去にqmk_firmwareの階層が変更されたことがあった。
ergodoxのサブプロジェクトとして、ezinfinityが配置されていたことがあったため、もし、今後変更されたらwerckerの変数を変更するだけで対応できるようにするため。

bintrayへの登録

こちら記事を参照。


これらの設定を終え、GithubにPushした時に、ビルドされていれば成功。
お疲れ様でした。

ちなみに今回作成したリポジトリはこちら