
Running integration tests with docker-compose in Google Cloud Build
This post is a direct follow-up to Microservices test architecture where I introduced new kinds of tests to our example project. Wild Workouts uses Google Cloud Build as its CI/CD platform. It’s configured for continuous deployment, meaning changes land on production as soon as the pipeline passes. Note State of this article in 2026 This article is kept as an archive.

Microservices test architecture. Can you sleep well without end-to-end tests?
Do you know the rare feeling when you develop a new application from scratch and can cover all lines with proper tests? I said “rare” because most of the time, you work with software that has a long history, multiple contributors, and a less-than-obvious testing approach. Even if the code uses good patterns, the test suite doesn’t always follow. Some projects have no modern development environment set up, so there are only unit tests for things that are easy to test.

GitLab CI tips for building custom workflows
This time I’d like to touch on a few more advanced topics related to GitLab CI. The common theme here is implementing custom features within your pipeline. Again, most of the tips are specific to GitLab, but some could be easily applied in other CI systems as well. Running integration tests Checking your code with unit tests is usually easy to plug into any CI system.

Automatic Semantic Versioning in GitLab CI
In the previous post I showed how to keep all the scripts used in the CI in one repository. Let’s see what more advanced scripts you could put in there. This time I’d like to show how to add automatic versioning to your pipeline. You will also see how to push commits to your repository within the CI jobs. But first, let’s start with some background.

Keeping common scripts in GitLab CI
With this post, I’d like to start a series of CI-related tips, targeted mostly at GitLab, since that’s my go-to tool for things CI/CD-related. I’m sure most of them could be easily applied to other CI systems, though. While GitLab does a great job at many things (repository hosting and related stuff, like MRs, pipelines, issue boards, etc.), it sometimes lacks more specialized features in some areas.
Series
Popular articles
- The Go libraries that never failed us: 22 libraries you need to know
- Safer Enums in Go
- Common Anti-Patterns in Go Web Applications
- How to implement Clean Architecture in Go (Golang)
- The Repository pattern in Go: a painless way to simplify your service logic
- Introduction to DDD Lite: When microservices in Go are not enough
Tags
- go
- golang
- watermill
- ddd
- events
- software-development
- domain-driven design
- event-driven
- clean-architecture
- web-applications
- anti-patterns
- architecture
- ci
- firestore
- cloudrun
- gcloud
- googlecloud
- microservices
- serverless
- testing
- advanced
- backend
- databases
- devops
- firebase
- gitlab
- reactive
- repository
- ai
- basics
- building-business-applications
- building-in-public
- cqrs
- frameworks
- kafka
- mysql
- nats
- pipelines
- scalability
- software-architecture
- transactions
- agents
- amqp
- authentication
- balance
- bounded-context
- c4
- cicd
- code-quality
- code-review
- complexity
- design-patterns
- development-process
- diagrams
- docker
- dry
- e-book
- efficiency
- enums
- event-storming
- gamedev
- generics
- google-cloud
- grpc
- htmx
- intermediate
- iteration
- javascript
- learning
- libraries
- llm
- metrics
- modular-monolith
- monolith
- open-source
- openapi
- over-engineering
- overengineering
- parallelism
- product-engineering
- productivity
- programming-languages
- prometheus
- pull-requests
- python
- rabbitmq
- retrospective
- security
- software-design
- sql
- sse
- startups
- strategic-ddd
- swagger
- terraform
- tips
- unpopular-opinions
- versioning
- work-culture