drone.io でARMビルド用agentを設定する

この記事は drone.io Advent Calendar 2017 - Adventar の24日目の記事です。

drone.io は Goで作られたオープンソースのCD (Continuous Delivery)環境です。

f:id:ashphy22:20171223211410p:plain

droneでのテストは通常x86、x64で動かしていると思いますが、場合によっては異なるアーキテクチャでのテストを実行したい場合もあるかもしれません。

droneではv0.8からarmおよびarm64がサポートされるようになりました。ARMはRaspberry Piや、Androidなどの携帯端末、IoT機器などでも用いられていますので、こういった組み込み機器の開発にもCI/CDを導入できるということは大きなメリットがあります。

本日はdroneでarmを利用する方法をご紹介します。

ARM版のAgentを導入する

ARMがサポートされましたが、drone serverはx64で構いません。というかx64のイメージしか用意されていませんので、すでに立てているserverがあればそれを利用してください。

ARMでビルドしたい場合はARMの環境でagentを立てます。Raspberry Piにdockerを入れてagentにするのがお手軽ですが、qemuでエミュレーションすることも可能です。 agentはarm, arm64用のイメージが提供されています。tagにlinux-arm, linux-arm64 がありますので指定してください。環境変数DOCKER_ARCH=armを追加してください。

version: '2'

services:
  drone-agent:
    image: drone/agent:linux-arm
    command: agent
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=127.0.0.1:9000
      - DRONE_SECRET=00e40bfb287a0a553c80297a
      - DOCKER_ARCH=arm

ARM版の.drone.yml

このままテストを実行するとアーキテクチャがわからず、droneがどのagentで実行したらいいかわからなくなります。 .drone.ymlplatform を追加することでこれを指定することができます。Agentは自動で選ばれるため異なるプラットフォームのagentをひとつのserverに混在させても構いません。

platform: linux/arm

pipeline:
  build:
    image: arm32v7/busybox:latest
    commands:
      - uname -a

ビルドを走らせると...

+ uname -a
Linux 39737a2a3d25 4.13.9-300.fc27.armv7hl #1 SMP Mon Oct 23 15:02:20 UTC 2017 armv7l GNU/Linux

armv7で動きました!

ARMのテストにはARM用のイメージが必要ですが、いくつか公式のイメージが用意されていますのでこれをベースにカスタマイズするとよいでしょう。

github.com

対応版のプラグインについて

ARMで実行するときの注意としてARM対応版のプラグインを利用しなければならないことがあります。公式のプラグインはそこそこ対応されていますが、自作のプラグインはビルドし直さなければならないかもしれません。