diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 098e42a..1de8169 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -27,6 +27,10 @@ test:
 build:
   extends: .go_template
   stage: build
+  rules:
+    - if: $CI_COMMIT_TAG =~ /^v.*$/
+      when: never
+    - when: on_success
   script:
     - make build
   artifacts:
@@ -46,13 +50,25 @@ release:
     GIT_DEPTH: 0
   rules:
     - if: $CI_COMMIT_TAG =~ /^v.*$/
-  script: |
-    # GITLAB_TOKEN is needed to create GitLab releases.
-    # DOCKER_* are needed to push Docker images.
-    docker run --rm --privileged \
+  script:
+    - docker run --rm --privileged \
       -v $PWD:/go/src/gitlab.com/hectorjsmith/fail2ban-prometheus-exporter \
       -w /go/src/gitlab.com/hectorjsmith/fail2ban-prometheus-exporter \
       -v /var/run/docker.sock:/var/run/docker.sock \
       -e DOCKER_USERNAME -e DOCKER_PASSWORD -e DOCKER_REGISTRY  \
       -e GITLAB_TOKEN \
       goreleaser/goreleaser release --clean
+
+tag images:
+  stage: release
+  image: docker:stable
+  services:
+    - docker:dind
+  needs:
+    - release
+  rules:
+    - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/
+  variables:
+    IMAGE_NAME: registry.gitlab.com/hectorjsmith/fail2ban-prometheus-exporter
+  script:
+    - ./.gitlab-ci/tagLatestImage.sh
diff --git a/.gitlab-ci/tagLatestImage.sh b/.gitlab-ci/tagLatestImage.sh
new file mode 100644
index 0000000..a2973c7
--- /dev/null
+++ b/.gitlab-ci/tagLatestImage.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+VERSION=`echo $CI_COMMIT_TAG | cut -c 2-`
+MAJOR=`echo $VERSION | cut -d "." -f 1`
+MINOR=`echo $VERSION | cut -d "." -f 2`
+
+echo "version: $VERSION (major: $MAJOR; minor: $MINOR)"
+
+docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+docker pull $IMAGE_NAME:$VERSION
+docker tag $IMAGE_NAME:$VERSION $IMAGE_NAME:latest
+docker tag $IMAGE_NAME:$VERSION $IMAGE_NAME:$MAJOR
+docker tag $IMAGE_NAME:$VERSION $IMAGE_NAME:$MAJOR.$MINOR
+docker push $IMAGE_NAME