diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..a6ad136 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,24 @@ +name: Release CI action +run-name: ${{ gitea.repository }} release +on: + push: + branches: + - main + +jobs: + build-and-push-container: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build container + run: docker build -t git.gtz.dk/${{ gitea.repository }}:latest . + - name: login + uses: docker/login-action@v3 + with: + # NOTE: See https://gitea.com/gitea/docs/pulls/77/files + registry: git.gtz.dk + username: ${{ gitea.actor }} + password: ${{ secrets.PACKAGE_TOKEN }} + - name: push container + run: docker push git.gtz.dk/${{ gitea.repository }}:latest diff --git a/Dockerfile b/Dockerfile index 01691f1..443b79c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,4 +7,6 @@ ADD hugo.toml /hugo/hugo.toml ADD content /hugo/content ADD static /hugo/static ADD shortcodes /hugo/layouts/shortcodes -CMD ["hugo", "serve", "--bind", "0.0.0.0"] +ENV PORT=1313 +EXPOSE $PORT +CMD hugo serve --bind 0.0.0.0 --port $PORT diff --git a/content/posts/how-to-blog.md b/content/posts/how-to-blog.md index b0433c3..56c136e 100644 --- a/content/posts/how-to-blog.md +++ b/content/posts/how-to-blog.md @@ -54,7 +54,9 @@ RUN git clone https://github.com/yihui/hugo-xmin.git themes/hugo-xmin ADD hugo.toml /hugo/hugo.toml ADD content /hugo/content ADD static /hugo/static -CMD ["hugo", "serve", "--bind", "0.0.0.0"] +ENV PORT=1313 +EXPOSE $PORT +CMD hugo serve --bind 0.0.0.0 --port $PORT ``` For now, I am just using the built-in server in `hugo`, but it should be possible to serve using `nginx`. @@ -104,27 +106,69 @@ Then we can use this new shortcode like so: {{< centered image="/example.png" >}} -Yes! Now we're cooking with gas! ... or atleast cooking with something. +Yes! Now we're cooking with gas! ... or atleast cooking with something. Note that this image centering trick does not work in [reader mode](https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages). + +## Conclusion +We have made a docker file for automatically downloading, generating and serving a simple `hugo` blog site. +Personally, I would've liked the `static` and `shortcodes` directories to not exist, but blogposts need images and it needs to center them, so they are a necessary evil. +Could we make the directory structure better and cleaner? Probably yes. +Will I make it better for this blog in the future? Probably yes. +Will I make another post when I do that? Probably yes! If you want to just manually build and run docker image on your website server, feel free to stop reading here. -The next section really elevates the publishing flow to a whole another level though. +The next section concerns about hosting, orchestrating and deploying the site automatically, but it's totally not required. -# Hosting and Deployment +# Deployment Being able to build and launch the docker image is nice and can suffice for smaller projects. Yes, this blog is a small project and the manual method should be more than enough, but I also play [factorio](https://store.steampowered.com/app/427520/Factorio/) (highly recommend it!), so I _hvae_ to automate everything that is tedious. +I also have other projects that I host on my VPS (Virtual Private Server) such my portfolio site [gtz.dk](https://gtz.dk) and a [gitea instance](https://git.gtz.dk/) amongst other things. ## Continuous Integration -This section -I am using my [personal gitea instance](git.gtz.dk/agj/blog) to host the source code for this blog - which means that I will be using the integrated CI system there, but you can use whichever CI service you'd like. -The general concepts of the workflow should be fairly easy to translate to any kind of CI +I am using my personal [gitea instance](https://git.gtz.dk/agj/blog) to host the source code for this blog - which means that I will be using the integrated CI system there, but you can use whichever CI service you'd like. +The general concepts of the workflow should be fairly easy to translate to any kind of CI, but this is how my setup looks like: - +```yaml +name: Release CI action +run-name: ${{ gitea.repository }} release +on: + push: + branches: + - main -This setup also gives us the possibility of performing traditional code-review before releasing by using [pull requests](). +jobs: + build-and-push-container: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build container + run: docker build -t git.gtz.dk/${{ gitea.repository }}:latest . + - name: login + uses: docker/login-action@v3 + with: + # NOTE: See https://gitea.com/gitea/docs/pulls/77/files + registry: git.gtz.dk + username: ${{ gitea.actor }} + password: ${{ secrets.PACKAGE_TOKEN }} + - name: push container + run: docker push git.gtz.dk/${{ gitea.repository }}:latest +``` + +This may look a bit overwhelming if you don't know [Github Actions](https://docs.github.com/en/actions), but it is really quite straight forward. +Every time we push a commit to the `main` branch, we run the job named `build-and-push-container`. +In the job, we first download our repository with the `actions/checkout@v4` action, then we build the container using `docker build` (we make sure to accurately tag the image), then we log in to the container registry that we want to host the container at using the `docker/login-action@v3` action, and the we simply `docker push` the container image. + +Make sure to replace the `git.gtz.dk` website mentions with your own github hosting service (whether self-hosted, or `github.com`) and replace the `gitea/GITEA` mentions with `github/GITHUB` instead. +Note that the syntax is extemely similar to GitHub Actions - in fact Gitea Actions are trying to be 1 to 1 compatible with GitHub Actions, so it should be relatively straight forward. + +This setup also gives us the possibility of performing traditional code-review before releasing by using [pull requests](https://docs.gitea.com/next/usage/pull-request?_highlight). This should empower us to identify and correct issues (e.g. spelling mistakes or whatever) before they are pushed to the official website. -## Continuous Delivery -With a docker image readily available +I will probably make a post about how to host a private gitea instance with an actions runner and all that jazz. For now, I will consider that particular rabbit hole out-of-scope. -### Orchestration -I personally am a big fan of the simplicity of [portainer](), as it scales really well when doing perosnal server stuff +This was the most difficult thing to do. We are _almost_ there. + +## Continuous Delivery +With a docker image readily available, we can automatically deploy the blog when we push it! + +I personally am a big fan of the simplicity of [portainer](https://www.portainer.io/), as it scales really well when doing perosnal server stuff.