#include:
#- template: Security/SAST.gitlab-ci.yml

variables:
  CI_HAWK_ARTIFACT_NAME: "BizHawk_devbuild_${CI_COMMIT_SHORT_SHA}"
  CI_HAWK_TMPARTIFACT_NAME: "BizHawk_tempbuild_${CI_COMMIT_REF_SLUG}_${CI_COMMIT_SHORT_SHA}"

stages:
  - build
  - test
  - package

build:
  artifacts:
    expire_in: "30 minutes"
    name: "$CI_HAWK_TMPARTIFACT_NAME"
    paths:
      - output
  image: mcr.microsoft.com/dotnet/sdk:5.0
  script:
    - if [ "$CI_COMMIT_REF_SLUG" == "release" ]; then Dist/UpdateVersionInfoForRelease.sh; fi
    - Dist/BuildRelease.sh
  stage: build

build_ext_tools:
  allow_failure: true
  image: mcr.microsoft.com/dotnet/sdk:5.0
  needs:
    - build
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: always
  script:
    - for d in $CI_PROJECT_DIR/ExternalToolProjects/*; do if [ -d "$d" ]; then cd "$d" && ./build_release.sh; fi; done
  stage: test

check_style:
  image: mcr.microsoft.com/dotnet/sdk:5.0
  needs:
    - job: build
      artifacts: false
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: always
      allow_failure: true
    - if: $BIZHAWKBUILD_USE_ANALYZERS != null
      when: always
      allow_failure: false
  script:
    - Dist/BuildRelease.sh -p:MachineRunAnalyzersDuringBuild=true || Dist/BuildRelease.sh -p:MachineRunAnalyzersDuringBuild=true
  stage: test

.package_linux_x64:
  artifacts:
    expire_in: "1 month"
    name: "$CI_HAWK_ARTIFACT_NAME.tar"
    paths:
      - "$CI_HAWK_ARTIFACT_NAME.tar"
  image: debian:buster-slim
  needs:
    - build
  script:
    - su -c "apt-get update && apt-get -y install p7zip-full"
    - Dist/Package.sh "linux-x64"
    - cd packaged_output
    - tar -cf "../$CI_HAWK_ARTIFACT_NAME.tar" *
  stage: package

.package_windows_x64:
  artifacts:
    expire_in: "1 month"
    name: "$CI_HAWK_ARTIFACT_NAME"
    paths:
      - ./*
  image: debian:buster-slim
  needs:
    - build
  script:
    - su -c "apt-get update && apt-get -y install p7zip-full"
    - Dist/Package.sh "windows-x64"
      # now we replace $CI_PROJECT_DIR with $CI_PROJECT_DIR/packaged_output, so that the archival step will put everything at the top level
    - mv packaged_output ..
    - cd ..
    - rm -fr $CI_PROJECT_DIR
    - mv packaged_output $CI_PROJECT_DIR
  stage: package

package_devbuild_linux:
  extends: .package_linux_x64
  rules:
    - if: $CI_COMMIT_REF_SLUG == "master"
      when: always

package_devbuild_windows:
  extends: .package_windows_x64
  rules:
    - if: $CI_COMMIT_REF_SLUG == "master"
      when: always

package_release_linux:
  extends: .package_linux_x64
  rules:
    - if: $CI_COMMIT_REF_SLUG == "release"
      when: always
  variables:
    CI_HAWK_ARTIFACT_NAME: "BizHawk_release_${CI_COMMIT_SHORT_SHA}"

package_release_windows:
  extends: .package_windows_x64
  rules:
    - if: $CI_COMMIT_REF_SLUG == "release"
      when: always
  variables:
    CI_HAWK_ARTIFACT_NAME: "BizHawk_release_${CI_COMMIT_SHORT_SHA}"

run_tests:
  artifacts:
    paths:
      - test_output/*.coverage.xml
    reports:
      junit:
        - test_output/*.coverage.xml
  image: mcr.microsoft.com/dotnet/sdk:5.0
  needs:
    - job: build
      artifacts: false
  script:
    - Dist/BuildTestRelease.sh || Dist/BuildTestRelease.sh
  stage: test

#sast:
#  variables:
#    SAST_EXCLUDED_ANALYZERS: bandit, brakeman, eslint, flawfinder, gosec, kubesec, nodejs-scan, phpcs-security-audit, pmd-apex, sobelow, spotbugs
#  stage: test

#cache:
#  key: "$CI_COMMIT_REF_SLUG"
#  paths:
#    - $HOME/.nuget/packages # probably won't work; set NUGET_PACKAGES to `BizHawk_master/.nuget_packages` and cache that
