logo

Web Development/ Gitlab CICD Experience

As a follow-up from my previous jenkins install, I decided to instead use gitlab to run my ci/cd pipeline due to the following reasons:

  • Code and Jobs in one place feels more natural as execution automatically gets triggered in each code commit.
  • No need to mess with plugins. Way easier to setup.

Now, to have a real-world experience (or alteast close to it) I needed to have a good use case to apply it. Good thing my sister has a local baking business – a good use case is to create an online presence for it. After 3 weekends, I was able to finish the webpage with full CI/CD pipeline that deploys to dev/prod environments depending on the branch commit 🙂

The output: https://reddeliciousph.com

Here are the learning and overview from the project

Learnings

  • Containerizing application on Day 1 will save you a lot of time when you start deploying it in Production Environment.
    • For python applications, this saves you creating virtual environments as this can be initiated inside the container.
  • Always use environment variables to switch from DEV to PROD.
  • Docker-compose is your friend. Kubernetes Kompose is your best friend. Converting from docker-compose to kubernetes manifest is so easy with kompose
  • Use ootb Kubernetes Kustomize for easy templating
  • Gitlab CICD: create jobs that gets triggered only to specific branches. This avoids always deploying to PROD for each changes you’ll be doing
  • Gitlab Runner: Linux runner is really easy to use but may have security implications once you have multiple teams using it.
  • In using on-prem Harbor Registry – use a trusted SSL certificate! This will save you head-ache when pushing/pulling from Kubernetes as you don’t need to mess with docker daemon.json in the nodes. For me, using letsencrypt is the easiest way to do this.

Overview of Technology Used:

  • Web Framework:
    • Flask (+ Bootstrap Template + FontAwesome Icons)
    • Celery for offloading sending emails
  • Packaging
    • Docker Container since day 1 (no virtual environments! yey)
  • Git Repo and CI/CD Engine
    • Gitlab
    • Linux Runner (originally, I was using kubernetes runner but I encountered too many issues)
    • CICD Pipeline
      • Commit to DEV branch -> test webpage, deploy to dev and push to harbor
      • Merge from DEV to MASTER -> deploy to prod and push to harbor
  • Container Registry
    • Harbor
  • Development Environment
    • local Kubernetes installation deployed using TKG
  • Production Environment
    • VPS running ubuntu with docker running

That’s it. Thanks for reading.

Leave a Reply

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.