# swy: some useful references; the MSVC part of the CI script is based on the one from bind9, by Michał Kępień:
# https://gitlab.com/gitlab-org/ci-cd/shared-runners/images/gcp/windows-containers/blob/master/cookbooks/preinstalled-software/README.md
# https://gitlab.isc.org/isc-projects/bind9/commit/facc6a051fcac70fbbc61cb92a37be8c3e4db5ec#587d266bb27a4dc3022bbed44dfa19849df3044c_718_731
# https://www.kittell.net/code/powershell-unix-sed-equivalent-change-text-file/
# https://powershell.org/forums/topic/how-to-use-ansi-vt100-formatting-in-powershell-ooh-pretty-colors/

#-----------------------------------------------------------------------#
# OpenRGB GitLab CI Configuration                                       #
#-----------------------------------------------------------------------#
.fork_local_runner_rules:
  rules:
  - if: $CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB" || $CI_PIPELINE_SOURCE == "push"
    when: on_success

.fork_gitlab_runner_rules:
  rules:
  - if: $CI_PROJECT_PATH != "CalcProgrammer1/OpenRGB" && $CI_PIPELINE_SOURCE == "push"
    when: manual
    allow_failure: true

.upstream_rules:
  rules:
  - if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
    when: on_success
  - !reference [.fork_gitlab_runner_rules, rules]

.shared_windows_runners:
  tags:
  - shared-windows
  - windows
  - windows-1809

stages:
  - build
  - test
  - deploy

variables:
  GIT_DEPTH: 0

before_script:
 - echo "started by ${GITLAB_USER_NAME}"

#-----------------------------------------------------------------------#
# Supported Devices Build Target                                        #
#-----------------------------------------------------------------------#
"Supported Devices":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-amd64
  tags:
  - linux
  - amd64
  stage: build
  script:
  - qmake
  - make -j$(nproc)
  - ./scripts/build-supported-devices-md.sh $CI_PROJECT_DIR $CI_COMMIT_SHORT_SHA

  artifacts:
    name: "${CI_PROJECT_NAME}_Supported_Devices_${CI_COMMIT_SHORT_SHA}"
    paths:
    - Supported Devices.csv
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) i386 Build Target                                    #
#-----------------------------------------------------------------------#
"Linux i386 AppImage":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-i386
  tags:
  - linux
  - i386
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_i386_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-i386.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) Qt6 i386 Build Target                                #
#-----------------------------------------------------------------------#
"Linux i386 AppImage Qt6":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-i386
  tags:
  - linux
  - i386
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh qt6

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_i386_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-i386.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) amd64 Build Target                                   #
#-----------------------------------------------------------------------#
"Linux amd64 AppImage Base":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-amd64
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_amd64_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-x86_64.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
  - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push"
    when: never

"Linux amd64 AppImage":
  extends: "Linux amd64 AppImage Base"
  rules:
  - !reference [.fork_local_runner_rules, rules]
  tags:
  - linux
  - amd64

"Linux amd64 AppImage (gitlab.com runner)":
  extends: "Linux amd64 AppImage Base"
  rules:
  - !reference [.fork_gitlab_runner_rules, rules]
  tags:
  - "saas-linux-small-amd64"

#-----------------------------------------------------------------------#
# Linux (AppImage) Qt6 amd64 Build Target                               #
#-----------------------------------------------------------------------#
"Linux amd64 AppImage Qt6":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-amd64
  tags:
  - linux
  - amd64
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh qt6

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_amd64_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-x86_64.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) armhf Build Target                                   #
#-----------------------------------------------------------------------#
"Linux armhf AppImage":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-armhf
  tags:
  - linux
  - armhf
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_armhf_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-armhf.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) Qt6 armhf Build Target                               #
#-----------------------------------------------------------------------#
"Linux armhf AppImage Qt6":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-armhf
  tags:
  - linux
  - armhf
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh qt6

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_armhf_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-armhf.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) arm64 Build Target                                   #
#-----------------------------------------------------------------------#
"Linux arm64 AppImage":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-arm64
  tags:
  - linux
  - arm64
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_arm64_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-arm64.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (AppImage) Qt6 arm64 Build Target                               #
#-----------------------------------------------------------------------#
"Linux arm64 AppImage Qt6":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-arm64
  tags:
  - linux
  - arm64
  stage: build
  script:
  - export $(dpkg-architecture)
  - ./scripts/build-appimage.sh qt6

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_arm64_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB-arm64.AppImage
    - 60-openrgb.rules
    - README.md
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm i386 Build Target                        #
#-----------------------------------------------------------------------#
"Linux i386 .deb (Debian Bookworm)":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-i386
  tags:
  - linux
  - i386
  stage: build
  script:
  - ./scripts/build-package-files.sh debian/changelog
  - dpkg-architecture -l
  - dpkg-buildpackage -us -B
  - rm -v ../openrgb-dbgsym*.deb
  - mv -v ../openrgb*.deb ./

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_i386_deb_${CI_COMMIT_SHORT_SHA}"
    paths:
    - openrgb*.deb
    exclude:
    - openrgb-dbgsym*.deb
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm amd64 Build Target                       #
#-----------------------------------------------------------------------#
"Linux amd64 .deb (Debian Bookworm)":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-amd64
  tags:
  - linux
  - amd64
  stage: build
  script:
  - ./scripts/build-package-files.sh debian/changelog
  - dpkg-architecture -l
  - dpkg-buildpackage -us -B
  - rm -v ../openrgb-dbgsym*.deb
  - mv -v ../openrgb*.deb ./

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_amd64_deb_${CI_COMMIT_SHORT_SHA}"
    paths:
    - openrgb*.deb
    exclude:
    - openrgb-dbgsym*.deb
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm armhf Build Target                       #
#-----------------------------------------------------------------------#
"Linux armhf .deb (Debian Bookworm)":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-armhf
  tags:
  - linux
  - armhf
  stage: build
  script:
  - ./scripts/build-package-files.sh debian/changelog
  - dpkg-architecture -l
  - dpkg-buildpackage -us -B
  - rm -v ../openrgb-dbgsym*.deb
  - mv -v ../openrgb*.deb ./

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_armhf_deb_${CI_COMMIT_SHORT_SHA}"
    paths:
    - openrgb*.deb
    exclude:
    - openrgb-dbgsym*.deb
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm arm64 Build Target                       #
#-----------------------------------------------------------------------#
"Linux arm64 .deb (Debian Bookworm)":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-arm64
  tags:
  - linux
  - arm64
  stage: build
  script:
  - ./scripts/build-package-files.sh debian/changelog
  - dpkg-architecture -l
  - dpkg-buildpackage -us -B
  - rm -v ../openrgb-dbgsym*.deb
  - mv -v ../openrgb*.deb ./

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_arm64_deb_${CI_COMMIT_SHORT_SHA}"
    paths:
    - openrgb*.deb
    exclude:
    - openrgb-dbgsym*.deb
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Linux (.rpm, F40) 64-bit Build Target                                 #
#-----------------------------------------------------------------------#
"Linux 64 F40 rpm":
  image: fedora:40
  stage: build
  script:
  - dnf install rpmdevtools dnf-plugins-core libcurl-devel qt5-qtbase-devel git -y
  - rpmdev-setuptree
  - ./scripts/build-package-files.sh fedora/OpenRGB.spec
  - cp fedora/OpenRGB.spec /root/rpmbuild/SPECS
  - cp -rp . /root/rpmbuild/SOURCES/OpenRGB
  - cd /root/rpmbuild
  - dnf builddep SPECS/OpenRGB.spec -y
  - rpmbuild -ba SPECS/OpenRGB.spec
  - cd RPMS/x86_64/
  - mv openrgb*.rpm ${CI_PROJECT_DIR}/
  - cd ${CI_PROJECT_DIR}

  artifacts:
    name: "${CI_PROJECT_NAME}_Linux_64_rpm_${CI_COMMIT_SHORT_SHA}"
    paths:
    - openrgb*.rpm
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Debian i386 Bookworm test                                             #
#-----------------------------------------------------------------------#
"Debian i386 Bookworm":
  image: i386/debian:bookworm
  stage: test
  script:
  - apt update
  - DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*i386.deb
  - openrgb --version
  - apt remove -y openrgb
  dependencies:
  - "Linux i386 .deb (Debian Bookworm)"
  needs:
  - "Linux i386 .deb (Debian Bookworm)"

#-----------------------------------------------------------------------#
# Debian amd64 Bookworm test                                            #
#-----------------------------------------------------------------------#
"Debian amd64 Bookworm":
  image: amd64/debian:bookworm
  stage: test
  script:
  - apt update
  - DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
  - openrgb --version
  - apt remove -y openrgb
  dependencies:
  - "Linux amd64 .deb (Debian Bookworm)"
  needs:
  - "Linux amd64 .deb (Debian Bookworm)"

#-----------------------------------------------------------------------#
# Ubuntu amd64 22.04 test                                               #
#-----------------------------------------------------------------------#
"Ubuntu amd64 22.04LTS":
  image: ubuntu:jammy
  stage: test
  script:
  - apt update
  - DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
  - openrgb --version
  - apt remove -y openrgb
  dependencies:
  - "Linux amd64 .deb (Debian Bookworm)"
  needs:
  - "Linux amd64 .deb (Debian Bookworm)"

#-----------------------------------------------------------------------#
# Ubuntu amd64 24.04 test                                               #
#-----------------------------------------------------------------------#
"Ubuntu amd64 24.04LTS":
  image: ubuntu:noble
  stage: test
  script:
  - apt update
  - DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
  - openrgb --version
  - apt remove -y openrgb
  dependencies:
  - "Linux amd64 .deb (Debian Bookworm)"
  needs:
  - "Linux amd64 .deb (Debian Bookworm)"

#-----------------------------------------------------------------------#
# Fedora 64 v40 test                                                    #
#-----------------------------------------------------------------------#
"Fedora 64 v40":
  image: fedora:40
  stage: test
  script:
  - yum -y localinstall ./openrgb*64.rpm
  - openrgb --version
  - yum -y remove openrgb
  dependencies:
  - "Linux 64 F40 rpm"
  needs:
  - "Linux 64 F40 rpm"

#-----------------------------------------------------------------------#
# Windows (32-bit) Build Target                                         #
#-----------------------------------------------------------------------#
"Windows 32":
  extends:
  - .shared_windows_runners
  stage: build
  script:
  - scripts\build-windows.bat 5.15.0 2019 32
  artifacts:
    name: "${CI_PROJECT_NAME}_Windows_32_${CI_COMMIT_SHORT_SHA}"
    paths:
    - 'OpenRGB Windows 32-bit'
    exclude:
    - 'OpenRGB Windows 32-bit\*.qm'
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Windows (32-bit) Qt6 Build Target                                     #
#-----------------------------------------------------------------------#
"Windows 32 Qt6":
  extends:
  - .shared_windows_runners
  stage: build
  script:
  - scripts\build-windows.bat 6.8.3 2022 32
  artifacts:
    name: "${CI_PROJECT_NAME}_Windows_32_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - 'OpenRGB Windows 32-bit'
    exclude:
    - 'OpenRGB Windows 32-bit\*.qm'
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]

#-----------------------------------------------------------------------#
# Windows (64-bit) Build Target                                         #
#-----------------------------------------------------------------------#
"Windows 64 Base":
  extends:
  - .shared_windows_runners
  stage: build
  script:
  - scripts\build-windows.bat 5.15.0 2019 64
  artifacts:
    name: "${CI_PROJECT_NAME}_Windows_64_${CI_COMMIT_SHORT_SHA}"
    paths:
    - 'OpenRGB Windows 64-bit'
    exclude:
    - 'OpenRGB Windows 64-bit\*.qm'
    expire_in: 30 days

  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push"
      when: never


"Windows 64":
  extends: "Windows 64 Base"
  rules:
  - !reference [.fork_local_runner_rules, rules]

"Windows 64 (gitlab.com runner)":
  extends: "Windows 64 Base"
  before_script:
    - git clone https://gitlab.com/OpenRGBDevelopers/OpenRGB-Qt-Packages
    - cd OpenRGB-Qt-Packages
    - .\install-chocolatey.bat
    - cd ..
  rules:
  - !reference [.fork_gitlab_runner_rules, rules]
  tags:
  - "saas-windows-medium-amd64"

#-----------------------------------------------------------------------#
# Windows (64-bit) Qt6 Build Target                                     #
#-----------------------------------------------------------------------#
"Windows 64 Qt6 Base":
  extends:
  - .shared_windows_runners
  stage: build
  script:
  - scripts\build-windows.bat 6.8.3 2022 64
  artifacts:
    name: "${CI_PROJECT_NAME}_Windows_64_Qt6_${CI_COMMIT_SHORT_SHA}"
    paths:
    - 'OpenRGB Windows 64-bit'
    exclude:
    - 'OpenRGB Windows 64-bit\*.qm'
    expire_in: 30 days

  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push"
      when: never


"Windows 64 Qt6":
  extends: "Windows 64 Qt6 Base"
  rules:
  - !reference [.fork_local_runner_rules, rules]

"Windows 64 Qt6 (gitlab.com runner)":
  extends: "Windows 64 Qt6 Base"
  before_script:
    - git clone https://gitlab.com/OpenRGBDevelopers/OpenRGB-Qt-Packages
    - cd OpenRGB-Qt-Packages
    - .\install-chocolatey.bat
    - cd ..
  rules:
  - !reference [.fork_gitlab_runner_rules, rules]
  tags:
  - "saas-windows-medium-amd64"

#-----------------------------------------------------------------------#
# MacOS Build Target                                                    #
#-----------------------------------------------------------------------#
"MacOS ARM64":
  tags:
  - macos
  stage: build
  script:
  - eval $(/opt/homebrew/bin/brew shellenv)
  - qmake OpenRGB.pro
  - make -j16
  - macdeployqt OpenRGB.app -codesign=OpenRGB

  artifacts:
    name: "${CI_PROJECT_NAME}_MacOS_ARM64_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB.app
    expire_in: 30 days

  rules:
  - if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
    when: on_success
  - if: '$BUILD_MACOS =~ /.+/'
    when: on_success
  - if: $CI_PIPELINE_SOURCE == "push"
    when: manual
    allow_failure: true

"MacOS Intel":
  tags:
  - macos
  stage: build
  script:
  - eval $(/usr/local/bin/brew shellenv)
  - arch -x86_64 /usr/local/bin/qmake OpenRGB.pro
  - arch -x86_64 make -j16
  - arch -x86_64 macdeployqt OpenRGB.app -codesign=OpenRGB

  artifacts:
    name: "${CI_PROJECT_NAME}_MacOS_Intel_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB.app
    expire_in: 30 days

  rules:
  - if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
    when: on_success
  - if: '$BUILD_MACOS =~ /.+/'
    when: on_success
  - if: $CI_PIPELINE_SOURCE == "push"
    when: manual
    allow_failure: true

#-----------------------------------------------------------------------#
# Windows (64-bit) MSI Target                                           #
#-----------------------------------------------------------------------#
"Windows 64 MSI":
  image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-i386
  stage: deploy
  tags:
  - linux
  - i386
  script:
  -  ls -la
  -  ls -la "OpenRGB Windows 64-bit/"
  -  ./scripts/build-msi.sh
  dependencies:
  - "Windows 64"
  needs:
  - "Windows 64"

  artifacts:
    name: "${CI_PROJECT_NAME}_Windows_64_msi_${CI_COMMIT_SHORT_SHA}"
    paths:
    - OpenRGB_Windows_64.msi
    expire_in: 30 days

  rules:
    - !reference [.upstream_rules, rules]
