Skip to main content

The Drone CI debacle

I wanted to deploy this small website to post small blog posts as the inspiration would come. Because I’m stubborn, I wanted to self-host it, however I also wanted the process to publish to my website to be as stream-lined as it could be. Therefore, I decided to have it continuously delivered so that pushing a new commit to my server would automatically build the changes and serve them.

Drone

The problem

I had wanted to install Drone CI on my server for a while. I already have a plethora of self-hosted services on my server, and after reading the docs I thought it would be deployed and ready to use in no time.

Instead it took me a few hours over a week before I got it working. I would run the container in docker-compose, it would display its logs happily, but nothing happened if I tried to connect to it.

Debugging

My service definition looked something like this :

drone-server:
  image: drone/drone:1
  container_name: drone-server
  restart: unless-stopped
  env_file:
    - ./drone/drone.env
    - ./drone/drone.env.secret
  volumes:
    - ./drone:/data
  ports:
    - 8080:8080 # Exposed for debugging purposes
  depends_on:
    - gitea # My self-hosted Gitea instance
  user: 1000:1000

I tried everything on port 8080, firefox did not show anything, neither did wget. I even tried to execute wget inside the drone-server container, to no avail!

I tried listing the open ports, both outside and inside the container. I tried activating the debug logging, and I could not see anything out of the ordinary.

I then tried launching the container directly on the command line, instead of using a docker-compose service. Here’s the command I used:

docker run --rm \
    --publish=8080:80 \
    --name=drone \
    --env-file shipyard/drone/drone.env \
    -v `pwd`/drone/:/data \
    drone/drone:1

Navigating to port 8080 now redirected me to my Gitea login page, as it should be!

I was puzzled, as I could not see any difference between my service definition and the command line I was launching.

Resolution

The keen-eyed among you might have already seen the difference between those two container instances… A single option was missing in my docker run command which, had I included it, would have kept it from working too.

Have you found it yet? It’s the user: ... line. I felt like a fool when I finally spotted the difference. I removed it, and my service was now up and running.

The logs showed no difference, nothing was complaining about the rights on disk, the SQLite database was still created either way. But this line was the difference between a working instance and a non-working one.