- Added PIP configuration for internal Nexus repository - Added Python virtual environment for aqtinstall (best practice) - Consolidated system library installations - Improved build script robustness with set -eux - Better cleanup of temporary directories - Consistent with other air-gapped Dockerfiles Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Entire-Checkpoint: 01M6PCY7EM7BVBXP7R43E6963E
External Dependencies CI/CD Pipelines
This directory contains independently versioned, reproducible CI/CD pipelines for each external dependency used in the Legatus Qt6 migration project.
Overview
Following Ubuntu 26.04 standards, each dependency has:
- Dockerfile: Reproducible build environment
- Jenkinsfile: CI/CD pipeline with SBOM generation
- README.md: Usage documentation
- SBOM artifacts: CycloneDX format, SLSA v1.0 provenance, license compliance
Directory Structure
external-dependencies/
├── DEPENDENCIES-INVENTORY.md # Complete dependency inventory
├── scripts/
│ └── generate-sbom.sh # Reusable SBOM generation script
├── ubuntu-26.04-build-container/ # Main build container (all dependencies)
├── qt6-framework/ # Qt6 6.10.2 pipeline
├── kdreports/ # KDReports 2.3.0 pipeline
├── log4qt/ # Log4Qt 2.0.0 pipeline
├── grantlee/ # Grantlee 5.3.1 pipeline
├── googletest/ # GoogleTest 1.15.2 pipeline
└── postgresql/ # PostgreSQL 16 pipeline
Dependency Graph
ubuntu-26.04-build-container (base)
├── qt6-framework (Qt6 6.10.2)
│ └── kdreports (KDReports 2.3.0)
├── log4qt (Log4Qt 2.0.0)
├── grantlee (Grantlee 5.3.1 with Qt6)
├── googletest (GoogleTest 1.15.2)
└── postgresql (PostgreSQL 16)
Usage
Building Individual Packages
Each package can be built independently:
cd external-dependencies/log4qt
docker build -t legatus-log4qt:2.0.0 .
Running Jenkins Pipelines
-
Import the Jenkinsfile into your Jenkins instance
-
Configure environment variables:
GIT_URL: Repository URLGIT_COMMIT: Commit SHABUILD_NUMBER: Jenkins build numberHARBOR_REGISTRY: Container registry URLHARBOR_CREDENTIALS_ID: Jenkins credentials ID
-
Trigger the build
SBOM Generation
SBOMs are automatically generated by the Jenkins pipeline. To generate manually:
cd external-dependencies/scripts
./generate-sbom.sh <package-name> <version> <output-dir>
Example:
./generate-sbom.sh log4qt 2.0.0 ./sbom-output
This generates:
<package>-sbom.json: CycloneDX SBOM<package>-provenance.json: SLSA v1.0 provenance<package>-licenses.txt: License compliance report
Version Pinning Strategy
All dependencies use exact version pinning:
- No floating versions (e.g.,
>=1.0.0) - No
latesttags - Semantic versioning with major.minor.patch
- Git commit SHA for source-based builds
Example:
ENV QT_VERSION=6.10.2
ENV KDREPORTS_VERSION=2.3.0
ENV LOG4QT_VERSION=2.0.0
Security Considerations
Proprietary Dependencies
RTI Connext DDS and ArcGIS Runtime SDK are NOT included in these pipelines:
- They are proprietary and require commercial licenses
- They must be mounted at runtime from the host
- They are excluded from Docker images and SBOMs
See DEPENDENCIES-INVENTORY.md for license requirements.
License Files
DO NOT COMMIT LICENSE FILES TO GIT
The following files are in .gitignore:
rti_license.dat: RTI Connext DDS licenseArcGIS_Maps_SDK_Qt_linux_300.0.0.zip: ArcGIS installer
These must be provided at runtime via secure mounting or environment variables.
Harbor Registry
All built images are pushed to the internal Harbor registry:
harbor.sl.defence-elec.de/legatus/<package-name>:<version>
Example:
harbor.sl.defence-elec.de/legatus/log4qt:2.0.0
Ubuntu 26.04 Base
All containers use Ubuntu 26.04 (Noble Numbat) as the base OS for:
- Consistency across all packages
- Security updates and LTS support
- Compatibility with Qt6 requirements
Build Container
The main build container (ubuntu-26.04-build-container) includes all dependencies and is used for:
- Full Legatus builds
- Integration testing
- Release builds
Usage:
cd external-dependencies/ubuntu-26.04-build-container
docker build -t legatus-build:ubuntu-26.04 .
SBOM Requirements
All SBOMs follow these standards:
CycloneDX 1.6
- Component metadata
- License information
- Dependency graph
- PURL identifiers
SLSA v1.0 Provenance
- Build definition
- External parameters (source, commit, dockerfile)
- Run details (builder ID, invocation, timestamp)
License Compliance
- Package license identification
- Dependency licenses
- Compliance status
- Review requirements
Maintenance
Updating Dependencies
- Update version in Dockerfile
- Update version in Jenkinsfile
- Update version in README.md
- Run pipeline to verify build
- Update DEPENDENCIES-INVENTORY.md
Adding New Dependencies
- Create directory:
external-dependencies/<package-name>/ - Copy template from existing package
- Update Dockerfile with installation steps
- Update Jenkinsfile with package metadata
- Add to DEPENDENCIES-INVENTORY.md
- Add to dependency graph in README.md
Troubleshooting
Build Failures
- Check Docker build logs
- Verify network access to package repositories
- Check for version conflicts
- Review Jenkins pipeline console output
SBOM Generation Issues
- Ensure
generate-sbom.shis executable - Check environment variables (GIT_URL, GIT_COMMIT, BUILD_NUMBER)
- Verify output directory permissions
References
- DEPENDENCIES-INVENTORY.md: Complete dependency list
- Qt6 Migration Verification Report
- Docker Build Script