J Josue Gatica Odato

Achieving Complete Go Application Deployment with GitHub Actions and Kubernetes

Recently, in the LucasLatessa/SDyPP-G3 project, we reached a significant milestone: achieving a 'complete deployment' for our Go application. This isn't just about getting code to a server; it's about establishing an automated pipeline that takes our Go source code from a commit to a running, orchestrated application within a Kubernetes cluster, all managed by GitHub Actions.

The Journey to Complete Deployment

For many development teams, a 'complete deployment' means more than just a successful build. It signifies a robust, repeatable process that includes continuous integration, containerization, and continuous deployment to a production-ready environment. In the context of our SDyPP-G3 project, this involved ensuring our Go application could be reliably built, packaged as a Docker image, pushed to a container registry, and then deployed to Kubernetes via automated workflows.

Think of this deployment pipeline as an automated assembly line. Each step is a station, and the product (our Go application) moves from raw materials (source code) through various transformations (building, containerizing) until it's a finished good, ready for use (running in Kubernetes). If any station fails, the line stops, alerting us immediately.

Integrating Go, GitHub Actions, and Kubernetes

The synergy between Go, GitHub Actions, and Kubernetes is powerful for modern application delivery:

  • Go Application: Our lightweight, performant Go application forms the core, providing the business logic. Its compiled nature makes it ideal for containerization.
  • GitHub Actions for CI/CD: This is our orchestrator. GitHub Actions defines the workflow steps: pulling the code, building the Go binary, creating a Docker image, authenticating with a container registry, pushing the image, and finally, updating our Kubernetes deployment.
  • Kubernetes for Orchestration: Kubernetes provides the resilient, scalable environment to host our containerized Go application. It handles resource management, scaling, self-healing, and service discovery.

This setup ensures that every approved change to the SDyPP-G3 codebase automatically triggers a new deployment cycle, reducing manual effort and potential for human error.

A Glimpse into the Workflow

Here's an illustrative (and simplified) GitHub Actions workflow snippet demonstrating how such a pipeline might look. This example focuses on the build, containerization, and deployment phases:

name: Deploy Go App to Kubernetes
on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up Go
      uses: actions/setup-go@v4
      with:
        go-version: '1.21'

    - name: Build Go application
      run: go build -o app ./cmd/api

    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: yourusername/sd-g3-app:latest

    - name: Deploy to Kubernetes
      uses: azure/k8s-deploy@v4
      with:
        kubeconfig: ${{ secrets.KUBE_CONFIG }}
        manifests: |
          k8s/deployment.yaml
          k8s/service.yaml
        images: 'yourusername/sd-g3-app:latest'

This workflow first checks out the code, sets up the Go environment, and builds the application binary. Then, it logs into Docker Hub (or any container registry), builds a Docker image using the application, and pushes it. Finally, it uses the azure/k8s-deploy action (or similar for other cloud providers) to apply the Kubernetes manifests, ensuring the cluster is running the latest version of our application.

The Real Impact: Reliability and Speed

The most significant benefit of this complete deployment setup is the increased reliability and speed of our development cycle. Developers can commit changes knowing that if the pipeline passes, the application is likely functioning correctly in production. This reduces the time from code commit to production, allowing for faster iteration and feedback loops.

Actionable Takeaway

To implement a similar complete deployment for your Go application, start by defining a Dockerfile for your project. Then, create a GitHub Actions workflow that builds your Go binary, builds and pushes the Docker image, and uses an appropriate action (e.g., azure/k8s-deploy, google-github-actions/deploy-cloudrun, or aws-actions/amazon-eks-deploy) to apply your Kubernetes manifests. Focus on clear, small steps in your workflow and leverage secrets for sensitive credentials like Docker Hub passwords and Kubernetes kubeconfig.


Generated with Gitvlg.com

Achieving Complete Go Application Deployment with GitHub Actions and Kubernetes
Josué Gatica Odato

Josué Gatica Odato

Author

Share: