name: gorgone

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

on:
  workflow_dispatch:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
      - ready_for_review
    paths:
      - "gorgone/**"
      - "!gorgone/tests/**"
      - "!gorgone/veracode.json"
      - "!gorgone/.veracode-exclusions"
  push:
    branches:
      - develop
      - dev-[2-9][0-9].[0-9][0-9].x
      - master
      - "[2-9][0-9].[0-9][0-9].x"
    paths:
      - "gorgone/**"
      - "!gorgone/tests/**"
      - "!gorgone/veracode.json"
      - "!gorgone/.veracode-exclusions"

env:
  base_directory: gorgone

jobs:
  get-environment:
    uses: ./.github/workflows/get-environment.yml
    with:
      version_file: gorgone/.version

  veracode-analysis:
    needs: [get-environment]
    if: ${{ needs.get-environment.outputs.is_targeting_feature_branch != 'true' && github.event.pull_request.draft != 'true' }}
    uses: ./.github/workflows/veracode-analysis.yml
    with:
      module_directory: gorgone
      module_name: centreon-gorgone
      major_version: ${{ needs.get-environment.outputs.major_version }}
      minor_version: ${{ needs.get-environment.outputs.minor_version }}
      img_version: ${{ needs.get-environment.outputs.img_version }}
    secrets:
      veracode_api_id: ${{ secrets.VERACODE_API_ID_GORG }}
      veracode_api_key: ${{ secrets.VERACODE_API_KEY_GORG }}
      veracode_srcclr_token: ${{ secrets.VERACODE_SRCCLR_TOKEN }}
      docker_registry_id: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
      docker_registry_passwd: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}

  package:
    needs: [get-environment]
    if: ${{ needs.get-environment.outputs.stability != 'stable' }}

    strategy:
      fail-fast: false
      matrix:
        distrib: [el8, el9, bookworm, jammy]
        include:
          - package_extension: rpm
            image: packaging-nfpm-alma8
            distrib: el8
          - package_extension: rpm
            image: packaging-nfpm-alma9
            distrib: el9
          - package_extension: deb
            image: packaging-nfpm-bookworm
            distrib: bookworm
          - package_extension: deb
            image: packaging-nfpm-jammy
            distrib: jammy

    runs-on: ubuntu-24.04

    container:
      image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:${{ needs.get-environment.outputs.major_version }}
      credentials:
        username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }}
        password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }}

    name: package ${{ matrix.distrib }}

    steps:
      - name: Checkout sources
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Set package version and paths according to distrib
        run: |
          if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
            PERL_VENDORLIB="/usr/share/perl5"
          else
            PERL_VENDORLIB="/usr/share/perl5/vendor_perl"
          fi
          echo "PERL_VENDORLIB=$PERL_VENDORLIB" >> $GITHUB_ENV
        shell: bash

      - name: Generate selinux binaries
        if: ${{ matrix.package_extension == 'rpm' }}
        run: |
          cd gorgone/selinux
          sed -i "s/@VERSION@/${{ needs.get-environment.outputs.major_version }}.${{ needs.get-environment.outputs.minor_version }}/g" centreon-gorgoned.te
          make -f /usr/share/selinux/devel/Makefile
        shell: bash

      - name: Remove selinux packaging files on debian
        if: ${{ matrix.package_extension == 'deb' }}
        run: rm -f gorgone/packaging/*-selinux.yaml
        shell: bash

      - name: Package
        uses: ./.github/actions/package
        with:
          nfpm_file_pattern: "gorgone/packaging/*.yaml"
          distrib: ${{ matrix.distrib }}
          package_extension: ${{ matrix.package_extension }}
          major_version: ${{ needs.get-environment.outputs.major_version }}
          minor_version: ${{ needs.get-environment.outputs.minor_version }}
          release: ${{ needs.get-environment.outputs.release }}
          arch: all
          commit_hash: ${{ github.sha }}
          cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }}
          rpm_gpg_key: ${{ secrets.RPM_GPG_SIGNING_KEY }}
          rpm_gpg_signing_key_id: ${{ secrets.RPM_GPG_SIGNING_KEY_ID }}
          rpm_gpg_signing_passphrase: ${{ secrets.RPM_GPG_SIGNING_PASSPHRASE }}
          stability: ${{ needs.get-environment.outputs.stability }}

  test-gorgone:
    needs: [get-environment, package]

    strategy:
      fail-fast: false
      matrix:
        distrib: [el8, el9, bookworm, jammy]
        include:
          - package_extension: rpm
            image: gorgone-testing-alma8
            distrib: el8
          - package_extension: rpm
            image: gorgone-testing-alma9
            distrib: el9
          - package_extension: deb
            image: gorgone-testing-jammy
            distrib: jammy
          - package_extension: deb
            image: gorgone-testing-bookworm
            distrib: bookworm

    runs-on: ubuntu-24.04
    container:
      image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:${{ needs.get-environment.outputs.gorgone_docker_version }}
      credentials:
        username: ${{ secrets.DOCKER_REGISTRY_ID }}
        password: ${{ secrets.DOCKER_REGISTRY_PASSWD }}

    services:
      mariadb:
        image: mariadb:latest
        ports:
          - 3306
        env:
          MYSQL_USER: centreon
          MYSQL_PASSWORD: password
          MYSQL_ROOT_PASSWORD: password

    steps:
      - name: Get linked branch of centreon repository
        id: centreon_repo_linked_branch
        run: |
          CENTREON_REPO_LINKED_BRANCH=$(git ls-remote -h https://github.com/centreon/centreon.git | grep -E "refs/heads/dev-${{ needs.get-environment.outputs.major_version }}\.x$" >/dev/null 2>&1 && echo "dev-${{ needs.get-environment.outputs.major_version }}.x" || echo develop)

          GIT_BRANCH_EXISTS=$(git ls-remote -h https://github.com/centreon/centreon.git | grep -E "refs/heads/${{ github.head_ref || github.ref_name }}$" >/dev/null 2>&1 && echo yes || echo no)
          if [[ "$GIT_BRANCH_EXISTS" == "yes" ]]; then
            CENTREON_REPO_LINKED_BRANCH="${{ github.head_ref || github.ref_name }}"
          fi

          echo "linked_branch=$CENTREON_REPO_LINKED_BRANCH" >> $GITHUB_OUTPUT
        shell: bash

      - name: Checkout sources
        uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0

      - name: Checkout sources
        uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
        with:
          repository: centreon/centreon
          path: centreon
          ref: ${{ steps.centreon_repo_linked_branch.outputs.linked_branch }}
          sparse-checkout: |
            centreon/www/install/createTables.sql
            centreon/www/install/createTablesCentstorage.sql

      - name: get cached gorgone package
        uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
        with:
          path: ./*.${{ matrix.package_extension }}
          key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }}
          fail-on-cache-miss: true

      - name: Parse distrib name
        id: parse-distrib
        uses: ./.github/actions/parse-distrib
        with:
          distrib: ${{ matrix.distrib }}

      - name: Install gorgone from just built package
        shell: bash
        run: |
          if [[ "${{ matrix.package_extension }}" == "deb" ]]; then
            apt update
            apt install -y ./centreon-gorgone*.deb
          else
            dnf install -y ./centreon-gorgone*.rpm
          fi

      - name: Create databases
        run: |
          mysql -h mariadb -u root -ppassword -e "CREATE DATABASE \`centreon\`"
          mysql -h mariadb -u root -ppassword -e "CREATE DATABASE \`centreon-storage\`"
          mysql -h mariadb -u root -ppassword -e "GRANT ALL PRIVILEGES ON centreon.* TO 'centreon'@'%'"
          mysql -h mariadb -u root -ppassword -e "GRANT ALL PRIVILEGES ON  \`centreon-storage\`.* TO 'centreon'@'%'"
          mysql -h mariadb -u root -ppassword 'centreon' < centreon/centreon/www/install/createTables.sql
          mysql -h mariadb -u root -ppassword 'centreon-storage' < centreon/centreon/www/install/createTablesCentstorage.sql

      - name: Run tests
        run: robot -v 'DBHOST:mariadb' -v 'DBNAME:centreon' -v 'DBNAME_STORAGE:centreon-storage' -v 'DBUSER:centreon' gorgone/tests

      - name: Upload gorgone and robot debug artifacts
        if: failure()
        uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4
        with:
          name: gorgone-debug-${{ matrix.distrib }}
          path: |
            log.html
            /var/log/centreon-gorgone
            /etc/centreon-gorgone
          retention-days: 1

  deliver-sources:
    runs-on: [self-hosted, common]
    needs: [get-environment, package]
    if: ${{ contains(fromJson('["stable"]'), needs.get-environment.outputs.stability) && github.event_name != 'workflow_dispatch' }}

    steps:
      - name: Checkout sources
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Deliver sources
        uses: ./.github/actions/release-sources
        with:
          bucket_directory: centreon-gorgone
          module_directory: gorgone
          module_name: centreon-gorgone
          major_version: ${{ needs.get-environment.outputs.major_version }}
          minor_version: ${{ needs.get-environment.outputs.minor_version }}
          token_download_centreon_com: ${{ secrets.TOKEN_DOWNLOAD_CENTREON_COM }}

  deliver-rpm:
    runs-on: [self-hosted, common]
    needs: [get-environment, package]
    if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }}

    strategy:
      matrix:
        distrib: [el8, el9]

    steps:
      - name: Checkout sources
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Delivery
        uses: ./.github/actions/rpm-delivery
        with:
          module_name: gorgone
          distrib: ${{ matrix.distrib }}
          version: ${{ needs.get-environment.outputs.major_version }}
          artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
          cache_key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }}
          stability: ${{ needs.get-environment.outputs.stability }}
          release_type: ${{ needs.get-environment.outputs.release_type }}
          is_cloud: ${{ needs.get-environment.outputs.is_cloud }}

  deliver-deb:
    runs-on: [self-hosted, common]
    needs: [get-environment, package]
    if: ${{ contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) }}

    strategy:
      matrix:
        distrib: [bookworm]

    steps:
      - name: Checkout sources
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Delivery
        uses: ./.github/actions/deb-delivery
        with:
          module_name: gorgone
          distrib: ${{ matrix.distrib }}
          version: ${{ needs.get-environment.outputs.major_version }}
          artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
          cache_key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }}
          stability: ${{ needs.get-environment.outputs.stability }}
          release_type: ${{ needs.get-environment.outputs.release_type }}
          is_cloud: ${{ needs.get-environment.outputs.is_cloud }}

  promote:
    needs: [get-environment, deliver-rpm, deliver-deb]
    if: |
      (contains(fromJson('["stable", "testing"]'), needs.get-environment.outputs.stability) && github.event_name != 'workflow_dispatch') &&
      ! cancelled() &&
      ! contains(needs.*.result, 'failure') &&
      ! contains(needs.*.result, 'cancelled')
    runs-on: [self-hosted, common]
    strategy:
      matrix:
        distrib: [el8, el9, bookworm]

    steps:
      - name: Checkout sources
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Promote ${{ matrix.distrib }} to stable
        uses: ./.github/actions/promote-to-stable
        with:
          artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }}
          module_name: gorgone
          distrib: ${{ matrix.distrib }}
          major_version: ${{ needs.get-environment.outputs.major_version }}
          stability: ${{ needs.get-environment.outputs.stability }}
          github_ref_name: ${{ github.ref_name }}
          release_type: ${{ needs.get-environment.outputs.release_type }}
          is_cloud: ${{ needs.get-environment.outputs.is_cloud }}
