---
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" || ($CI_PIPELINE_SOURCE == "push" && ($CI_COMMIT_BRANCH == "main" || $CI_COMMIT_BRANCH == "stable"))
      when: always
    - when: never
variables:
  version: 0.0.$CI_PIPELINE_IID
  stable_branch: main
  release_tag_prefix: v
stages:
  - test
  - build
  - publish
  - tag
test_job:
  stage: test
  image: public.ecr.aws/docker/library/golang:1.21
  script:
    - go get -t ./...
    - go test -race -v ./...
build_job:
  stage: build
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /stable/
      when: always
  image: public.ecr.aws/docker/library/golang:1.21
  parallel:
    matrix:
      - GOOS:
          - linux
          - darwin
          - windows
        GOARCH:
          - amd64
          - arm64
  script: |
    go build -o webservice_${GOOS}_${GOARCH}.bin ./*.go
  artifacts:
    paths:
      - webservice_${GOOS}_${GOARCH}.bin
    expire_in: 5 min
publish_job:
  stage: publish
  rules:
    - if: $CI_COMMIT_REF_NAME =~ /stable/
      when: always
  image: public.ecr.aws/docker/library/alpine:latest
  tags:
    - docker-privileged
  dependencies:
    - build_job
  before_script:
    - apk add --no-cache curl
  script: >
    for file in $(ls webservice_*); do
      curl --header "JOB-TOKEN: $CI_JOB_TOKEN" \
        --upload-file "./$file" \
        "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/artifacts/$version/$file"
    done
job_tag_stable_branch:
  stage: tag
  only:
    - main
  image: public.ecr.aws/docker/library/alpine:latest
  tags:
    - docker-privileged
  before_script:
    - apk add --no-cache git
  script:
    - git tag "$release_tag_prefix$version"
    - git push origin "$release_tag_prefix$version"