name: "package-delivery" description: "Deliver packages" inputs: module_name: description: "The package module name" required: true distrib: description: "The distribution used for packaging" required: true arch: description: "The target distribution architecture" required: false cache_key: description: "The cached package key" required: true stability: description: "The package stability (stable, testing, unstable)" required: true release_type: description: "Type of release (hotfix, release)" required: true artifactory_token: description: "token for artifactory" required: true runs: using: "composite" steps: - name: Validate inputs uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | if ('${{ inputs.module_name }}' === '') { throw new Error('module_name input must be defined'); } if (! ['stable', 'testing', 'unstable'].includes('${{ inputs.stability }}')) { throw new Error(`Stability ${{ inputs.stability }} should not deliver packages`); } if ('${{ inputs.stability }}' === 'testing' && ! ['release', 'hotfix'].includes('${{ inputs.release_type }}')) { throw new Error('release_type input must be defined when stability is testing'); } - name: Parse distrib name id: parse-distrib uses: ./.github/actions/parse-distrib with: distrib: ${{ inputs.distrib }} - name: Get repository stability path id: get_repository_stability_path uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | let stabilitySubdirectory = '${{ inputs.stability }}'; if ('${{ inputs.stability }}' === 'testing' && '${{ inputs.release_type }}' === 'hotfix') { stabilitySubdirectory = '${{ inputs.stability }}-${{ inputs.release_type }}'; } let repositoryStabilityPath = ''; if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { repositoryStabilityPath = `rpm-plugins/${{ inputs.distrib }}/${stabilitySubdirectory}`; } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'ubuntu') { repositoryStabilityPath = `ubuntu-plugins-${{ inputs.stability }}`; } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'debian') { repositoryStabilityPath = `apt-plugins-${{ inputs.stability }}`; } else { throw new Error(`Repository cannot be find for distribution: ${{ inputs.distrib }}`); } core.setOutput( 'repository_stability_path', repositoryStabilityPath, ); - if: ${{ inputs.stability != 'stable' }} name: Restore packages from cache uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 with: path: ./*.${{ steps.parse-distrib.outputs.package_extension }} key: ${{ inputs.cache_key }} fail-on-cache-miss: true - uses: jfrog/setup-jfrog-cli@9fe0f98bd45b19e6e931d457f4e98f8f84461fb5 # v4.4.1 with: disable-job-summary: true disable-auto-build-publish: true env: JF_URL: https://centreon.jfrog.io JF_ACCESS_TOKEN: ${{ inputs.artifactory_token }} - if: ${{ inputs.stability == 'testing' }} name: Clean existing testing packages uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { await exec.exec( `jf rt del "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/*/${{ inputs.module_name }}/*.rpm" --exclusions "*/RPMS/*" --quiet` ); } else if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'deb') { await exec.exec( `jf rt del "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --quiet --props "release_type=${{ inputs.release_type }}"` ); } - name: Download packages from testing if: ${{ inputs.stability == 'stable' && github.event_name == 'push' && inputs.distrib != 'jammy' }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const warningNoPromote = 'No packages are promoted because push is not related to a hotfix/release pull request.'; const commitSha = context.sha; const pulls = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, sort: 'updated', direction: 'desc', state: 'closed', per_page: 100 }); const pr = pulls.data.find(p => p.merge_commit_sha === commitSha); if (!pr) { core.warning(warningNoPromote); return; } const prBaseRef = pr?.base?.ref || 'unknown'; let releaseType = ''; switch (true) { case /^release.+/.test(prBaseRef): releaseType = 'release'; break; case /^hotfix.+/.test(prBaseRef): releaseType = 'hotfix'; break; default: core.warning(warningNoPromote); return; } let fromStabilitySubdirectory = 'testing'; if (releaseType === 'hotfix' ) { fromStabilitySubdirectory = `testing-${releaseType}`; } if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'el') { await exec.exec( `jf rt download "rpm-plugins/${{ inputs.distrib }}/${fromStabilitySubdirectory}/*/${{ inputs.module_name }}/*.rpm" --flat` ); } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'ubuntu') { await exec.exec( `jf rt download "ubuntu-plugins-testing/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --props "release_type=${{ inputs.release_type }}" --flat` ); } else if ('${{ steps.parse-distrib.outputs.distrib_family }}' === 'debian') { await exec.exec( `jf rt download "apt-plugins-testing/pool/${{ inputs.module_name }}/*${{ steps.parse-distrib.outputs.package_distrib_name }}*.deb" --props "release_type=${{ inputs.release_type }}" --flat` ); } - name: Publish packages to ${{ inputs.stability }} if: | contains(fromJson('["testing", "unstable"]'), inputs.stability) || (inputs.stability == 'stable' && github.event_name == 'push' && inputs.distrib != 'jammy') uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const path = require('path'); const globber = await glob.create('*.${{ steps.parse-distrib.outputs.package_extension }}'); const debTargetProps = '${{ inputs.stability }}' == 'testing' ? '--target-props "release_type=${{ inputs.release_type }}"' : ''; for await (const file of globber.globGenerator()) { const fileName = path.basename(file); if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'rpm') { let arch = 'noarch'; if (/x86_64/.test(fileName)) { arch = 'x86_64'; } await exec.exec( `jf rt upload "${fileName}" "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/${arch}/${{ inputs.module_name }}/" --flat` ); } else if ('${{ steps.parse-distrib.outputs.package_extension }}' === 'deb') { let arch = 'all'; const matches = fileName.match(/_([^_]+)\.deb/); if (matches !== null && matches.length > 1) { arch = matches[1]; } if ('${{ inputs.arch }}' === '' || '${{ inputs.arch }}' === arch) { await exec.exec( `jf rt upload "${fileName}" "${{ steps.get_repository_stability_path.outputs.repository_stability_path }}/pool/${{ inputs.module_name }}/" --deb "${{ inputs.distrib }}/main/${arch}" ${debTargetProps} --flat` ); } } }