name: perl-cpan-libraries concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true on: workflow_dispatch: pull_request: paths: - ".github/workflows/perl-cpan-libraries.yml" push: branches: - develop - dev-[2-9][0-9].[0-9][0-9].x - master - "[2-9][0-9].[0-9][0-9].x" paths: - ".github/workflows/perl-cpan-libraries.yml" jobs: get-environment: uses: ./.github/workflows/get-environment.yml package-rpm: needs: [get-environment] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: distrib: [el8, el9] name: [ "ARGV::Struct", "Authen::SASL::SASLprep", "Authen::SCRAM::Client", "BSON", "BSON::XS", "Config::AWS", "Convert::Binary::C", "Convert::EBCDIC", "Crypt::Blowfish_PP", "Crypt::OpenSSL::AES", "DataStruct::Flat", "DateTime::Format::Duration::ISO8601", "DBD::Sybase", "Device::Modbus", "Device::Modbus::RTU::Client", "Device::Modbus::TCP::Client", "Email::Send::SMTP::Gmail", "FFI::CheckLib", "FFI::Platypus", "File::SearchPath", "HTTP::ProxyPAC", "JMX::Jmx4Perl", "Mojo::IOLoop::Signal", "MongoDB", "MooseX::ClassAttribute", "Net::Amazon::Signature::V4", "Net::DHCP", "Net::FTPSSL", "Net::HTTPTunnel", "Net::NTP", "Net::SMTPS", "Net::SMTP_auth", "Net::Subnet", "Net::TFTP", "Paws", "PBKDF2::Tiny", "Statistics::Descriptive", "Statistics::Regression", "Term::Clui", "Unicode::Stringprep", "URI::Template", "URL::Encode", "URL::Encode::XS", "UUID", "UUID::URandom", "WWW::Selenium", "XML::LibXML::Simple", "ZMQ::Constants", "ZMQ::FFI", "ZMQ::LibZMQ4" ] include: - build_distribs: "el8,el9" - rpm_dependencies: "" - rpm_provides: "" - version: "" - spec_file: "" - no-auto-depends: "false" - distrib: el8 package_extension: rpm image: packaging-plugins-alma8 - distrib: el9 package_extension: rpm image: packaging-plugins-alma9 - name: "BSON" rpm_provides: "perl(BSON::Bytes) perl(BSON::Code) perl(BSON::DBRef) perl(BSON::OID) perl(BSON::Raw) perl(BSON::Regex) perl(BSON::Time) perl(BSON::Timestamp) perl(BSON::Types) perl(BSON)" - name: "DateTime::Format::Duration::ISO8601" rpm_provides: "perl(DateTime-Format-Duration-ISO8601)" - name: "Device::Modbus::RTU::Client" version: "0.022" - name: "Device::Modbus::TCP::Client" version: "0.026" - name: "FFI::CheckLib" rpm_dependencies: "perl(Env)" - name: "FFI::Platypus" rpm_provides: "perl(FFI::Platypus::Buffer) perl(FFI::Platypus::Memory)" rpm_dependencies: "perl(Capture::Tiny) perl(FFI::CheckLib) perl(File::Spec::Functions) perl(IPC::Cmd) perl(JSON::PP) perl(List::Util) perl(autodie) perl(constant) perl(parent)" no-auto-depends: "true" - name: "Mojo::IOLoop::Signal" rpm_dependencies: "perl-Mojolicious" rpm_provides: "perl(Mojo::IOLoop::Signal)" no-auto-depends: "true" - name: "Net::DHCP" rpm_provides: "perl(Net::DHCP::Constants) perl(Net::DHCP::Packet)" - name: "Net::SMTPS" build_distribs: el9 - name: "Statistics::Descriptive" build_distribs: el9 - name: "Statistics::Regression" version: "0.53" - name: "URL::Encode::XS" build_distribs: el9 - name: "UUID" version: "0.31" - name: "ZMQ::Constants" build_distribs: "el9" - name: "ZMQ::FFI" rpm_dependencies: "zeromq" - name: "ZMQ::LibZMQ4" version: "0.01" rpm_dependencies: "zeromq" name: package ${{ matrix.distrib }} ${{ matrix.name }} container: image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest credentials: username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }} password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }} steps: - if: ${{ contains(matrix.build_distribs, matrix.distrib) }} uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - if: ${{ contains(matrix.build_distribs, matrix.distrib) }} name: Check if package already exists id: check-package-existence run: | package_info=$(dnf provides 'perl(${{ matrix.name }})' 2>&1 | tr '[:upper:]' '[:lower:]' || true) do_not_build="false" if [[ ! $package_info =~ "no matches found" ]]; then package_version=$(echo $package_info | grep -oP 'perl\(${{ matrix.name }}\) = \K[0-9]+\.[0-9]+') if [[ -z "${{ matrix.version }}" || "$package_version" == "${{ matrix.version }}" ]]; then echo "::warning::Package ${{ matrix.name }} already exists in the official ${{ matrix.distrib }} repository with the same version." do_not_build="true" else echo "::warning::Package ${{ matrix.name }} exists in the official ${{ matrix.distrib }} repository with a different version." do_not_build="false" fi fi echo "do_not_build=$do_not_build" >> $GITHUB_OUTPUT shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) && matrix.spec_file == '' }} run: | if [ -z "${{ matrix.version }}" ]; then PACKAGE_VERSION="" else PACKAGE_VERSION=" -v ${{ matrix.version }}" fi if [ -z "${{ matrix.rpm_dependencies }}" ]; then PACKAGE_DEPENDENCIES="" else for PACKAGE_DEPENDENCY in `echo "${{ matrix.rpm_dependencies }}"`; do PACKAGE_DEPENDENCIES="$PACKAGE_DEPENDENCIES --depends "$PACKAGE_DEPENDENCY"" done fi if [ "${{ matrix.no-auto-depends }}" == "true" ]; then PACKAGE_DEPENDENCIES="$PACKAGE_DEPENDENCIES --no-auto-depends" fi if [ -z "${{ matrix.rpm_provides }}" ]; then PACKAGE_PROVIDES="" else for PACKAGE_PROVIDE in `echo "${{ matrix.rpm_provides }}"`; do PACKAGE_PROVIDES="$PACKAGE_PROVIDES --provides $PACKAGE_PROVIDE" done fi export SYBASE="/usr" temp_file=$(mktemp) created_package=$(fpm -s cpan -t ${{ matrix.package_extension }} --rpm-dist ${{ matrix.distrib }} --verbose --cpan-verbose --no-cpan-test$PACKAGE_DEPENDENCIES$PACKAGE_PROVIDES$PACKAGE_VERSION ${{ matrix.name }} | tee "$temp_file" | grep "Created package" | grep -oP '(?<=:path=>").*?(?=")') # Check package name if [ -z "$created_package" ]; then echo "Error: fpm command failed" exit 1 fi # Check rpm rpm2cpio $created_package | cpio -t shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) && matrix.spec_file != '' }} run: | mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} rpmbuild --undefine=_disable_source_fetch -ba ${{ matrix.spec_file }} cp -r ~/rpmbuild/RPMS/noarch/*.rpm . shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) }} name: Replace '::' with - in the feature path id: package-name run: | name="${{ matrix.name }}" name_with_dash="${name//::/-}" echo "Modified Name: $name_with_dash" echo "name_with_dash=$name_with_dash" >> $GITHUB_OUTPUT shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) }} uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: packages-${{ matrix.package_extension }}-${{ matrix.distrib }}-${{ steps.package-name.outputs.name_with_dash }} path: ./*.${{ matrix.package_extension }} retention-days: 1 merge-package-rpm-artifacts: needs: [get-environment, package-rpm] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ubuntu-24.04 strategy: matrix: distrib: [el8, el9] steps: - name: Merge Artifacts uses: actions/upload-artifact/merge@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: packages-rpm-${{ matrix.distrib }} pattern: packages-rpm-${{ matrix.distrib }}-* delete-merged: false # cannot be set to true due to random fails: Failed to DeleteArtifact: Unable to make request: ECONNRESET retention-days: 1 - name: Delete merged artifacts uses: geekyeggo/delete-artifact@f275313e70c08f6120db482d7a6b98377786765b # v5.1.0 with: name: packages-rpm-${{ matrix.distrib }}-* failOnError: false sign-rpm: needs: [get-environment, merge-package-rpm-artifacts] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ubuntu-24.04 strategy: matrix: distrib: [el8, el9] name: sign rpm ${{ matrix.distrib }} container: image: docker.centreon.com/centreon-private/rpm-signing:latest options: -t credentials: username: ${{ secrets.HARBOR_RPM_GPG_SIGNING_REPO_USERNAME }} password: ${{ secrets.HARBOR_RPM_GPG_SIGNING_REPO_TOKEN }} steps: - run: apt-get install -y zstd shell: bash - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: packages-rpm-${{ matrix.distrib }} path: ./ - run: echo "HOME=/root" >> $GITHUB_ENV shell: bash - run: rpmsign --addsign ./*.rpm shell: bash - uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: ./*.rpm key: ${{ github.sha }}-${{ github.run_id }}-rpm-${{ matrix.distrib }} package-deb: needs: [get-environment] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ${{ matrix.runner_name }} strategy: fail-fast: false matrix: image: [packaging-plugins-bullseye, packaging-plugins-bookworm, packaging-plugins-jammy, packaging-plugins-bullseye-arm64] name: [ "ARGV::Struct", "Config::AWS", "Convert::EBCDIC", "Crypt::Blowfish_PP", "Crypt::OpenSSL::AES", "DataStruct::Flat", "DateTime::Format::Duration::ISO8601", "Device::Modbus", "Device::Modbus::RTU::Client", "Device::Modbus::TCP::Client", "Digest::SHA1", "Email::Send::SMTP::Gmail", "Hash::Ordered", "HTTP::ProxyPAC", "JMX::Jmx4Perl", "Mojo::IOLoop::Signal", "Net::Amazon::Signature::V4", "Net::FTPSSL", "Net::HTTPTunnel", "Net::MQTT::Simple", "Paws", "Statistics::Regression", "XS::Loader", "ZMQ::Constants", "ZMQ::LibZMQ4" ] include: - runner_name: ubuntu-24.04 - arch: amd64 - build_names: "bullseye-amd64,bookworm,jammy" - deb_dependencies: "" - rpm_provides: "" - version: "" - use_dh_make_perl: "true" - build_name: bullseye-amd64 distrib: bullseye package_extension: deb image: packaging-plugins-bullseye - build_name: bookworm distrib: bookworm package_extension: deb image: packaging-plugins-bookworm - build_name: jammy distrib: jammy package_extension: deb image: packaging-plugins-jammy - build_name: bullseye-arm64 distrib: bullseye package_extension: deb image: packaging-plugins-bullseye-arm64 arch: arm64 runner_name: ["self-hosted", "collect-arm64"] - name: "Crypt::OpenSSL::AES" use_dh_make_perl: "false" deb_dependencies: "libexporter-tiny-perl libxs-install-perl" no-auto-depends: "true" build_names: "bullseye-amd64,bookworm,jammy,bullseye-arm64" - name: "Device::Modbus::RTU::Client" build_names: "bookworm" - name: "Device::Modbus::TCP::Client" build_names: "bookworm" - name: "Digest::SHA1" build_names: "jammy" - name: "Net::Amazon::Signature::V4" build_names: ["bullseye-amd64", "jammy"] - name: "Net::MQTT::Simple" version: "1.29" - name: "Paws" use_dh_make_perl: "false" deb_dependencies: "libmoose-perl libmoosex-classattribute-perl libjson-maybexs-perl liburl-encode-perl libargv-struct-perl libmoo-perl libtype-tiny-perl libdatastruct-flat-perl libmodule-find-perl libthrowable-perl liburi-template-perl libnet-amazon-signature-v4-perl" no-auto-depends: "true" - name: "Statistics::Regression" build_names: "bullseye-amd64" version: "0.53" - name: "ZMQ::LibZMQ4" use_dh_make_perl: "false" version: "0.01" deb_dependencies: "libzmq5" build_names: "bullseye-amd64,bookworm,jammy,bullseye-arm64" name: package ${{ matrix.distrib }} ${{ matrix.arch }} ${{ matrix.name }} container: image: ${{ vars.DOCKER_INTERNAL_REGISTRY_URL }}/${{ matrix.image }}:latest credentials: username: ${{ secrets.HARBOR_CENTREON_PULL_USERNAME }} password: ${{ secrets.HARBOR_CENTREON_PULL_TOKEN }} steps: - if: ${{ contains(matrix.build_names, matrix.build_name) }} uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - if: ${{ contains(matrix.build_names, matrix.build_name) }} name: Parse distrib name id: parse-distrib uses: ./.github/actions/parse-distrib with: distrib: ${{ matrix.distrib }} - if: ${{ contains(matrix.build_names, matrix.build_name) }} name: Get package infos id: package-infos run: | apt-get update cpan_info=$(cpanm --info ${{ matrix.name }}) if [ -z "${{ matrix.version }}" ]; then CPAN_PACKAGE_VERSION=$(echo $cpan_info | sed 's/\.tar\.gz$//' | sed 's/.*\-//' | sed 's/v//') if [[ ! $CPAN_PACKAGE_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then echo "::error::Invalid version number: ${CPAN_PACKAGE_VERSION}" exit 1 fi PACKAGE_VERSION="${CPAN_PACKAGE_VERSION}" else PACKAGE_VERSION="${{ matrix.version }}" fi echo "package_version=$(echo $PACKAGE_VERSION)" >> $GITHUB_OUTPUT CPAN_PACKAGE_NAME=$(echo $cpan_info | sed 's/.*\///g' | sed 's/-[0-9\.]*\.tar\.gz//g' | tr '[:upper:]' '[:lower:]') PACKAGE_NAME="lib$CPAN_PACKAGE_NAME-perl" echo "package_name=$(echo $PACKAGE_NAME)" >> $GITHUB_OUTPUT shell: bash - if: ${{ contains(matrix.build_names, matrix.build_name) }} name: Check if package already exists id: check-package-existence run: | package_info=$(apt-cache policy ${{ steps.package-infos.outputs.package_name }}) if [[ -n $package_info && "${{ steps.package-infos.outputs.package_name }}" =~ "_" ]]; then package_info=$(apt-cache policy $(echo ${{ steps.package-infos.outputs.package_name }} | sed 's/_//g')) fi do_not_build="false" if [[ -n $package_info ]]; then candidate_version=$(echo "$package_info" | grep 'Candidate:' | awk '{print $2}') if [[ "$candidate_version" == "${{ steps.package-infos.outputs.package_version }}"* ]]; then echo "::warning::Package ${{ steps.package-infos.outputs.package_name }} already exists in the official ${{ matrix.distrib }} repository with the same version." do_not_build="true" else echo "::warning::Package ${{ steps.package-infos.outputs.package_name }} exists in the official ${{ matrix.distrib }} repository with a different version." do_not_build="false" fi fi echo "do_not_build=$do_not_build" >> $GITHUB_OUTPUT shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) && matrix.use_dh_make_perl == 'false' }} run: | if [ -z "${{ matrix.deb_dependencies }}" ]; then PACKAGE_DEPENDENCIES="" else for PACKAGE_DEPENDENCY in `echo ${{ matrix.deb_dependencies }}`; do PACKAGE_DEPENDENCIES="$PACKAGE_DEPENDENCIES --depends $PACKAGE_DEPENDENCY" done fi if [ "${{ matrix.no-auto-depends }}" == "true" ]; then PACKAGE_DEPENDENCIES="$PACKAGE_DEPENDENCIES --no-auto-depends" fi temp_file=$(mktemp) created_package=$(fpm -s cpan -t ${{ matrix.package_extension }} --deb-dist ${{ matrix.distrib }} --iteration ${{ steps.parse-distrib.outputs.package_distrib_name }} --verbose --cpan-verbose --no-cpan-test$PACKAGE_DEPENDENCIES -v ${{ steps.package-infos.outputs.package_version }} ${{ matrix.name }} | tee "$temp_file" | grep "Created package" | grep -oP '(?<=:path=>").*?(?=")') || { echo "Error: fpm command failed"; exit 1; } # Check package name if [ -z "$created_package" ]; then echo "Error: fpm command failed" exit 1 fi # Check deb dpkg-deb --contents $created_package || { echo "Error: dpkg-deb failed for package $created_package"; exit 1; } shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) && matrix.use_dh_make_perl == 'true' }} run: | temp_file=$(mktemp) created_package=$(DEB_BUILD_OPTIONS="nocheck nodocs notest" dh-make-perl make --dist ${{ matrix.distrib }} --build --version ${{ steps.package-infos.outputs.package_version }}${{ steps.parse-distrib.outputs.package_distrib_separator }}${{ steps.parse-distrib.outputs.package_distrib_name }} --cpan ${{ matrix.name }} | tee "$temp_file" | grep "building package" | grep -oP "(?<=in '..\/).*.deb(?=')") || { echo "Error: dh-make-perl command failed"; exit 1; } # Check package name if [ -z "$created_package" ]; then echo "Error: fpm command failed" exit 1 fi # Check deb dpkg-deb --contents $created_package || { echo "Error: dpkg-deb failed for package $created_package"; exit 1; } shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) }} name: Replace '::' with - in the feature path id: package-name run: | name="${{ matrix.name }}" name_with_dash="${name//::/-}" echo "Modified Name: $name_with_dash" echo "name_with_dash=$name_with_dash" >> $GITHUB_OUTPUT shell: bash - if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_names, matrix.build_name) }} uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: packages-${{ matrix.package_extension }}-${{ matrix.distrib }}-${{ matrix.arch }}-${{ steps.package-name.outputs.name_with_dash}} path: ./*.${{ matrix.package_extension }} retention-days: 1 merge-package-deb-artifacts: needs: [get-environment, package-deb] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ubuntu-24.04 strategy: matrix: distrib: [bullseye, bookworm, jammy] steps: - name: Merge Artifacts uses: actions/upload-artifact/merge@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: packages-deb-${{ matrix.distrib }} pattern: packages-deb-${{ matrix.distrib }}-* delete-merged: false # cannot be set to true due to random fails: Failed to DeleteArtifact: Unable to make request: ECONNRESET retention-days: 1 - name: Delete merged artifacts uses: geekyeggo/delete-artifact@f275313e70c08f6120db482d7a6b98377786765b # v5.1.0 with: name: packages-deb-${{ matrix.distrib }}-* failOnError: false download-and-cache-deb: needs: [get-environment, merge-package-deb-artifacts] if: | needs.get-environment.outputs.skip_workflow == 'false' && needs.get-environment.outputs.stability != 'stable' runs-on: ubuntu-24.04 strategy: matrix: distrib: [bullseye, bookworm, jammy] steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: name: packages-deb-${{ matrix.distrib }} path: ./ - uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: ./*.deb key: ${{ github.sha }}-${{ github.run_id }}-deb-${{ matrix.distrib }} test-packages: needs: [get-environment, sign-rpm, download-and-cache-deb] strategy: fail-fast: false matrix: include: - package_extension: rpm image: almalinux:8 distrib: el8 arch: amd64 runner_name: ubuntu-24.04 - package_extension: rpm image: almalinux:9 distrib: el9 arch: amd64 runner_name: ubuntu-24.04 - package_extension: deb image: debian:bullseye distrib: bullseye arch: amd64 runner_name: ubuntu-24.04 - package_extension: deb image: debian:bookworm distrib: bookworm arch: amd64 runner_name: ubuntu-24.04 - package_extension: deb image: ubuntu:jammy distrib: jammy arch: amd64 runner_name: ubuntu-24.04 - package_extension: deb image: debian:bullseye distrib: bullseye arch: arm64 runner_name: ["self-hosted", "collect-arm64"] runs-on: ${{ matrix.runner_name }} container: image: ${{ matrix.image }} name: Test perl CPAN libs packages on ${{ matrix.package_extension }} ${{ matrix.distrib }} ${{ matrix.arch }} steps: - if: ${{ matrix.package_extension == 'rpm' }} name: Install zstd, perl and Centreon repositories run: | dnf install -y zstd perl epel-release 'dnf-command(config-manager)' dnf config-manager --set-enabled powertools || true # alma 8 dnf config-manager --set-enabled crb || true # alma 9 # Import Centreon GPG key GPG_KEY_URL="https://yum-gpg.centreon.com/RPM-GPG-KEY-CES" curl -sSL $GPG_KEY_URL -o RPM-GPG-KEY-CES rpm --import RPM-GPG-KEY-CES shell: bash - if: ${{ matrix.package_extension == 'deb' }} name: Install zstd, perl and Centreon repositories run: | export DEBIAN_FRONTEND=noninteractive apt-get update apt-get install -y zstd perl wget gpg apt-utils procps wget -O- https://apt-key.centreon.com | gpg --dearmor | tee /etc/apt/trusted.gpg.d/centreon.gpg > /dev/null 2>&1 # Avoid apt to clean packages cache directory rm -f /etc/apt/apt.conf.d/docker-clean apt-get update shell: bash - name: Restore packages from cache uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: path: ./*.${{ matrix.package_extension }} key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} fail-on-cache-miss: true - if: ${{ matrix.package_extension == 'rpm' }} name: Install packages run: | error_log="install_error_${{ matrix.distrib }}_${{ matrix.arch }}.log" for package in ./*.rpm; do echo "Installing package: $package" # List dependencies, and remove version and comparison operators dependencies=$(rpm -qpR $package | sed 's/ [0-9.-]*\(\s\|$\)/ /g' | sed 's/ [<>!=]*\(\s\|$\)/ /g') for dependency in $dependencies; do # Skip non-perl dependencies if [[ $dependency != perl* ]]; then continue else echo "Check dependency: $dependency" # Update the dependency name to match the package name dependency=$(echo $dependency | sed 's/(/-/g' | sed 's/)//g' | sed 's/::/-/g') fi # If the dependency has been built in the same workflow, install it if [[ -n $(find . -maxdepth 1 -regex "\.\/$dependency-[0-9v].*\.rpm") ]]; then echo "Installing dependency: $dependency" error_output=$(dnf install -y ./$dependency*.rpm 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; } fi done # Install package, then uninstall it with all his dependencies echo "Package installation..." error_output=$(dnf install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; } echo "Package installation done." echo "Package uninstallation..." error_output=$(dnf autoremove --setopt=keepcache=True -y $(echo $package | sed 's/_[0-9].*\.rpm//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; } echo "Package uninstallation done." done # If the file error_log exists and is not empty, the workflow is in error if [[ -s $error_log ]]; then cat $error_log exit 1 fi shell: bash - if: ${{ matrix.package_extension == 'deb' }} name: Install packages run: | error_log="install_error_${{ matrix.distrib }}_${{ matrix.arch }}.log" for package in ./*.deb; do # If the debian package name ends with amd64 or arm64, we only install it if the tested architecture is the same, otherwise we skip it if [[ $package == *amd64.deb && ${{ matrix.arch }} != "amd64" || $package == *arm64.deb && ${{ matrix.arch }} != "arm64" ]]; then continue fi echo "Installing package: $package" # List dependencies dependencies=$(dpkg-deb -I $package | grep Depends | sed 's/Depends: //' | sed 's/,//g' | sed 's/(\(.*\)//g') || { echo "$error_output" >> $error_log; echo "Error while listing dependencies of the package $package" >> $error_log; true; } for dependency in $dependencies; do # If the dependency exists in the Debian repository, don't check the local dependencies dependency_info=$(apt-cache policy $dependency) if [[ -n $dependency_info ]]; then echo "Dependency $dependency exists in debian repository." else # If the dependency has been built in the same workflow, install it for dependency_package in $(find . -maxdepth 1 -regex "\.\/${dependency}_[0-9].*all\.deb" -o -regex "\.\/${dependency}_[0-9].*${{ matrix.arch }}\.deb"); do echo "Installing dependency: $dependency_package" error_output=$(apt-get install -y ./$dependency_package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the dependency $dependency" >> $error_log; true; } done fi done # Install package, then uninstall it with all his dependencies echo "Package installation..." error_output=$(apt-get install -y $package 2>&1) || { echo "$error_output" >> $error_log; echo "Error during installation of the package $package" >> $error_log; true; } echo "Package installation done." echo "Package uninstallation..." error_output=$(apt-get autoremove -y --purge $(echo $package | sed 's/_[0-9].*\.deb//' | sed 's/.\///') 2>&1) || { echo "$error_output" >> $error_log; echo "Error during autoremove of the package $package" >> $error_log; true; } echo "Package uninstallation done." done # If the file error_log exists and is not empty, the workflow is in error if [[ -s $error_log ]]; then cat $error_log exit 1 fi shell: bash - name: Upload error log if: failure() uses: actions/upload-artifact@v4 with: name: install_error_log_${{ matrix.distrib }}-${{ matrix.arch }} path: install_error_${{ matrix.distrib }}_${{ matrix.arch }}.log deliver-packages: needs: [get-environment, sign-rpm, download-and-cache-deb, test-packages] if: | needs.get-environment.outputs.skip_workflow == 'false' && (contains(fromJson('["testing", "unstable"]'), needs.get-environment.outputs.stability) || ( needs.get-environment.outputs.stability == 'stable' && github.event_name != 'workflow_dispatch')) && ! cancelled() && ! contains(needs.*.result, 'failure') && ! contains(needs.*.result, 'cancelled') runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: include: - distrib: el8 package_extension: rpm - distrib: el9 package_extension: rpm - distrib: bullseye package_extension: deb - distrib: bookworm package_extension: deb - distrib: jammy package_extension: deb name: deliver ${{ matrix.distrib }} steps: - name: Checkout sources uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Delivery uses: ./.github/actions/package-delivery with: module_name: perl-cpan-libraries distrib: ${{ matrix.distrib }} cache_key: ${{ github.sha }}-${{ github.run_id }}-${{ matrix.package_extension }}-${{ matrix.distrib }} stability: ${{ needs.get-environment.outputs.stability }} release_type: ${{ needs.get-environment.outputs.release_type }} artifactory_token: ${{ secrets.ARTIFACTORY_ACCESS_TOKEN }} set-skip-label: needs: [get-environment, deliver-packages] if: | needs.get-environment.outputs.skip_workflow == 'false' && ! cancelled() && ! contains(needs.*.result, 'failure') && ! contains(needs.*.result, 'cancelled') uses: ./.github/workflows/set-pull-request-skip-label.yml