It all started when I needed a CI/CD service the most...
Introduction
Welcome to my vault, it is quite fortunate to see a visitor. Let me tell you the root of all this... series, and a bit of me.
I am Thanh, or call me luckydoG_ if you would, I work professionally as a Game Programmer, some time in 2025 I started a personal Unity project with some of my colleagues to create a roguelike game. Things were quite smooth, we worked on the editor, played some previews, did many iterations to improve the gameplay. Then I knew we hit a wall very soon after that.
Our target platform was mobile, as we already have some experience with it. However, playing a game in the editor is much different from playing it on mobile: performance, input gestures, visual appealing,... We needed a way to play the game on our phones to actually know what is happening with it.
The early CI/CD
I built an one-click-one-build option in Unity to build the game. Okay-ish, but every time I wanted to deliver the build to the other guys, I was left with:
- Sending it via chat.
- Uploading to a cloud platform, then ask the guys to download it.
Well, manual work, and I was too lazy to wait for the build, then upload it somewhere, and nudge everybody. So I thought life should be better. I digged reddit and found out GNU Make can be the CI too. I was left with a platform to upload a build, so I chose the classic Firebase Distribution.

A peek of the Makefile I used to automatically build and upload to Firebase.
So, yeah, I was quite happy with that, until I get tired of the command I had to type :)
make android bundleVersion=0.2.1 bundleCode=21
Short? Well in order to upload to Firebase I also had to:
- Create a release note file under
UserSettings/for the pipeline, so that the pipeline picks it up and sends to Firebase for me. - Keep a secret file on my machine. If it is accidentally lost, I have to download a new one, put to the
Secrets/folder.
If another guy wants to build, I would need to introduce him to the CLI, the release notes and giving him the secret file.
I am a lazy guy, I wouldn't go down that path all day.
My first Self-hosted service, ever!
I took a step further, looking at what we usually do at work, and I found Jenkins, a free, open-source software that can be hosted by anyone.

You know you can trust this man when it comes to CI/CD.
So I did, I hosted the Jenkins docker container on my PC... and ran a agent on the same machine!
I also created a new branch just to test my Jenkinsfile for the new automated build workflow. If you know you will know, writing a working Jenkinsfile is somewhat an art. It took me a week of side work just to stick the new CI/CD to my project, it wasn't as terrible as it sound, it was very fun, at least for the tinkerer like me.
And the return? Now I have a GUI to input, and everything in one place.

How cool is this? A CI/CD pipeline for my own!
Conclusion
It was a personal project and a CI/CD service that changed me. I wanted to automate as much things as possible, from a Makefile to build to a small Jenkins server on my machine.
Achievement unlocked: first self-hosted service.
Reward: a bunch more to come, and two old machines to run them.