stages:
  - test
  - ui
  - build
  - deploy
  - release


test:
  image: "rust:slim-buster"
  stage: test
  script:
    - mkdir dist
    - touch dist/index.html
    - cargo test

build-ui:
  stage: ui
  image: node:16.13-slim
  script:
    - apt-get update
    - apt-get -y install libssl-dev
    - npm install
    - npm run build
  rules:
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG
  artifacts:
    paths:
      - dist/

build-x64-bin:
  dependencies:
    - build-ui
  image: "rust:slim-buster"
  stage: build
  tags:
    - linux
  rules:
  - if: $CI_COMMIT_TAG
  script:
    - cargo build --release
    - cd target/release
    - tar -czf ../../vade-linux-x64.tar.gz vade
    - cd ../../
  artifacts:
    paths:
      - target/release/vade
      - vade-linux-x64.tar.gz


build-musl-bin:
  dependencies:
    - build-ui
  stage: build
  image: 'rust:latest'
  rules:
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG
  script:
    - rustup target add x86_64-unknown-linux-musl
    - apt update && apt install -y musl-tools musl-dev
    - update-ca-certificates
    - cargo build --target x86_64-unknown-linux-musl --release
    - cd target/x86_64-unknown-linux-musl/release/
    - tar -czf ../../../vade-linux-musl.tar.gz vade
    - cd ../../../
  artifacts:
    paths:
      - vade-linux-musl.tar.gz
      - target/x86_64-unknown-linux-musl/release/vade

build-arm-bin:
  dependencies:
    - build-ui
  stage: build
  image: 'rust:latest'
  rules:
  - if: $CI_COMMIT_TAG
  script:
    - rustup target add armv7-unknown-linux-gnueabihf
    - apt update
    - apt-get -y install gcc-arm-linux-gnueabihf
    - cargo build --target armv7-unknown-linux-gnueabihf --release
    - cd target/armv7-unknown-linux-gnueabihf/release/
    - tar -czf ../../../vade-linux-arm.tar.gz vade
    - cd ../../../
  artifacts:
    paths:
      - target/armv7-unknown-linux-gnueabihf/release/vade
      - vade-linux-arm.tar.gz


build-win-bin:
  dependencies:
    - build-ui
  stage: build
  tags:
    - windows
  rules:
  - if: $CI_COMMIT_TAG
  script:
    - cargo build --release
  artifacts:
    paths:
      - target/release/vade.exe

deploy-dev-docker:
  dependencies:
    - build-musl-bin
  stage: deploy
  image: docker:latest
  script:
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY/vade/vade-mecum .
    - docker push $CI_REGISTRY/vade/vade-mecum
  rules:
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG

deploy-binaries:
  dependencies:
    - build-x64-bin
    - build-musl-bin
    - build-arm-bin
    - build-win-bin
  image: curlimages/curl:latest
  stage: deploy
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ./vade-linux-x64.tar.gz "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bin/$CI_COMMIT_TAG/vade-linux-x64-$CI_COMMIT_TAG.tar.gz"'
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ./vade-linux-arm.tar.gz "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bin/$CI_COMMIT_TAG/vade-linux-arm-$CI_COMMIT_TAG.tar.gz"'
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ./vade-linux-musl.tar.gz "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bin/$CI_COMMIT_TAG/vade-linux-musl-$CI_COMMIT_TAG.tar.gz"'
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ./target/release/vade.exe "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/bin/$CI_COMMIT_TAG/vade.exe"'

release:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - echo "running release_job"
  release:
    name: 'Release v$CI_COMMIT_TAG'
    description: 'Version $CI_COMMIT_TAG'
    tag_name: '$CI_COMMIT_TAG'
    ref: '$CI_COMMIT_TAG'
    assets:
      links:
        - name: 'vade-linux-x64-$CI_COMMIT_TAG.tar.gz'
          url: '${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/linux-bin/$CI_COMMIT_TAG/vade-linux-x64-$CI_COMMIT_TAG.tar.gz'
