264 lines
11 KiB
Markdown
264 lines
11 KiB
Markdown
+++
|
|
title = "When is Gitea for you ?"
|
|
author = ["Elia el Lazkani"]
|
|
date = 2021-08-13
|
|
lastmod = 2021-08-13
|
|
tags = ["gitea", "git"]
|
|
categories = ["revision-control"]
|
|
draft = true
|
|
+++
|
|
|
|
As a _platform engineer_, you aim to choose the best tool for the job. Your goal
|
|
is to minimize complexity as much as possible to minimize breakages and make it
|
|
easier to recover. And when you think it's that simple, you get hit by the fact
|
|
that the best tool for the job is determined out of a list of requirements.
|
|
|
|
Dive down with me on a thought experiment that made me choose the hidden diamond
|
|
behind a lot of my projects; **Gitea**.
|
|
|
|
<!--more-->
|
|
|
|
|
|
## Gitea ?! What is that ? {#gitea-what-is-that}
|
|
|
|
[Gitea](https://gitea.io/en-us/) is advertised as
|
|
|
|
> Gitea is a community managed lightweight code hosting solution written in Go. It is published under the MIT license.
|
|
|
|
It is worth mentioning the bold statement the **Gitea** team proudly displays on
|
|
the front page of the project. It reads...
|
|
|
|
> Gitea - Git with a cup of tea
|
|
> A painless self-hosted Git service.
|
|
|
|
_Why would they choose that to advertise over other things ?_
|
|
|
|
If you dig in deeper into the project, you'll find that it is a _golang_
|
|
project. It is written to be fully compiled into one binary, making deployments
|
|
a breeze. It is also offered in container form.
|
|
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
|
|
Yeah ? You read that ? I said _container_ ! You're ears are ringing now,
|
|
something inside your head started making plans on what you can do with that.
|
|
|
|
</div>
|
|
|
|
|
|
## Worth mentioning projects {#worth-mentioning-projects}
|
|
|
|
While talking about _revision control_ self-hosted servers, I know most of you
|
|
will shout at me if I don't talk about other options.
|
|
|
|
If you already did that, great job. Let's talk options.
|
|
|
|
|
|
### Gogs {#gogs}
|
|
|
|
We can't talk about _Gitea_ without mentioning [Gogs](https://gogs.io/), where the foremore was
|
|
forked from.
|
|
|
|
The differences between both revolve, mostly, around features. They are both
|
|
great projects and choosing between them goes down to what _features_ do you
|
|
**need** to have. But what we mention about _Gitea_ deployment and configuration
|
|
can be, mostly, applied to _Gogs_. One of the main missing _features_ in _Gogs_
|
|
is native integration with CI/CD. Hooks can be configured, though, to run
|
|
pipelines if that's your preferred methond of triggering pipelines.
|
|
|
|
|
|
### Gitlab {#gitlab}
|
|
|
|
[Gitlab](https://about.gitlab.com/stages-devops-lifecycle/) as you can see from their webpage at date is a _beast_. It offers a lot
|
|
more _features_ and promises to handle your workflow. It comes with its own
|
|
CI/CD. It also offers integration with a bootload of different projects right
|
|
and left. You might, also, be interested to hear more if you're running
|
|
_Kubernetes_.
|
|
|
|
It is also worth mentioning the slew of options offered to run _Gitlab_ in the
|
|
cloud. Making deployment and management a lot easier.
|
|
|
|
After reading all that, you might want to ask what the catch is. Well the catch
|
|
is, unfortunately, complexity. It also requires more resources. This needs to be
|
|
taken into account, especially in the cloud. Bottom line is, it will cost more.
|
|
|
|
|
|
## Requirements {#requirements}
|
|
|
|
We, finally, get to the most important part of our project. We need to sit down
|
|
and figure out our requirements. It is impossible to start _any_ project without
|
|
defining the requirements and the resources at our disposal. A few good
|
|
questions to find answers to.
|
|
|
|
- What do I need this server for ?
|
|
- How big is my company ?
|
|
- How big is this server supposed to be ?
|
|
- How many repositories is it supposed to hold ?
|
|
- Where am I going to be deploying it ?
|
|
- What kind of integration do I need out of it ?
|
|
- How do I back it up ?
|
|
- How do I recover it ?
|
|
- How do I monitor it ?
|
|
- What can I afford ?
|
|
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">warning</p>
|
|
|
|
If you're not thinking about how to **back** your server **up**, **recover** it and
|
|
**monitor** it, you're doing it wrong !
|
|
|
|
</div>
|
|
|
|
|
|
### Small company {#small-company}
|
|
|
|
If you're an _individual_ or a _small company_, you probably have a small set of
|
|
repositories. Your needs depend on the _features_ you require, at that point. If
|
|
you want a simple server that "_just works_", with reservations on the term.
|
|
Then I would suggest _Gogs_ or _Gitea_. They require limited resources and can
|
|
handle a good amount of beating. There is **nothing** stopping you from going with
|
|
_Gitlab_, but know that you will have to deal with the complexity of its
|
|
management. Only _you_ can decide whether this is worth it and how much
|
|
complexity your team can handle among other _infrastructure services_ they have
|
|
to offer.
|
|
|
|
If you require native integration with CI/CD, then your choices go down to
|
|
_Gitea_ and _Gitlab_. If you want to be able to offer **pages** feature or native
|
|
_Kubernetes_ integration, then your option is limited to one; _Gitea_. But if
|
|
those are not required and you have free rein over CI/CD and your requirement
|
|
set is met by the integration offered by _Gitea_, there is no reason to choose
|
|
anything else at that point simply because "everyone is using that tool". That's
|
|
a bad reason !
|
|
|
|
Let's not forget the cost ! This is a big factor for small companies. If you can
|
|
go by with a smaller instance running _Gitea_, it wouldn't make financial sense
|
|
to run something that would require bigger tiers and thus cost more.
|
|
|
|
|
|
### Medium to big company {#medium-to-big-company}
|
|
|
|
Now, we're talking more complex requirements. We might be talking one big
|
|
monolith for the whole company. We are definitely talking more features and more
|
|
integrations with different tools. The options in this case can range from a
|
|
bare git server all the way to propiarty tools.
|
|
|
|
If we're going to stick with the _open source_ projects we mentioned so far.
|
|
_Gitea_ could squeeze into the medium company with all of its features but
|
|
_Gitlab_ definitely hits spot for most cases. If you're medium to big, you
|
|
already made peace with the fact that you will handle complexity here. I would
|
|
say try to study the case out of curiosity but you already know my answer. You
|
|
know you have one choice here and the choice is _Gitlab_.
|
|
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
|
|
It is worth noting here that I am assuming integration with LDAP (or some other
|
|
authentication system), complex CI/CD, Kubernetes integration and much more.
|
|
|
|
</div>
|
|
|
|
If you're at this level, I'm assuming cost has a bigger margin than with smaller
|
|
companies. You understand that the infrastructure needed is bigger to accomodate
|
|
all of your engineers and the increase in cost is also expected. Entertaining
|
|
the idea of limiting cost at this point is still valid, you have the best
|
|
interest of your company as well after all.
|
|
|
|
|
|
## Deployment {#deployment}
|
|
|
|
At this stage, you're already decided on the tool you'll be using moving
|
|
forward. It meets all the requirements derived from the needs of the teams that
|
|
are going to be using. It also meets your standards of complexity and stability.
|
|
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
|
|
It is worth mentioning here that you should test the tools you're considering in
|
|
a few POC trials. Get familiarised with it and the way it works. How is it
|
|
configured, and if it suits your configuration method of choice.
|
|
|
|
You'll get the chance to test it thoroughly during the UAT round. You'll be
|
|
attempting to break it and determine it's breaking point and behaviour.
|
|
|
|
It is crucial to get familiarised with the system you'll be managing. Get
|
|
comfortable with it.
|
|
|
|
</div>
|
|
|
|
After that ramble, let's look at a few options of deploying each. I'm sure there
|
|
are many different ways I will not think of, but they are all determined by the
|
|
enviornment they are going to be deployed in.
|
|
|
|
|
|
### Gitea/Gogs {#gitea-gogs}
|
|
|
|
These two projects come in binary form, easy to `curl` and run. It can also be
|
|
deployed in a _container_ format.
|
|
|
|
One can use `docker-compose` or _configuration management_ to manage the
|
|
containers.
|
|
|
|
You can automate the deployment, the backup, the restore and the monitoring
|
|
easily. It can be done on a single box with external storage, it can also be
|
|
done in _Kubernetes_ with _Persisent Volumes_.
|
|
|
|
If you're big enough, you can even entertain the idea of offering it as a
|
|
service for teams to deploy on their own.
|
|
|
|
These two projects offer a versatility of deployments, choose which one fits
|
|
your environment and workflow best.
|
|
|
|
|
|
### Gitlab {#gitlab}
|
|
|
|
If we want to dig into the different methods in which you can deploy _Gitlab_,
|
|
we'll need pages. In fact, _Gitlab_ already **has** [pages](https://docs.gitlab.com/ee/install/) written on the different
|
|
ways to deploy it.
|
|
|
|
They also have ways to do _backup_, _restore_ and a way to _monitor_ it. The
|
|
documentation is extensive and so are the different ways of deployment, from bare
|
|
metal all the way to _Kubernetes_.
|
|
|
|
Give yourself a bit more time to get familiarised with _Gitlab_ before you jump
|
|
in. Get comfortable with it, take your time. Find your comfort zone. Always
|
|
refer to the documentation.
|
|
|
|
|
|
## My choice {#my-choice}
|
|
|
|
If you've been following [this](https://blog.lazkani.io/) blog for a while, you already know I chose
|
|
_Gitea_.
|
|
|
|
From the previous thought experiment, I deduced that _Gitea_ or _Gogs_ both fit
|
|
my needs as an individual. They offer me all the features I require from a
|
|
_revision control server_. They are simple and don't require too much
|
|
maintenance. They are also cheap to run. I don't need a big server to run them,
|
|
I save on my pocket !
|
|
|
|
The reason I chose _Gitea_ over _Gogs_ was the CI/CD native integration. I
|
|
wanted to use CI/CD pipelines for my projects. In fact, this very blog is built
|
|
using a pipeline integrated with _Gitea_.
|
|
|
|
I've been running _Gitea_ for a few years now. I've grown fond of it. Upgrading
|
|
is a breeze, it's basically changing a number. It has been rock solid all of
|
|
these years and haven't given me grief. In fact, the only time I had issues with
|
|
it was when I was determining the memory requirements of the database and the
|
|
database kept crashing.
|
|
|
|
To top it off, backup is easy and so is restoration. I've, also, done a few
|
|
migrations on the server over the years as it grew. I've got comfortable with it.
|
|
|
|
And to answer your final question, yes, I am monitoring it. _Gitea_ exports
|
|
_Prometheus_ metrics. And yes, I get paged for it when it gets down. Why ?
|
|
Because I can. And because I am that kind of engineer.
|
|
|
|
|
|
## Conclusion {#conclusion}
|
|
|
|
When deciding on a tool to use, don't let your preference cloud your judgement.
|
|
Be analytical in your approach and base it on requirements. Make your
|
|
requirements clear and known as they are your guidance towards the right tool.
|
|
Do not be afraid to take your time with it, run a few POCs. Play around with the
|
|
project a bit, this time is valuable and could save you loads of headaches later
|
|
on. Gather as much information as possible and assess how well this tool fits
|
|
your needs. The best tool is the one that fits your needs best. End of story !
|