# Copyright 2021 Google LLC
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#      http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

steps:

- id: 'Download dependencies'
  name: golang
  args: ['go', 'mod', 'download']

- id: 'Install linting tools'
  name: golang
  args: ['go', 'install', 'golang.org/x/tools/cmd/goimports@latest']

- id: 'Lint'
  name: golang
  entrypoint: /bin/bash
  args:
    - '-c'
    - |
      goimports -l . 2>&1 | tee /dev/stderr | (! read)

- id: 'Run Unit Tests'
  name: golang
  args: ['go', 'test', '-v', './...']

# Setup resources for system tests
- id: 'Build Container Image'
  name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: pack
  args:
    - build
    - '--builder=gcr.io/buildpacks/builder:latest'
    - '$_GCR_HOSTNAME/$PROJECT_ID/$_REPOSITORY/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
    

- id: 'Push Container Image'
  name: 'gcr.io/cloud-builders/docker:latest'
  entrypoint: /bin/bash
  timeout: 60s
  args:
    - "-c"
    - |
      while ! docker push '$_GCR_HOSTNAME/$PROJECT_ID/$_REPOSITORY/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'; do
        sleep 2
      done

- id: 'Deploy to Cloud Run'
  name: 'gcr.io/cloud-builders/gcloud:latest'
  entrypoint: /bin/bash
  args:
    - '-c'
    - |
      gcloud run deploy ${_SERVICE_NAME}-$BUILD_ID \
        --image $_GCR_HOSTNAME/$PROJECT_ID/$_REPOSITORY/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA \
        --region ${_DEPLOY_REGION} \
        --no-allow-unauthenticated

- id: 'Retrieve Service URL'
  name: 'gcr.io/cloud-builders/gcloud:latest'
  entrypoint: /bin/bash
  args:
    - '-c'
    - |
      set -e
      source /workspace/common.sh
      echo $(get_url ${BUILD_ID}) > _service_url
      echo $(get_idtoken) > _id_token
  env:
    - '_SERVICE_NAME=${_SERVICE_NAME}'
    - '_DEPLOY_REGION=${_DEPLOY_REGION}'
    - 'BUILD_ID=${BUILD_ID}'
    - 'PROJECT_ID=${PROJECT_ID}'
  
- id: 'Run System Tests'
  name: golang
  entrypoint: /bin/bash
  args:
    - '-c'
    - |
      export BASE_URL=$(cat _service_url)
      export ID_TOKEN=$(cat _id_token)
      go test -tags=system -v ./...

# Clean up system test resources
- id: 'Delete image and service'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: '/bin/bash'
  args:
    - '-c'
    - |
      gcloud artifacts docker images delete $_GCR_HOSTNAME/$PROJECT_ID/$_REPOSITORY/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA --quiet
      gcloud run services delete ${_SERVICE_NAME}-$BUILD_ID --region ${_DEPLOY_REGION} --quiet

substitutions:
  _GCR_HOSTNAME: us-central1-docker.pkg.dev
  _SERVICE_NAME: microservice-template
  _DEPLOY_REGION: us-central1
  _REPOSITORY: samples

options:
  volumes:
  - name: go-modules
    path: /go
