- Introduced global usings for Ruby analyzer. - Implemented RubyLockData, RubyLockEntry, and RubyLockParser for handling Gemfile.lock files. - Created RubyPackage and RubyPackageCollector to manage Ruby packages and vendor cache. - Developed RubyAnalyzerPlugin and RubyLanguageAnalyzer for analyzing Ruby projects. - Added tests for Ruby language analyzer with sample Gemfile.lock and expected output. - Included necessary project files and references for the Ruby analyzer. - Added third-party licenses for tree-sitter dependencies.
		
			
				
	
	
	
		
			4.1 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			4.1 KiB
		
	
	
	
	
	
	
	
Issuer Directory Offline Kit Notes
Purpose
Operators bundling Stella Ops for fully disconnected environments must include the Issuer Directory service so VEX Lens, Excititor, and Policy Engine can resolve trusted issuers without reaching external registries.
1 · Bundle contents
Include the following artefacts in your Offline Update Kit staging tree:
| Path (within kit) | Source | Notes | 
|---|---|---|
images/issuer-directory-web.tar | 
registry.stella-ops.org/stellaops/issuer-directory-web (digest from deploy/releases/<channel>.yaml) | 
Export with crane pull --format=tar or skopeo copy docker://... oci:.... | 
config/issuer-directory/issuer-directory.yaml | 
etc/issuer-directory.yaml (customised) | 
Replace Authority issuer, tenant header, and log level as required. | 
config/issuer-directory/csaf-publishers.json | 
src/IssuerDirectory/StellaOps.IssuerDirectory/data/csaf-publishers.json or regional override | 
Operators can edit before import to add private publishers. | 
secrets/issuer-directory/connection.env | 
Secure secret store export (ISSUER_DIRECTORY_MONGO_CONNECTION_STRING=) | 
Encrypt at rest; Offline Kit importer places it in the Compose/Helm secret. | 
docs/issuer-directory/deployment.md | 
docs/modules/issuer-directory/operations/deployment.md | 
Ship alongside kit documentation for operators. | 
Image digests: Update
deploy/releases/2025.10-edge.yaml(or the relevant manifest) with the exact digest before building the kit sooffline-manifest.jsoncan assert integrity.
2 · Compose (air-gapped) deployment
- Load images locally on the target:
docker load < images/issuer-directory-web.tar - Copy Compose artefacts:
cp deploy/compose/docker-compose.airgap.yaml . cp deploy/compose/env/airgap.env.example airgap.env cp secrets/issuer-directory/connection.env issuer-directory.mongo.env - Update 
airgap.envwith site-specific values (Authority issuer, tenant, ports) and remove outbound endpoints. - Bring up the service:
docker compose \ --env-file airgap.env \ --env-file issuer-directory.mongo.env \ -f docker-compose.airgap.yaml up -d issuer-directory - Verify via 
curl -k https://issuer-directory.airgap.local:8447/health/live. 
3 · Kubernetes (air-gapped) deployment
- Pre-load the OCI image into your local registry mirror and update 
values-airgap.yamlto reference it. - Apply the secret bundled in the kit:
(Generate this file during packaging with
kubectl apply -f secrets/issuer-directory/connection-secret.yamlkubectl create secret generic issuer-directory-secrets ... --dry-run=client -o yaml.) - Install/upgrade the chart:
helm upgrade --install stellaops deploy/helm/stellaops \ -f deploy/helm/stellaops/values-airgap.yaml \ --set services.issuer-directory.env.ISSUERDIRECTORY__AUTHORITY__ISSUER=https://authority.airgap.local/realms/stellaops - Confirm 
issuer_directory_changes_totalis visible in your offline Prometheus stack. 
4 · Import workflow summary
- Run 
ops/offline-kit/build_offline_kit.pywith the additional artefacts noted above. - Sign the resulting tarball and manifest (Cosign) and record the SHA-256 in the release notes.
 - At the destination:
stellaops-cli offline kit import \ --bundle stella-ops-offline-kit-<version>-airgap.tar.gz \ --destination /opt/stellaops/offline-kit - Follow the Compose or Helm path depending on your topology.
 
5 · Post-import validation
docker images | grep issuer-directory(Compose) orkubectl get deploy stellaops-issuer-directory(Helm) shows the expected version.csaf-publishers.jsonin the container matches the offline bundle (hash check)./issuer-directory/issuersreturns global seed issuers (requires token withissuer-directory:readscope).- Audit collection receives entries when you create/update issuers offline.
 - Offline kit manifest (
offline-manifest.json) listsimages/issuer-directory-web.tarandconfig/issuer-directory/issuer-directory.yamlwith SHA-256 values you recorded during packaging.