:the fyr place:

stepping further into the ci/cd rabbit hole

Since I keep this blog versioned on my gitea instance, and since I have Drone CI installed, it occurred to me that I could probably automate post publishing with drone. It took me a couple tries (and this post is part of a final test), but I think I got it sorted now.

The easiest part was setting up the environment:

steps:
  - name: setup environment
    image: python
    commands:
      - pip install pipenv
      - pipenv install
      - pipenv run pelican
    when:
      branch:
        - main

Although, I was reading about poetry the other day and I'd like to take that for a spin one of these days. Maybe on a django project? And maybe even that crud app I have been trying to write for weeks now. But I digress ...

The bit that took me a couple tries was the copying of files over to the server. I beat my head against a wall a couple of times before I realised that in order to ditch the 'output' directory from the pelican build, I needed to tell drone to strip components because explicitly telling it to copy just the files just doesn't work ...

  - name: copy flat files to server
    image: appleboy/drone-scp
    settings:
      host: 
        from_secret: DigitalOceanIP
      port: 
        from_secret: DigitaloceanPort
      username: camille
      key: 
        from_secret: jupiterPrivateKey
      target: /home/www/pelican/
      source: ./output/
      strip_components: 2
      rm: true
      overwrite: true

But then I ran into a new problem. The site is served from an nginx:alpine docker container with a bind directory outside the container. When drone finishes copying the new files over, the container breaks. The way to fix that is to restart the container. So for this final test, I am adding a docker restart to the pipeline.

  - name: restart docker container
    image: appleboy/drone-ssh
    settings:
      host: 
        from_secret: DigitalOceanIP
      port: 
        from_secret: DigitaloceanPort
      username: camille
      key: 
        from_secret: jupiterPrivateKey
      command_timeout: 2s
      script:
        - docker restart pelican

Here's hoping it works ...


Editing to add that apart from a couple minor glitches (I had the plugin name wrong), it works!!! Yay me!