Automation CI/CD DevOps

Go Docker CI in GitLab

Today, I’ll demo a sample Go Docker CI pipeline in GitLab. The pipeline will run on a sample Go containerized app. Hence the name Go Docker. If you later find this article useful take a look at the disclaimer for information on how to thank me.

Go sample GitLab project

I’ll use the sample docker-gs-ping repository below for showcasing Go CI in GitLab. It’s a simple Go web app used in Docker’s “Getting Started with Docker and Go” tutorial.

I forked it, added Makefile and gitlab-ci.yaml.

To see the Go web app in action, clone it from my GitHub and follow below sequence of commands inside the app folder:

make mod # downloads go modules from go.mod
make build # builds go binary
make vet # optional 
make test # optional 

Now, use below docker related commands:

make docker_build
make docker_run

To access the web api run curl localhost:8081. You should be greeted by Hello, Docker!

To stop the container run make docker_clean.

Go Docker GitLab CI

While you can include and use Go GitLab templates, in your GitLab pipelines, I’ll develop my own GitLab CI. It will be similar to GitLab templates with addition of CI for Go containerized apps.

Inspect .gitlab-ci.yml in the project.

  - vet
  - test
  - build
  - docker-build

  image: warrior7089/go-docker:latest

  - name: docker:20.10.21-dind 
    command: ["--mtu=1300"]    

  stage: vet
    - make vet
  stage: test
    - make test

  stage: build
    - make mod
    - make build

  stage: docker-build  
  image: docker:20.10.21
    DOCKER_HOST: "tcp://docker:2376"
    DOCKER_TLS_CERTDIR: "/certs"
    make docker_build

It has jobs for vetting, testing, building go binary and building docker image with the binary bundled inside. Each job uses the relevant make command we’ve seen above.

Let’s see the CI release pipelines in action.

Go Docker CI in GitLab Demo

You can follow along by forking the demo repository to your account. Let’s do a sample change, commit and push it in the feature branch. Afterwards, let’s open the merge request and see the CI pipeline jobs in action.

As we can see, all the jobs mentioned above ran successfully. Note that each job except docker-build ran inside go-docker:latest image I pushed to Docker Hub.


That’s it about Go Docker CI in GitLab. As always, feel free to share.

If you found this article useful, take a look at the disclaimer for information on how to thank me.

You may also find below articles interesting:

Recommended Gitlab books on Amazon.