ci(cpan-libs): Add cpan libs tests #491
Workflow file for this run
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" | |
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 [ ! -z "${{ matrix.no-auto-depends }}" ]; 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: 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 | |
# 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@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." | |
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 |