# Предполагается, что между работой "build docker container" и этапом push
# построенные docker images остаются статичными и никуда не пропадают
#
# В противном случае их нужно после каждого этапа билда пушить в registry

stages:
  - test
  - build
  - build_docker_image
  - push
  - cleanup

variables:
  CONTAINER_IMAGE: registry.ely.by/elyby/skinsystem

.golang_template: &setup_go_environment
  image: golang:1.9.0-alpine3.6
  before_script:
    - apk add --no-cache git
    - mkdir -p $GOPATH/src/$CI_PROJECT_NAMESPACE
    - cp -r $(pwd) $GOPATH/src/$CI_PROJECT_PATH
    - cd $GOPATH/src/$CI_PROJECT_PATH
    - go get -u github.com/golang/dep/cmd/dep
    - $GOPATH/bin/dep ensure

.docker_template: &setup_docker_environment
  image: docker:latest
  before_script:
    - docker login -u gitlab-ci -p $CI_JOB_TOKEN registry.ely.by
    - export TEMP_IMAGE_NAME="$CONTAINER_IMAGE:$CI_PIPELINE_ID"

test:
  <<: *setup_go_environment
  stage: test
  script:
    - ./script/coverage

build executable:
  <<: *setup_go_environment
  stage: build
  script:
    - export VERSION="${CI_COMMIT_TAG:-dev-$CI_COMMIT_REF_NAME-${CI_COMMIT_SHA:0:8}+build-$CI_JOB_ID}"
    - >
      env GOOS=linux
      go build
      -o $CI_PROJECT_DIR/minecraft-skinsystem
      -ldflags "-X ${CI_PROJECT_PATH}/bootstrap.version=${VERSION}"
      main.go
  artifacts:
    name: "${CI_JOB_STAGE} executable"
    paths:
      - $CI_PROJECT_DIR/minecraft-skinsystem
    expire_in: 1 day

build docker image:
  <<: *setup_docker_environment
  stage: build_docker_image
  script:
    - docker build -t $TEMP_IMAGE_NAME -f docker/Dockerfile .
  only:
    - tags
    - develop

push dev:
  <<: *setup_docker_environment
  stage: push
  variables:
    GIT_STRATEGY: none
  script:
    - export IMAGE_NAME="$CONTAINER_IMAGE:dev"
    - docker tag $TEMP_IMAGE_NAME $IMAGE_NAME
    - docker push $IMAGE_NAME
  only:
    - develop

push tag:
  <<: *setup_docker_environment
  stage: push
  variables:
    GIT_STRATEGY: none
  script:
    - export IMAGE_NAME="$CONTAINER_IMAGE:$CI_COMMIT_TAG"
    - export LATEST_IMAGE_NAME="$CONTAINER_IMAGE:latest"
    - docker tag $TEMP_IMAGE_NAME $IMAGE_NAME
    - docker tag $TEMP_IMAGE_NAME $LATEST_IMAGE_NAME
    - docker push $IMAGE_NAME
    - docker push $LATEST_IMAGE_NAME
  only:
    - tags

cleanup temp image:
  <<: *setup_docker_environment
  stage: cleanup
  when: always
  script:
    - docker rmi $TEMP_IMAGE_NAME || true