Linux上でビルドできるなら大抵のものに応用できるはずなので、試しにTWELITE SDKのLinux版を組み込んだDockerイメージを作って、GitLab CIと組み合わせてみました。
サンプルのプロジェクトを、GitLabで公開しています。
https://gitlab.com/twelite/app_twelite
Dockerイメージを作るためのDockerfileは以下のようにしました。
基本は、Ubuntu 18.04にTWELITE SDKをcurlでダウンロードして展開しているだけです。一点重要なのが、libc6-i386をインストールしておくことです。TWELITE SDKに入っているコンパイラの実行ファイルは32bit Linux用なので、これが無いと64bit Linuxのmakeからコンパイラを起動できず、FROM ubuntu:18.04 RUN sed -i s://archive.ubuntu.com://jp.archive.ubuntu.com:g /etc/apt/sources.list RUN apt-get update RUN apt-get install -y make curl libc6-i386 RUN curl -o MWSDK_Linux-i386_201805.tgz https://mono-wireless.com/download/SDK/MWSDK_201805/MWSDK_Linux-i386_201805.tgz RUN tar zxf MWSDK_Linux-i386_201805.tgz RUN rm -r MWSDK_Linux-i386_201805.tgz MWSDK/Wks_TWELITE
のようなファイルがあるのに「コマンドが無い」という不可解なメッセージが出ます。make: /builds/ChipLib/SW4063V1416/../../Tools/ba-elf-ba2-r36379/bin/ba-elf-gcc: Command not found
上記のDockerfileをビルドしたDockerイメージを、Docker Hubに用意しておきました。
https://hub.docker.com/r/truenature/mwsdk/tags/
GitLab CIの設定ファイル .gitlab-ci.yml は、以下のようにしました。
ビルドしておいたDockerイメージを image: で指定しています。image: truenature/mwsdk:18.04_201805 stages: - build before_script: - pwd - ln -s /MWSDK/* ../../ blue: stage: build script: - cd Master/Build - make TWELITE=BLUE clean all artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME" expire_in: 2 weeks paths: - Master/Build/*.bin
TWELITE APPSとして公開されているサンプルアプリは、2階層上のディレクトリにTWELITE SDKのツール群が配置されていることを前提にMakefileが用意されていますので、before_scriptで最初にシンボリックリンクを用意しています。
サンプルアプリにはテストコードが含まれていないため、stageはbuildだけです。サンプルアプリのトップにあるMakefileは下位のmakeにビルドを丸投げして失敗を無視する仕様のため、Master/Buildまで下りてmakeを行います。
ビルドしたファームウェアバイナリは、artifactsでダウンロードできます。
GitLab CI/CDを有効にしておくと、pushやマージリクエストが処理される毎にpipelineが実行されます。
https://gitlab.com/twelite/app_twelite/pipelines
GitLabにホストされたプロジェクトでshared runnerだけを使っているので、とても時間がかかっているように見えますが、ローカルにGitLabをインストールして専用のgitlab-runnerを登録しておくと、見ている間に(数十秒で)完了します。
プライベートなGitLabでローカルにビルドしたDockerイメージを使う場合は、
- ローカルに命名、タグ付けしたイメージを image: で指定する
- gitlab-runnerの pull_policy に'never'または'if-not-present'を指定してDocker Hubからのpullを予防する