image: $DOCKER_IMAGE

before_script:
  - go version || echo "Go executable not found."
  - echo $CI_BUILD_REF
  - echo $CI_PROJECT_DIR
  - echo $PWD
  - eval $(ssh-agent -s)
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan -t rsa $GITLAB_SERVER > ~/.ssh/known_hosts
  - rm -rf ~/.gitconfig
  - git config --global url."git@$GITLAB_SERVER:".insteadOf "https://gitlab.com/"
  - git config --global url."git@$GITLAB_SERVER:".insteadOf "https://git.xx.network/" --add
  - export PATH=$HOME/go/bin:$PATH
  - export GOPATH=$HOME/go/bin

stages:
  - test
  - build
  - combine-artifacts
  - tag
  - doc-update
  - version-check

go-test:
  stage: test
  except:
    - tags
  script:
    - go mod vendor -v
    - go test ./... -v

wasm-test:
  stage: test
  except:
    - tags
  script:
    - export PATH=/root/go/bin:$PATH
    - go mod vendor
    - unset SSH_PRIVATE_KEY
    - unset $(env | grep '=' | awk -F= '{print $1}' | grep -v PATH | grep -v GO | grep -v HOME)
    - rm vendor/gitlab.com/elixxir/wasm-utils/exception/throw_js.s
    - mv vendor/gitlab.com/elixxir/wasm-utils/exception/throws.dev vendor/gitlab.com/elixxir/wasm-utils/exception/throws.go
    - GOOS=js GOARCH=wasm go test ./... -v

build:
  stage: build
  except:
    - tags
  script:
    - go mod vendor -v
    - mkdir -p release
    - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -trimpath -o release/xxdk.wasm main.go
    - cp wasm_exec.js release/
  artifacts:
    paths:
      - release/
    expire_in: 1 hour

build-workers:
  stage: build
  except:
    - tags
  script:
    - go mod vendor -v
    - mkdir -p release
    - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -trimpath -o release/xxdk-channelsIndexedDkWorker.wasm ./indexedDb/impl/channels/...
    - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -trimpath -o release/xxdk-dmIndexedDkWorker.wasm ./indexedDb/impl/dm/...
    - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -trimpath -o release/xxdk-logFileWorker.wasm ./logging/workerThread/...
    - cp indexedDb/impl/channels/channelsIndexedDbWorker.js release/
    - cp indexedDb/impl/dm/dmIndexedDbWorker.js release/
    - cp logging/workerThread/logFileWorker.js release/
  artifacts:
    paths:
      - release/
    expire_in: 1 hour


tag:
  stage: build
  except:
    - tags
  image: $DOCKER_IMAGE
  script:
    - git remote add origin_tags git@$GITLAB_SERVER:elixxir/xxdk-wasm.git || true
    - GOOS=js GOARCH=wasm go build -ldflags '-w -s' -o release/xxdk.wasm main.go
    - git tag $(sha256sum release/xxdk.wasm | awk '{ print $1 }') -f
    - git push origin_tags -f --tags

combine-artifacts:
  stage: combine-artifacts
  except:
    - tags
  image: $DOCKER_IMAGE
  script:
    - echo $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs
    - 'PIPELINE_JOBS=$(curl --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs)'
    - echo $PIPELINE_JOBS
    - BUILD_JOB_JSON=$(echo $PIPELINE_JOBS | jq '.[] | select(.name=="build")')
    - BUILD_WORKERS_JOB_JSON=$(echo $PIPELINE_JOBS | jq '.[] | select(.name=="build-workers")')

    - BUILD_JOB_ID=$(echo $BUILD_JOB_JSON | jq -r '.["id"]')
    - BUILD_WORKERS_JOB_ID=$(echo $BUILD_WORKERS_JOB_JSON | jq -r '.["id"]')

    - rm -rf release
    - mkdir -p release

    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/wasm_exec.js $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_JOB_ID/artifacts/release/wasm_exec.js'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/xxdk.wasm $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_JOB_ID/artifacts/release/xxdk.wasm'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/xxdk-channelsIndexedDkWorker.wasm $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/xxdk-channelsIndexedDkWorker.wasm'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/xxdk-dmIndexedDkWorker.wasm $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/xxdk-dmIndexedDkWorker.wasm'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/xxdk-logFileWorker.wasm $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/xxdk-logFileWorker.wasm'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/channelsIndexedDbWorker.js $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/channelsIndexedDbWorker.js'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/dmIndexedDbWorker.js $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/dmIndexedDbWorker.js'
    - 'curl --fail --location --header "PRIVATE-TOKEN: $GITLAB_ACCESS_TOKEN" --output release/logFileWorker.js $CI_SERVER_URL/api/v4/projects/$CI_PROJECT_ID/jobs/$BUILD_WORKERS_JOB_ID/artifacts/release/logFileWorker.js'
    - ls release
  artifacts:
    paths:
      - release/
    expose_as: "release"

# This pipeline job will attempt to have pkg.go.dev update docs for xxdk-wasm.
#
# pkg.go.dev relies on the proxy.golang.org service (go module cache/proxy) to
# discover versions of Go modules to make docs of. The proxy keeps a list of all
# known versions of Go modules. The go mod proxy does cache pulls for about 30
# minutes, so if quickly successive commits are done in master/release, this
# will fail to pull the latest client, and the docs will not update.
doc-update:
  stage: doc-update
  except:
    - tags
  image: $DOCKER_IMAGE
  script:
    # GOPRIVATE is cleared so that the public cache is pulled instead of directly pulling client.
    - NEXT_WAIT_TIME=0; until [ $NEXT_WAIT_TIME -eq 15 ] || GOOS=js GOARCH=wasm GOPRIVATE="" go install gitlab.com/elixxir/xxdk-wasm@$CI_COMMIT_SHA; do sleep 60; (( NEXT_WAIT_TIME+=1 )); done; [ $NEXT_WAIT_TIME -lt 15 ]
  only:
    - release
    - master

version-check:
  stage: version-check
  except:
    - tags
  only:
    - master
  image: $DOCKER_IMAGE
  script:
    - GITTAG=$(git describe --tags)
    - CODEVERS=$(cat storage/version.go | grep "const SEMVER =" | cut -d ' ' -f4 | tr -d '"')
    - if [[ $GITTAG != $CODEVERS ]]; then echo "VERSION NUMBER BAD $GITTAG != $CODEVERS"; exit -1; fi