ci(cpan-libs): Add cpan libs tests #465
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 [ ! -z "${{ matrix.no-auto-depends }}" ]; 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" | |
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 }} | |
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@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.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@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.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@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 | |
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", | |
"ZMQ::Constants", | |
"ZMQ::LibZMQ4" | |
] | |
include: | |
- runner_name: ubuntu-24.04 | |
- arch: amd64 | |
- build_distribs: "bullseye,bookworm,jammy" | |
- deb_dependencies: "" | |
- rpm_provides: "" | |
- version: "" | |
- use_dh_make_perl: "true" | |
- distrib: bullseye | |
package_extension: deb | |
image: packaging-plugins-bullseye | |
- distrib: bookworm | |
package_extension: deb | |
image: packaging-plugins-bookworm | |
- distrib: jammy | |
package_extension: deb | |
image: packaging-plugins-jammy | |
- distrib: bullseye | |
package_extension: deb | |
image: packaging-plugins-bullseye-arm64 | |
arch: arm64 | |
runner_name: ["self-hosted", "collect-arm64"] | |
- name: "Device::Modbus::RTU::Client" | |
build_distribs: "bookworm" | |
- name: "Device::Modbus::TCP::Client" | |
build_distribs: "bookworm" | |
- name: "Digest::SHA1" | |
build_distribs: "jammy" | |
- name: "Net::Amazon::Signature::V4" | |
build_distribs: ["bullseye", "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_distribs: "bullseye" | |
version: "0.53" | |
- name: "ZMQ::LibZMQ4" | |
use_dh_make_perl: "false" | |
version: "0.01" | |
deb_dependencies: "libzmq5" | |
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_distribs, matrix.distrib) }} | |
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | |
- if: ${{ contains(matrix.build_distribs, matrix.distrib) }} | |
name: Parse distrib name | |
id: parse-distrib | |
uses: ./.github/actions/parse-distrib | |
with: | |
distrib: ${{ matrix.distrib }} | |
- if: ${{ contains(matrix.build_distribs, matrix.distrib) }} | |
name: Get package infos | |
id: package-infos | |
run: | | |
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_distribs, matrix.distrib) }} | |
name: Check if package already exists | |
id: check-package-existence | |
run: | | |
package_info=$(apt-cache policy ${{ steps.package-infos.outputs.package_name }}) | |
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_distribs, matrix.distrib) && 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 [ ! -z "${{ matrix.no-auto-depends }}" ]; then | |
PACKAGE_DEPENDENCIES="$PACKAGE_DEPENDENCIES --no-auto-depends" | |
fi | |
fpm -a native -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 }} | |
shell: bash | |
- if: ${{ steps.check-package-existence.outputs.do_not_build == 'false' && contains(matrix.build_distribs, matrix.distrib) && matrix.use_dh_make_perl == 'true' }} | |
run: | | |
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 }} | |
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@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.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@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.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@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 | |
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: arm64v8/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 | |
apt-get update | |
shell: bash | |
- name: Restore packages from cache | |
uses: actions/cache/restore@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 | |
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 -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." | |
apt-get install -y $dependency | |
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=$(dpkg -i $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 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 |