Hugo, Gitea, and Drone CI
2020-12-10


One of the many nice things about the tildeverse is that we have can have repos
in tildegit. Another nice thing is it uses Gitea and Drone CI. Yay open source,
and stuff.

Bashblog might be nice if all you want to do is write and post, but it's not
very nice when it comes to customization. Also I've been spoiled rotten by
Gitlab/hub Pages and really wanted to set up something like that for the tildes.

And so, after much putting it off and asking people for help, I finally
undertook the seemingly daunting (but actually easy although a bit tedious) task
of setting all of this up.

I'll be the first to admit I know jack shit about Docker, (and I should probably
learn how to use it at some point since I have a spare box at home that I plan
to use as a personal server of sorts), so my current solution may not be the
best or most elegant but for the intents and purposes of setting this up I
figured it wouldn't be 100% necessary to create containers and such. And I would
have never gotten this off the ground either, so there's that.

After creating and testing my Hugo site locally, I pushed it all to a repo,
activated it under Drone and got to work on the `.drone.yml` file.

A couple searches later, I was all set up with something I pulled from the Drone
docs[^1]. Easy peasy... Or so I thought.
I went with a combination of the Hugo plugin[^2] and the rsync plugin[^3], which didn't
work at all. PEBCAK? I'm not so sure. For some reason, rsync wouldn't pick up on the
secrets I set up on the repo config. Oh well...
I fell back to the solution the documentation proposes and used the scp
plugin[^4], which does work. Or would have worked if there was something for it
to copy...
This is how I discovered the Hugo plugin didn't work. Or didn't work for me? I
found a number of posts of people using it successfully. Mind you, these are all
a couple of years old now.

At this point I scrapped all the remote stuff, went back to the docs[^5] for a fresh
start, and decided to try a manual approach without using containers.

First, I recreated the repo setup in Drone and added the connection details as
secrets.
Second, I logged into my ~club account and cloned the repo.
Then I recreated `.drone.yml` as follows:

```yaml
---
kind: pipeline
type: ssh
name: deploy

server:
  host:
    from_secret: host
  user:
    from_secret: username
  ssh_key:
    from_secret: ssh_key

trigger:
  branch:
    - blog

steps:
  - name: deploy
    commands:
      - cd /home/me/myBlog
      - git pull origin blog
      - hugo --cacheDir ~/temp/
      - rm -r resources
      - cp -ruf public/* /home/me/public_html
      - rm -r public
```

This establishes an ssh connection, pulls the git repo, generates the static
pages using hugo, and moves them to their designated location.

The `trigger` option makes sure the pipeline only works on the specified branch,
this makes working on themes or whatever on a different branch easier, and it
won't eat up CI time.

Hugo's default `cacheDir` is `/tmp`, which can't be accessed by non admin users
on tilde, so I set it to a directory I created.

Last but not least, I created a `.gitignore` with the following lines in it:

```
public/
resources/
```

`public` contains the generated blog and `resources` houses files used in the
generation, they're not needed in the repo.

[^1]: https://readme.drone.io/
[^2]: http://plugins.drone.io/cbrgm/drone-hugo/
[^3]: http://plugins.drone.io/drillster/drone-rsync/
[^4]: http://plugins.drone.io/appleboy/drone-scp/
[^5]: https://readme.drone.io/pipeline/ssh/overview/