A production-grade, cloud-native voting application built with a clean Go backend, modern Vue.js frontend, and a fully automated GitOps-powered CI/CD pipeline.
VoteApp is a microservice-style voting application designed to demonstrate:
- Robust backend architecture using Go and Clean Architecture principles
- Modern frontend UI built with Vue 3 + Vite
- End-to-end DevOps automation including:
- CI/CD with GitHub Actions
- Docker image builds and versioning
- GitOps-driven deployment via Argo CD
- Dependency updates managed with Renovate
- Automated E2E tests after deployment
- Tag-based release promotion: every push to
maintriggers a deterministic release based on timestamp and run number
This project simulates real-world infrastructure, workflows, and testing strategies adopted by top engineering teams.
vote-app/
├── backend/ # Go backend API using Clean Architecture
│ ├── cmd/server # Entry point
│ └── internal/ # Domain logic, use cases, infrastructure, handlers
├── frontend/ # Vue 3 frontend served via Nginx
├── docker-compose.yaml # Local dev stack
├── scripts/ # Workflow coordination scripts (Renovate, Argo CD sync)
└── .github/workflows/ci.yml # Full CI pipeline (build, release, test)
- Follows Clean Architecture:
domain/: vote entity and validationusecase/: business logicinfrastructure/redis: persistent vote storagehandler/: HTTP handlers and routes
- Unit tested using Testify and table-driven tests
- Redis-backed data store with mocked interfaces for testing
- Built with Vue 3 and Vite
- Simple but extensible UI
- Served via Nginx (configured with
nginx.conf)
Every time code is merged to main:
- ✅ Unit tests run for backend services
- ✅ Docker images are built and pushed to Docker Hub:
vote-frontendvote-backend- Tagged as
vYYYY.MM.DD.RUN_ID
- ✅ Renovate is triggered in the
argocd-voteapprepo to update the deployment manifests - ✅ A Renovate PR is created and auto-merged (thanks to semantic PR titles + labels)
- ✅ The workflow waits for Argo CD to finish syncing the app
- ✅ E2E tests are executed against the live dev environment
This approach guarantees only tested, deployed code reaches the environment.
Once the application is deployed and synced via Argo CD, the workflow runs integration tests using curl:
# Valid votes
curl -X POST https://voteapp.dev.rch.domain-buy-5.com/vote?vote=Cats # expect 200
curl -X POST https://voteapp.dev.rch.domain-buy-5.com/vote?vote=Dogs # expect 200
# Invalid votes
curl -X POST https://voteapp.dev.rch.domain-buy-5.com/vote?vote=Unicorn # expect 400
curl -X POST https://voteapp.dev.rch.domain-buy-5.com/vote?vote=Cat # expect 400 (typo)
curl -X POST https://voteapp.dev.rch.domain-buy-5.com/vote # expect 400 (missing param)These tests confirm the system is functionally correct in a production-like environment.
Docker images are tagged using the format: vYYYY.MM.DD.RUN_ID
For example:
v2025.07.26.16543231189
- Uniqueness: Each tag corresponds to a single GitHub Actions run.
- Traceability: Tags map directly to a specific CI run and commit.
- Deterministic promotion: GitOps tools like Argo CD can safely deploy new images based on tags, not
latest.
After pushing new images, the Renovate bot is triggered in the argocd-voteapp repository.
- Scans for new tags of
vote-backendandvote-frontend - Creates a PR updating the Kubernetes manifests with the new image tag
- PR title example: chore(deps): update vote app dev to v2025.07.26.16543231189
- Adds labels:
env::dev - The PR is automatically merged when the branch passes CI checks
| Type | Description |
|---|---|
| ✅ Unit Tests | Clean architecture logic (entities, use cases) |
| ✅ E2E Tests | Live curl-based HTTP tests after deployment |
| Test Description | Expected Status |
|---|---|
Valid vote: Cats |
200 OK |
Valid vote: Dogs |
200 OK |
Invalid vote: Cat (typo) |
400 BadRequest |
Invalid vote: Unicorn |
400 BadRequest |
| Missing vote param | 400 BadRequest |
These tests ensure the application works end-to-end in the live environment post-deployment.
| Category | Technology |
|---|---|
| Backend | Go, Clean Architecture |
| Frontend | Vue 3, Vite, Nginx |
| CI/CD | GitHub Actions, Renovate |
| GitOps | Argo CD |
| Testing | Testify (unit tests), curl (E2E) |
| Registry | Docker Hub |
| Infrastructure | Deployed via Argo CD (see argocd-voteapp) |
This repository goes beyond just building an app — it showcases how real-world teams operate:
- Well-architected Go codebase following clean separation of concerns
- CI/CD pipelines that are production-grade and observable
- Complete GitOps automation with controlled rollouts
- Automated validation gates via unit and E2E tests
- Release traceability and control via semantic Docker tags and Renovate-managed PRs
argocd-voteapp– GitOps deployment definitions managed by Argo CDprovisioning-voteapp– Terraform for cluster & cloud provisioning