# This file is a template, and might need editing before it works on your project.
# The following script will work for any project that can be built from command line by msbuild
# It uses powershell shell executor, so you need to add the following line to your config.toml file
# (located in gitlab-runner.exe directory):
#   shell = "powershell"
#
# The script is composed of 3 stages: build, test and deploy.
#
# The build stage restores NuGet packages and uses msbuild to build the exe and msi
# One major issue you'll find is that you can't build msi projects from command line
# if you use vdproj.  There are workarounds building msi via devenv, but they rarely work
# The best solution is migrating your vdproj projects to WiX, as it can be build directly
# by msbuild.
#
# The test stage runs nunit from command line against Test project inside your solution
# It also saves the resulting TestResult.xml file
#
# The deploy stage copies the exe and msi from build stage to a network drive
# You need to have the network drive mapped as Local System user for gitlab-runner service to see it
# The best way to persist the mapping is via a scheduled task (see: https://stackoverflow.com/a/7867064/1288473),
# running the following batch command: net use P: \\x.x.x.x\Projects /u:your_user your_pass /persistent:yes


# place project specific paths in variables to make the rest of the script more generic
variables:
  GIT_SUBMODULE_STRATEGY: recursive
  LIB_RELEASE_FOLDER: 'Borepin\Borepin\bin\Release'
  UWP_RELEASE_FOLDER: 'Borepin\Borepin.UWP\bin\x86\Release'
  TEST_FOLDER: 'Tests\bin\Release'
#   DEPLOY_FOLDER: 'P:\Projects\YourApp\Builds'
  NUGET_PATH: 'C:\ProgramData\chocolatey\bin\nuget.exe'
  DOTNET_PATH: 'C:\Program Files\dotnet\dotnet.exe'
  MSBUILD_PATH: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\msbuild.exe'
  NUNIT_PATH: 'C:\ProgramData\chocolatey\bin\nunit3-console.exe'

stages:
  - build
  - test
  - deploy

build_base:
  stage: build
  tags:
      - xamarin
      - windows
#   only:
#     - tags  # the build process will only be started by git tag commits
  script:
    - '& "$env:NUGET_PATH" restore'  # restore Nuget dependencies
    - '& "$env:MSBUILD_PATH" /p:Configuration=Release /target:Borepin'  # build the project
  artifacts:
    expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
    paths:
      - '$env:LIB_RELEASE_FOLDER'  # saving exe to copy to deploy folder
      # - '$env:TEST_FOLDER\'  # saving entire Test project so NUnit can run tests

build_UWP:
  needs:
    - build_base
  stage: build
  tags:
      - xamarin
      - windows
#   only:
#     - tags  # the build process will only be started by git tag commits
  script:
    - '& "$env:NUGET_PATH" restore'  # restore Nuget dependencies
    - '& "$env:MSBUILD_PATH" /p:Configuration=Debug /target:Borepin_UWP'  # build the project
#  artifacts:
#    expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
#    paths:
#      - '$env:UWP_RELEASE_FOLDER'  # saving exe to copy to deploy folder
#      - '$env:TEST_FOLDER\'  # saving entire Test project so NUnit can run tests

build_Android:
  needs:
    - build_base
  stage: build
  tags:
      - xamarin
      - windows
#   only:
#     - tags  # the build process will only be started by git tag commits
  script:
    - '& "$env:NUGET_PATH" restore'  # restore Nuget dependencies
    - '& "$env:MSBUILD_PATH" /p:Configuration=Release /target:Borepin_Android:PackageForAndroid /target:Borepin_Android:SignAndroidPackage /p:AndroidKeyStore="True" /p:AndroidSigningKeyStore="$AndroidKeyStore" /p:AndroidSigningKeyPass="$AndroidKeyStore_Password" /p:AndroidSigningKeyAlias="$AndroidKeyStore_ID" /p:AndroidSigningStorePass="$AndroidKeyStore_Password"' # build the project  
    - echo $AndroidKeyStore
  artifacts:
    expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
    paths:
      - Borepin/Borepin.Android/bin/Release/org.fabinfra.fabaccess.aab  # saving apk to copy to deploy folder
      - Borepin/Borepin.Android/bin/Release/
      # - '$env:TEST_FOLDER\'  # saving entire Test project so NUnit can run tests

build_iOS:
  needs:
    - build_base
  stage: build
  tags:
      - macos
    # only:
    #   - tags  # the build process will only be started by git tag commits
  script:
    - 'nuget restore'  # restore Nuget dependencies
    - 'msbuild /t:Borepin_iOS /p:Configuration=Debug /p:Platform=iPhone /p:ArchiveOnBuild=true'  # build the project  /p:AndroidKeyStore=True
  artifacts:
    expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
    paths:
      - Borepin/Borepin.iOS/bin/iPhone/Debug/Borepin.ipa
      - Borepin/Borepin.iOS/bin/iPhone/Debug/Borepin.app.dSYM
      #  - '$env:TEST_FOLDER\'  # saving entire Test project so NUnit can run tests

build_GTK:
  needs:
    - build_base
  stage: build
  image: registry.gitlab.com/fabinfra/gtk-sharp-build:latest
  tags:
      - docker
#   only:
#     - tags  # the build process will only be started by git tag commits
  script:
    - 'nuget restore'  # restore Nuget dependencies
    - 'msbuild -t:Borepin_GTK'  # build the project  /p:AndroidKeyStore=True
  artifacts:
    expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
    paths:
      - Borepin/Borepin.GTK/bin/Debug/

# test_job:
#   stage: test
#   tags:
#       - xamarin
#       - windows
# #   only:
# #     - tags
#   script:
#     - '& "$env:NUNIT_PATH" ".\$env:TEST_FOLDER\Tests.dll"'  # running NUnit tests
#   artifacts:
#     when: always  # save test results even when the task fails
#     expire_in: 1 week  # save gitlab server space, we copy the files we need to deploy folder later on
#     paths:
#       - '.\TestResult.xml'  # saving NUnit results to copy to deploy folder
#   dependencies:
#     - build_job

# deploy_job:
#   stage: deploy
#   only:
#     - tags
#   script:
#     # Compose a folder for each release based on commit tag.
#     # Assuming your tag is Rev1.0.0.1, and your last commit message is 'First commit'
#     # the artifact files will be copied to:
#     # P:\Projects\YourApp\Builds\Rev1.0.0.1 - First commit\
#     - '$commitSubject = git log -1 --pretty=%s'
#     - '$deployFolder = $($env:DEPLOY_FOLDER) + "\" + $($env:CI_BUILD_TAG) + " - " + $commitSubject + "\"'

#     # xcopy takes care of recursively creating required folders
#     - 'xcopy /y ".\$env:EXE_RELEASE_FOLDER\YourApp.exe" "$deployFolder"'
#     - 'xcopy /y ".\$env:MSI_RELEASE_FOLDER\YourApp Setup.msi" "$deployFolder"'
#     - 'xcopy /y ".\TestResult.xml" "$deployFolder"'
#   dependencies:
#     - build_job
#     - test_job