Official arm32 and arm64 support

We are officially announcing arm support for Drone

We are building and publishing multi-platform images for the Drone server and the agent. This means you can run the server on arm (no need to compile it yourself). We are also using the Docker manifest tool when we publish the image so that you can run docker pull drone/drone:0.9.0-alpha.1 and the docker client will pull the correct image based on your host machine architecture.

$ docker manifest inspect drone/drone:0.9.0-alpha.1
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 949,
         "digest": "sha256:ce8c407e780ed557f21315134332cd51144f0e01aaf02cc9f1b435b57876d6d3",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1156,
         "digest": "sha256:25cdba117d6a13cd4b223cbf66708786bd0eceffa0d1513e9b3db285ed0b2a30",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1156,
         "digest": "sha256:ae6fb0322163bdd44ecfb61a4364165ac9db7bc03851b5670245ad10df19071a",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      }
   ]
}

More to come in this space but if anyone is interested in trying this out, please let me know. Also the folks at Packet (bare metal arm hosting) are providing hosting credits to the Drone community. They have a badass 96-core arm64 server you can use. See my tweet for details.

3 Likes

Finally… This is awesome. Thank you so much!

I just tried the latest -alpha.3 image on arm. I seem to be unable to configure the SCM correctly, it always fails with Source code management system is not configured.

How are these images built, and how are they configured?

Ah, well, I just realized the new documentation is at readme.drone.io and the env variables have changed! Will have a try…

So… It seems the agent alpha images for ARM are not built correctly. The manifest tells they are amd64:

drone/agent:0.9.0-alpha.3-linux-arm: manifest type: application/vnd.docker.distribution.manifest.v2+json
      Digest: sha256:6d8236b4717e29eb02dba36dad7ad973e9ffdccffbae2a79fca68219a22575be
Architecture: amd64
          OS: linux
    # Layers: 2
      layer 1: digest = sha256:297640bfa2efea653578ab00c477db7b7b27028fc1cae6494e636dc5b49f63a0
      layer 2: digest = sha256:32be8afa04eb5d796dd91f4c06964dca04c4340c8cb1692fa294f8daf296b39c

Same problem with the new rc1. Congrats for the great release, by the way!

drone/agent:1.0.0-rc.1-linux-arm also has an amd64 manifest wrongly attached. Seems to be problem with the arm64 build as well.

I have to correct myself though: The manifests are wrong but it is possible to run the arm image manually on an arm server. It just does not work with Docker Swarm mode because Swarm verifies the architecture in the manifest. (The error is no suitable node (unsupported platform on 1 node).)

There should be no need to use the architecture-specific tags. The drone/agent:1.0.0-rc.1 manifest provides digests for multiple architectures and operating system. You can run docker pull drone/agent:1.0.0-rc.1 on any architecture and Docker will automatically download the platform-specific digest.

$ docker manifest inspect drone/agent:1.0.0-rc.1
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 949,
         "digest": "sha256:60f898bed4a5e5fb81edae25e71b861befe847f559fcf1805d07eca80258b124",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 738,
         "digest": "sha256:a670524b495951891f8de1155cccbf26572a6ca9e521e068973ab5cc8f9894e9",
         "platform": {
            "architecture": "arm64",
            "os": "linux",
            "variant": "v8"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 738,
         "digest": "sha256:cf1c00ee259d144c5101b84c211fca822b7917d15d9ae84c4be95427339e0765",
         "platform": {
            "architecture": "arm",
            "os": "linux",
            "variant": "v7"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 2809,
         "digest": "sha256:d36cdc6e0adef3e2fcb56381fa5656553bd006b507226d07c3136f50790a0c4e",
         "platform": {
            "architecture": "amd64",
            "os": "windows",
            "os.version": "10.0.17134.165"
         }
      }
   ]
}

In terms of drone/agent:1.0.0-rc.1-linux-arm, we are doing a vanilla docker push from an arm server when publishing this image. Is there something we need to set explicitly, or is this a Docker bug? I would have assumed that Docker inherits the os and architecture from the base image or from the host OS …

I could’ve sworn I tried the main image unsuccessfully… Nevermind, probably my fault. It works now!

Regarding the manifest of architecture specific image (drone/agent:1.0.0-rc.1-linux-arm), I just had a look at my own images. They do have the architecture set correctly to arm (without the variant field though). As I am doing vanilla pushes as well, I am not sure what is going wrong on your side. (I would guess that the architecture is inherited from the building host OS as well, but I do not know really.)