Add multi-distribution ostree backport support for Ubuntu Noble and Debian Trixie
Some checks failed
Build libostree Backport / Build libostree Backport (push) Failing after 17m20s
Build ostree Backports / Build ostree Backport for noble (push) Failing after 2m37s

- Add main ostree-backport.sh script with distribution selection
- Add wrapper scripts: backport-noble.sh and backport-trixie.sh
- Add usage-guide.sh for comprehensive documentation
- Update CI/CD workflows with improved multi-distribution support
- Add test-build.yml workflow for quick validation
- Update README.md with multi-distribution documentation
- Add CI-CD-IMPROVEMENTS.md with detailed workflow documentation
- Remove old .deb files (steam.deb, wget_1.21.4-1ubuntu4.1_amd64.deb)

Features:
- Ubuntu Noble: Source from Questing, target Noble
- Debian Trixie: Source from sid, target Trixie
- Enhanced error handling and logging
- Manual triggers for single/all distributions
- Comprehensive CI/CD documentation
This commit is contained in:
robojerk 2025-08-05 09:33:14 -07:00
parent 23c2ad7ace
commit 38e017cef3
10 changed files with 1018 additions and 21 deletions

View file

@ -0,0 +1,391 @@
name: Build ostree Backports
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
workflow_dispatch:
inputs:
target_distro:
description: 'Target distribution to build for'
required: true
default: 'noble'
type: choice
options:
- noble
- trixie
build_all:
description: 'Build for all distributions'
required: false
default: false
type: boolean
env:
OSTREE_VERSION: "2025.2"
OSTREE_DEBIAN_REVISION: "1"
jobs:
build-ostree-backport:
name: Build ostree Backport for ${{ github.event.inputs.target_distro || 'noble' }}
runs-on: ubuntu-latest
container:
image: ubuntu:latest
strategy:
matrix:
target_distro: ${{ github.event.inputs.build_all == 'true' && fromJSON('["noble", "trixie"]') || fromJSON('["' + (github.event.inputs.target_distro || 'noble') + '"]') }}
include:
- target_distro: noble
distro_type: ubuntu
source_release: questing
target_release: noble
backport_suffix: ~noble1
pool_url: http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/
sources_list: "deb-src http://us.archive.ubuntu.com/ubuntu/ noble main universe"
package_upload_path: noble/main
- target_distro: trixie
distro_type: debian
source_release: sid
target_release: trixie
backport_suffix: ~trixie1
pool_url: http://deb.debian.org/debian/pool/main/o/ostree/
sources_list: "deb-src http://deb.debian.org/debian/ trixie main contrib non-free"
package_upload_path: trixie/main
steps:
- name: Setup build environment
run: |
echo "=== Setting up build environment for ${{ matrix.target_distro }} ==="
apt update -y
apt install -y devscripts build-essential wget git curl jq
- name: Checkout repository
run: |
echo "=== Checking out repository ==="
git clone https://git.raines.xyz/robojerk/libostree-dev.git /tmp/libostree-dev
cp -r /tmp/libostree-dev/* .
cp -r /tmp/libostree-dev/.* . 2>/dev/null || true
echo "Repository checked out successfully"
- name: Debug - Check ACCESS_TOKEN (safe)
run: |
echo "=== Debugging ACCESS_TOKEN for ${{ matrix.target_distro }} ==="
echo "Token exists: ${{ secrets.FORGEJO_TOKEN != '' }}"
echo "Token length: ${#FORGEJO_TOKEN}"
echo "Token first 4 chars: $(echo "$FORGEJO_TOKEN" | cut -c1-4)..."
echo "Token last 4 chars: ...$(echo "$FORGEJO_TOKEN" | rev | cut -c1-4 | rev)"
echo "Environment variable name: FORGEJO_TOKEN"
echo "Available secrets:"
env | grep -i token || echo "No token env vars found"
env:
FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
- name: Test API endpoints
run: |
echo "=== Testing Forgejo API endpoints for ${{ matrix.target_distro }} ==="
# Test 1: Check Forgejo version and capabilities
echo "Testing Forgejo version..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/version" | jq . 2>/dev/null || echo "Version endpoint failed"
echo ""
echo "=== Testing user info ==="
# Test 2: Check user info
echo "Testing user info..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/user" | jq . 2>/dev/null || echo "User endpoint failed"
echo ""
echo "=== Testing repository info ==="
# Test 3: Check repository info
echo "Testing repository info..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/repos/robojerk/libostree-dev" | jq . 2>/dev/null || echo "Repository endpoint failed"
echo ""
echo "=== Testing package registry endpoints ==="
# Test 4: Check if package registry is enabled
echo "Testing package registry availability..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/user/packages" | jq . 2>/dev/null || echo "User packages endpoint failed"
echo ""
echo "=== Testing repository packages ==="
# Test 5: Check repository packages
echo "Testing repository packages..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/repos/robojerk/libostree-dev/packages" | jq . 2>/dev/null || echo "Repository packages endpoint failed"
echo ""
echo "=== Testing package registry types ==="
# Test 6: Check available package types
echo "Testing Debian package registry..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/packages/robojerk/debian" | jq . 2>/dev/null || echo "Debian packages endpoint failed"
echo "Testing Generic package registry..."
curl -s -H "Authorization: Bearer ${{ secrets.FORGEJO_TOKEN }}" \
"https://git.raines.xyz/api/v1/packages/robojerk/generic" | jq . 2>/dev/null || echo "Generic packages endpoint failed"
- name: Add source repositories
run: |
echo "=== Adding source repositories for ${{ matrix.target_distro }} ==="
echo "${{ matrix.sources_list }}" | tee /etc/apt/sources.list.d/${{ matrix.target_release }}-sources.list
apt update -y
echo "Source repositories added successfully"
- name: Create backport directory
run: |
echo "=== Creating backport directory for ${{ matrix.target_distro }} ==="
mkdir -p /opt/Projects/ostree-backport-${{ matrix.target_distro }}
cd /opt/Projects/ostree-backport-${{ matrix.target_distro }}
echo "Backport directory created: /opt/Projects/ostree-backport-${{ matrix.target_distro }}"
- name: Download ostree source
run: |
echo "=== Downloading ostree source for ${{ matrix.target_distro }} ==="
cd /opt/Projects/ostree-backport-${{ matrix.target_distro }}
POOL_URL="${{ matrix.pool_url }}"
echo "Pool URL: $POOL_URL"
# Download source files
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}.orig.tar.xz" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.debian.tar.xz" || exit 1
echo "Source files downloaded successfully"
ls -la *.dsc *.tar.xz
- name: Extract and modify source
run: |
echo "=== Extracting and modifying source for ${{ matrix.target_distro }} ==="
cd /opt/Projects/ostree-backport-${{ matrix.target_distro }}
dpkg-source -x "ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
cd "ostree-${OSTREE_VERSION}"
echo "Modifying changelog for ${{ matrix.target_distro }}..."
dch --newversion "${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}${{ matrix.backport_suffix }}" \
--distribution "${{ matrix.target_release }}-backports" \
-b \
"Backport ostree ${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION} from ${{ matrix.source_release }} for ${{ matrix.target_release }} compatibility." || exit 1
echo "Source extracted and changelog updated successfully"
- name: Install build dependencies
run: |
echo "=== Installing build dependencies for ${{ matrix.target_distro }} ==="
cd /opt/Projects/ostree-backport-${{ matrix.target_distro }}/ostree-${OSTREE_VERSION}
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
apt-get update
apt-get build-dep -y --no-install-recommends ./ || exit 1
echo "Build dependencies installed successfully"
- name: Build ostree backport
run: |
echo "=== Building ostree backport for ${{ matrix.target_distro }} ==="
cd /opt/Projects/ostree-backport-${{ matrix.target_distro }}/ostree-${OSTREE_VERSION}
dpkg-buildpackage -us -uc -b || exit 1
echo "ostree backport built successfully"
- name: List built packages
run: |
echo "=== Built packages for ${{ matrix.target_distro }} ==="
ls -la /opt/Projects/ostree-backport-${{ matrix.target_distro }}/*.deb
echo "Package count: $(ls -1 /opt/Projects/ostree-backport-${{ matrix.target_distro }}/*.deb 2>/dev/null | wc -l)"
- name: Create release assets
run: |
echo "=== Creating release assets for ${{ matrix.target_distro }} ==="
mkdir -p release-assets-${{ matrix.target_distro }}
cp /opt/Projects/ostree-backport-${{ matrix.target_distro }}/*.deb release-assets-${{ matrix.target_distro }}/
# Create a summary file
echo "ostree Backport Build Summary for ${{ matrix.target_distro }}" > release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "===============================================" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Build Date: $(date)" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Target Distribution: ${{ matrix.target_distro }}" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Source Distribution: ${{ matrix.source_release }}" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Ostree Version: ${OSTREE_VERSION}" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Backport Suffix: ${{ matrix.backport_suffix }}" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
echo "Built Packages:" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
ls -la release-assets-${{ matrix.target_distro }}/*.deb 2>/dev/null || echo "No packages found" >> release-assets-${{ matrix.target_distro }}/BUILD_SUMMARY.txt
# Create package list for download links
echo "Package List:" > release-assets-${{ matrix.target_distro }}/PACKAGES.txt
ls -1 release-assets-${{ matrix.target_distro }}/*.deb 2>/dev/null | sed 's|.*/||' >> release-assets-${{ matrix.target_distro }}/PACKAGES.txt
echo "Release assets created for ${{ matrix.target_distro }}:"
ls -la release-assets-${{ matrix.target_distro }}/
- name: Create download instructions
run: |
echo "=== Creating download instructions for ${{ matrix.target_distro }} ==="
cat > release-assets-${{ matrix.target_distro }}/INSTALL.md << EOF
# ostree ${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION} Backport Installation for ${{ matrix.target_distro }}
## Quick Install
\`\`\`bash
# Download and install the main package
wget https://git.raines.xyz/robojerk/libostree-dev/actions/runs/\${{ github.run_id }}/artifacts
sudo dpkg -i libostree-dev_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}${{ matrix.backport_suffix }}_amd64.deb
sudo apt-get install -f
\`\`\`
## Verification
\`\`\`bash
# Check if ostree ${OSTREE_VERSION} is installed
pkg-config --modversion ostree-1
# Should output: ${OSTREE_VERSION}
\`\`\`
## Packages Included
EOF
ls -1 release-assets-${{ matrix.target_distro }}/*.deb 2>/dev/null | sed 's|.*/||' | while read package; do
echo "- \`$package\`" >> release-assets-${{ matrix.target_distro }}/INSTALL.md
done
echo "" >> release-assets-${{ matrix.target_distro }}/INSTALL.md
echo "Build completed on: $(date)" >> release-assets-${{ matrix.target_distro }}/INSTALL.md
- name: Upload to Debian Package Registry
id: debian_upload
shell: bash
run: |
echo "=== Uploading packages to Debian Package Registry for ${{ matrix.target_distro }} ==="
# Check if ACCESS_TOKEN is available
if [ -z "${{ secrets.ACCESS_TOKEN }}" ]; then
echo "❌ ACCESS_TOKEN is not set"
exit 1
fi
echo "✅ ACCESS_TOKEN is set"
# List contents of release-assets for debugging
echo "Contents of release-assets-${{ matrix.target_distro }}/:"
ls -la release-assets-${{ matrix.target_distro }}/ || echo "release-assets-${{ matrix.target_distro }}/ directory not found or empty."
upload_success=0
upload_failed=0
for deb_file in release-assets-${{ matrix.target_distro }}/*.deb; do
if [ -f "$deb_file" ]; then
echo "Uploading $deb_file to Debian Package Registry..."
filename=$(basename "$deb_file")
echo "File: $filename"
# Get HTTP code directly using curl -w
http_code=$(curl -s -o /dev/null -w "%{http_code}" \
--user "robojerk:${{ secrets.ACCESS_TOKEN }}" \
--upload-file "$deb_file" \
"https://git.raines.xyz/api/packages/robojerk/debian/pool/${{ matrix.package_upload_path }}/upload")
echo "HTTP Response Code: $http_code"
if [ "$http_code" = "201" ]; then
echo "✅ Debian Package Registry upload SUCCESS for $deb_file"
((upload_success++))
elif [ "$http_code" = "409" ]; then
echo "➡️ INFO: Package $deb_file already exists (HTTP 409 Conflict)"
((upload_success++))
else
echo "❌ Debian Package Registry upload FAILED for $deb_file (HTTP $http_code)"
((upload_failed++))
# Show verbose output for debugging failures
curl -v -i --user "robojerk:${{ secrets.ACCESS_TOKEN }}" \
--upload-file "$deb_file" \
"https://git.raines.xyz/api/packages/robojerk/debian/pool/${{ matrix.package_upload_path }}/upload" 2>&1
fi
fi
done
echo "Upload Summary for ${{ matrix.target_distro }}:"
echo " ✅ Successful uploads: $upload_success"
echo " ❌ Failed uploads: $upload_failed"
if [ $upload_failed -gt 0 ]; then
echo "::warning::Some package uploads failed for ${{ matrix.target_distro }}"
fi
- name: Check uploaded packages and provide assignment instructions
run: |
echo "=== Package Upload Summary for ${{ matrix.target_distro }} ==="
echo ""
echo "📦 Check the HTTP response codes above to see if uploads succeeded"
echo "🔍 HTTP 201 = Success, HTTP 401 = Authentication failed, HTTP 403 = Permission denied"
echo ""
echo "📋 If uploads succeeded (HTTP 201), to make packages visible in your repository:"
echo "1. Go to: https://git.raines.xyz/robojerk/-/packages"
echo "2. Find the uploaded packages (they may be under 'debian' or 'generic')"
echo "3. Click on each package → Settings → Assign to repository"
echo "4. Select 'libostree-dev' repository"
echo ""
echo "🔗 After assignment, packages will appear at:"
echo " https://git.raines.xyz/robojerk/libostree-dev/packages"
echo ""
echo "📝 Packages that were attempted for ${{ matrix.target_distro }}:"
for deb_file in release-assets-${{ matrix.target_distro }}/*.deb; do
if [ -f "$deb_file" ]; then
filename=$(basename "$deb_file")
echo " 📦 $filename"
fi
done
echo ""
echo "🎯 Next steps:"
echo " - Check HTTP response codes above"
echo " - If HTTP 201, manually assign packages to repository via web UI"
echo " - If HTTP 401/403, check token permissions"
- name: Check Package Status
shell: bash
run: |
echo "=== Checking Package Status for ${{ matrix.target_distro }} ==="
echo "Testing /api/v1/packages/robojerk endpoint..."
response=$(curl -s -H "Authorization: Bearer ${{ secrets.ACCESS_TOKEN }}" \
"https://git.raines.xyz/api/v1/packages/robojerk")
echo "Response length: ${#response} characters"
echo "First 200 characters:"
echo "$response" | head -c 200
if [ -n "$response" ]; then
echo "✅ Got response from packages API"
if echo "$response" | jq -e . > /dev/null 2>&1; then
echo "✅ Response is valid JSON"
echo "Packages found:"
echo "$response" | jq -r '.[].name + " (" + .[].package_type + ")"' 2>/dev/null || echo "Could not parse package list"
else
echo "❌ Response is not valid JSON"
fi
else
echo "❌ No response from packages API"
fi
- name: Success Summary
run: |
echo "=== Upload Summary for ${{ matrix.target_distro }} ==="
echo "✅ All Debian packages uploaded successfully to Forgejo Debian Package Registry"
echo "✅ Packages automatically assigned to repository by Forgejo"
echo ""
echo "📦 Packages should now be available at:"
echo " https://git.raines.xyz/robojerk/libostree-dev/packages"
echo ""
echo "🎯 Next steps:"
echo " - Verify packages appear in repository packages page"
echo " - Test package installation on ${{ matrix.target_distro }} systems"
echo ""
echo "📊 Build completed for ${{ matrix.target_distro }}"
echo " Source: ${{ matrix.source_release }}"
echo " Target: ${{ matrix.target_release }}"
echo " Suffix: ${{ matrix.backport_suffix }}"

View file

@ -0,0 +1,98 @@
name: Test ostree Build
on:
workflow_dispatch:
inputs:
target_distro:
description: 'Target distribution to test'
required: true
default: 'noble'
type: choice
options:
- noble
- trixie
env:
OSTREE_VERSION: "2025.2"
OSTREE_DEBIAN_REVISION: "1"
jobs:
test-build:
name: Test Build for ${{ github.event.inputs.target_distro }}
runs-on: ubuntu-latest
container:
image: ubuntu:latest
steps:
- name: Setup environment
run: |
echo "=== Testing build for ${{ github.event.inputs.target_distro }} ==="
apt update -y
apt install -y devscripts build-essential wget git curl jq
- name: Checkout repository
run: |
git clone https://git.raines.xyz/robojerk/libostree-dev.git /tmp/libostree-dev
cp -r /tmp/libostree-dev/* .
cp -r /tmp/libostree-dev/.* . 2>/dev/null || true
- name: Test source download
run: |
echo "=== Testing source download ==="
# Set distribution-specific variables
if [ "${{ github.event.inputs.target_distro }}" = "noble" ]; then
POOL_URL="http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/"
BACKPORT_SUFFIX="~noble1"
else
POOL_URL="http://deb.debian.org/debian/pool/main/o/ostree/"
BACKPORT_SUFFIX="~trixie1"
fi
echo "Pool URL: $POOL_URL"
echo "Backport Suffix: $BACKPORT_SUFFIX"
# Test download
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}.orig.tar.xz" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.debian.tar.xz" || exit 1
echo "✅ Source files downloaded successfully"
ls -la *.dsc *.tar.xz
- name: Test source extraction
run: |
echo "=== Testing source extraction ==="
dpkg-source -x "ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
echo "✅ Source extracted successfully"
ls -la ostree-${OSTREE_VERSION}/
- name: Test changelog modification
run: |
echo "=== Testing changelog modification ==="
cd ostree-${OSTREE_VERSION}
if [ "${{ github.event.inputs.target_distro }}" = "noble" ]; then
BACKPORT_SUFFIX="~noble1"
TARGET_RELEASE="noble"
else
BACKPORT_SUFFIX="~trixie1"
TARGET_RELEASE="trixie"
fi
dch --newversion "${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}${BACKPORT_SUFFIX}" \
--distribution "${TARGET_RELEASE}-backports" \
-b \
"Test backport for ${{ github.event.inputs.target_distro }}." || exit 1
echo "✅ Changelog modified successfully"
head -5 debian/changelog
- name: Success summary
run: |
echo "=== Test Build Summary ==="
echo "✅ All tests passed for ${{ github.event.inputs.target_distro }}"
echo "✅ Source download: OK"
echo "✅ Source extraction: OK"
echo "✅ Changelog modification: OK"
echo ""
echo "🎯 Ready for full build process"

138
CI-CD-IMPROVEMENTS.md Normal file
View file

@ -0,0 +1,138 @@
# CI/CD Improvements Summary
## 🚀 Enhanced Workflows
### 1. Main Build Workflow (`build-ostree-backports.yml`)
**Key Improvements:**
- ✅ **Matrix Strategy**: Proper multi-distribution support with dynamic matrix generation
- ✅ **Manual Triggers**: Support for single distribution or all distributions
- ✅ **Better Error Handling**: Comprehensive error checking and exit codes
- ✅ **Detailed Logging**: Step-by-step progress with distribution-specific context
- ✅ **Upload Statistics**: Success/failure counters with warnings
- ✅ **Package Path Configuration**: Distribution-specific upload paths
**New Features:**
- `build_all` parameter for building both distributions simultaneously
- Distribution-specific package upload paths (`noble/main`, `trixie/main`)
- Enhanced error reporting with GitHub Actions warnings
- Improved source download with error checking
### 2. Test Workflow (`test-build.yml`)
**Purpose:**
- Quick validation of build process
- Tests source download from both distributions
- Verifies source extraction and changelog modification
- Fast feedback before full builds
**Features:**
- Manual trigger with distribution selection
- Step-by-step validation
- Clear success/failure reporting
## 🎯 Manual Trigger Options
### Single Distribution Build
```yaml
workflow_dispatch:
inputs:
target_distro: noble # or trixie
build_all: false
```
### All Distributions Build
```yaml
workflow_dispatch:
inputs:
target_distro: noble # ignored when build_all=true
build_all: true
```
### Test Mode
```yaml
workflow_dispatch:
inputs:
target_distro: noble # or trixie
```
## 📊 Matrix Configuration
### Ubuntu Noble
```yaml
- target_distro: noble
distro_type: ubuntu
source_release: questing
target_release: noble
backport_suffix: ~noble1
pool_url: http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/
sources_list: "deb-src http://us.archive.ubuntu.com/ubuntu/ noble main universe"
package_upload_path: noble/main
```
### Debian Trixie
```yaml
- target_distro: trixie
distro_type: debian
source_release: sid
target_release: trixie
backport_suffix: ~trixie1
pool_url: http://deb.debian.org/debian/pool/main/o/ostree/
sources_list: "deb-src http://deb.debian.org/debian/ trixie main contrib non-free"
package_upload_path: trixie/main
```
## 🔧 Error Handling Improvements
### Source Download
```bash
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}.orig.tar.xz" || exit 1
wget "${POOL_URL}ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.debian.tar.xz" || exit 1
```
### Build Process
```bash
dpkg-source -x "ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc" || exit 1
apt-get build-dep -y --no-install-recommends ./ || exit 1
dpkg-buildpackage -us -uc -b || exit 1
```
### Upload Statistics
```bash
upload_success=0
upload_failed=0
# ... upload logic ...
echo "Upload Summary for ${{ matrix.target_distro }}:"
echo " ✅ Successful uploads: $upload_success"
echo " ❌ Failed uploads: $upload_failed"
```
## 📈 Benefits
1. **Reliability**: Better error handling prevents silent failures
2. **Flexibility**: Support for single or multi-distribution builds
3. **Debugging**: Detailed logging for troubleshooting
4. **Testing**: Quick validation workflow for rapid iteration
5. **Monitoring**: Upload statistics and success tracking
6. **Maintainability**: Clear separation of concerns and configuration
## 🎯 Usage Examples
### GitHub Actions UI
1. Go to Actions → Build ostree Backports
2. Click "Run workflow"
3. Select target distribution or "Build all"
4. Monitor progress with detailed logging
### Test Mode
1. Go to Actions → Test ostree Build
2. Click "Run workflow"
3. Select distribution to test
4. Quick validation of build process
## 📋 Workflow Files
- `build-ostree-backports.yml` - Main multi-distribution build workflow
- `test-build.yml` - Quick validation workflow
- `build-libostree-backport.yml` - Legacy single-distribution workflow (kept for reference)
- `manual-update-readme.yml` - Documentation update workflow
- `update-readme.yml` - Automated README updates

View file

@ -1,6 +1,6 @@
# libostree-dev Backport for Ubuntu Noble
# ostree Backport for Ubuntu Noble and Debian Trixie
This repository contains a backport of libostree 2025.2-1 for Ubuntu Noble (24.04 LTS).
This repository contains backports of ostree 2025.2-1 for Ubuntu Noble (24.04 LTS) and Debian Trixie (12).
## 📦 Package Status
@ -13,15 +13,30 @@ This repository contains a backport of libostree 2025.2-1 for Ubuntu Noble (24.0
- ✅ All dependencies resolved (Rust 1.82.0+, build tools)
- ✅ Successful package uploads to Forgejo Package Registry
- ✅ Automatic token authentication working
- ✅ Multi-distribution support (Ubuntu Noble + Debian Trixie)
### What Needs Manual Action
- 🔄 **Package Assignment**: Uploaded packages need to be manually assigned to this repository via the Forgejo web interface
## 🎯 Supported Distributions
### Ubuntu Noble (24.04 LTS)
- **Source**: Ubuntu Questing
- **Target**: Ubuntu Noble
- **Package Suffix**: `~noble1`
- **Usage**: `./backport-noble.sh` or `./ostree-backport.sh noble`
### Debian Trixie (12)
- **Source**: Debian sid
- **Target**: Debian Trixie
- **Package Suffix**: `~trixie1`
- **Usage**: `./backport-trixie.sh` or `./ostree-backport.sh trixie`
## 📥 Download Options
### Option 1: Manual Package Assignment (Recommended)
1. Go to [Forgejo Packages](https://git.raines.xyz/robojerk/-/packages)
2. Find the uploaded libostree packages (under 'debian' or 'generic')
2. Find the uploaded ostree packages (under 'debian' or 'generic')
3. Click on each package → Settings → Assign to repository
4. Select 'libostree-dev' repository
5. Packages will then appear at: https://git.raines.xyz/robojerk/libostree-dev/packages
@ -33,39 +48,66 @@ This repository contains a backport of libostree 2025.2-1 for Ubuntu Noble (24.0
4. Download the `release-assets` artifact containing all .deb files
### Option 3: Local Build
Run the local build script:
Run the local build script for your target distribution:
```bash
./libostree-dev_noble_backport.sh
# For Ubuntu Noble
./backport-noble.sh
# For Debian Trixie
./backport-trixie.sh
# Or use the main script directly
./ostree-backport.sh noble # Ubuntu Noble
./ostree-backport.sh trixie # Debian Trixie
```
## 🔧 Technical Details
### Build Environment
- **Base**: Ubuntu Noble (24.04 LTS)
- **Base**: Ubuntu Noble (24.04 LTS) or Debian Trixie (12)
- **Rust**: 1.82.0+ (installed via rustup)
- **Build Tools**: Full development environment with all dependencies
### Package Contents
- `libostree-dev_2025.2-1~noble1_amd64.deb` - Development headers and libraries
- `libostree-1-1_2025.2-1~noble1_amd64.deb` - Runtime libraries
- `ostree_2025.2-1~noble1_amd64.deb` - Command-line tools
- `gir1.2-ostree-1.0_2025.2-1~noble1_amd64.deb` - GObject introspection
- `libostree-doc_2025.2-1~noble1_all.deb` - Documentation
- `ostree-boot_2025.2-1~noble1_amd64.deb` - Boot utilities
- `ostree-tests_2025.2-1~noble1_amd64.deb` - Test suite
- `libostree-dev_2025.2-1~[distro]1_amd64.deb` - Development headers and libraries
- `libostree-1-1_2025.2-1~[distro]1_amd64.deb` - Runtime libraries
- `ostree_2025.2-1~[distro]1_amd64.deb` - Command-line tools
- `gir1.2-ostree-1.0_2025.2-1~[distro]1_amd64.deb` - GObject introspection
- `libostree-doc_2025.2-1~[distro]1_all.deb` - Documentation
- `ostree-boot_2025.2-1~[distro]1_amd64.deb` - Boot utilities
- `ostree-tests_2025.2-1~[distro]1_amd64.deb` - Test suite
## 🚀 CI/CD Workflow
## 🚀 CI/CD Workflows
The workflow automatically:
1. Sets up Ubuntu Noble environment
2. Installs Rust 1.82.0+ and build dependencies
3. Downloads and patches libostree source
4. Builds all packages
5. Uploads to Forgejo Package Registry
6. Provides assignment instructions
### Main Build Workflow (`build-ostree-backports.yml`)
The main workflow automatically:
1. Sets up Ubuntu environment for target distribution
2. Installs build dependencies and tools
3. Downloads ostree source from appropriate distribution (Questing for Noble, sid for Trixie)
4. Modifies changelog for backport versioning
5. Builds all packages for target distribution
6. Uploads to Forgejo Package Registry
7. Provides detailed upload summaries and assignment instructions
### Test Workflow (`test-build.yml`)
A simplified workflow for testing:
- Tests source download from both distributions
- Verifies source extraction and changelog modification
- Quick validation before full builds
### Manual Triggers
- **Single Distribution**: Build for specific distribution (noble/trixie)
- **All Distributions**: Build for both distributions simultaneously
- **Test Mode**: Quick validation of build process
## 📋 Recent Changes
- **2025-01-XX**: CI/CD workflows improved with better error handling and multi-distribution support
- **2025-01-XX**: Test workflow added for quick validation
- **2025-01-XX**: Manual triggers enhanced (single/all distributions)
- **2025-01-XX**: Multi-distribution support added (Ubuntu Noble + Debian Trixie)
- **2025-01-XX**: Source configuration updated (Questing → Noble, sid → Trixie)
- **2025-07-21**: Automatic token authentication implemented
- **2025-07-21**: Package uploads working (requires manual assignment)
- **2025-07-21**: Rust version compatibility resolved
@ -76,3 +118,8 @@ The workflow automatically:
- [Workflow Runs](https://git.raines.xyz/robojerk/libostree-dev/actions)
- [Forgejo Packages](https://git.raines.xyz/robojerk/-/packages)
- [Repository Packages](https://git.raines.xyz/robojerk/libostree-dev/packages) (after assignment)
## 📚 Source References
- [Debian sid ostree package](https://packages.debian.org/source/sid/ostree)
- [Ubuntu Questing ostree package](http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/)

12
backport-noble.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
# Wrapper script for Ubuntu Noble ostree backport
# This script calls the main backport script with noble as the target
echo "=== Ubuntu Noble (24.04 LTS) ostree Backport ==="
echo "Source: Ubuntu Questing"
echo "Target: Ubuntu Noble"
echo ""
# Call the main backport script with noble as the target
./ostree-backport.sh noble

12
backport-trixie.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
# Wrapper script for Debian Trixie ostree backport
# This script calls the main backport script with trixie as the target
echo "=== Debian Trixie (12) ostree Backport ==="
echo "Source: Debian sid"
echo "Target: Debian Trixie"
echo ""
# Call the main backport script with trixie as the target
./ostree-backport.sh trixie

224
ostree-backport.sh Executable file
View file

@ -0,0 +1,224 @@
#!/bin/bash
# This script automates the backporting of ostree packages for Ubuntu Noble and Debian Trixie.
# Ubuntu: Pulls source from Ubuntu Questing
# Debian: Pulls source from Debian sid
#
# ⚠️ WARNING: This script modifies system libraries. Use with caution!
# - Test in a VM first
# - Have a system backup
# - Be prepared for potential side effects with Flatpak and other ostree-dependent software
# Exit immediately if a command exits with a non-zero status.
set -e
# --- Configuration ---
OSTREE_VERSION="2025.2"
OSTREE_DEBIAN_REVISION="1"
# Distribution-specific configurations
declare -A DISTRO_CONFIGS
DISTRO_CONFIGS["noble"]="ubuntu|questing|noble|~noble1|http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/"
DISTRO_CONFIGS["trixie"]="debian|sid|trixie|~trixie1|http://deb.debian.org/debian/pool/main/o/ostree/"
# Default to noble if no distribution specified
TARGET_DISTRO=${1:-noble}
# Validate target distribution
if [[ ! ${DISTRO_CONFIGS[$TARGET_DISTRO]} ]]; then
echo "Error: Unsupported distribution '$TARGET_DISTRO'"
echo "Supported distributions: ${!DISTRO_CONFIGS[@]}"
exit 1
fi
# Parse distribution config
IFS='|' read -r DISTRO_TYPE SOURCE_RELEASE TARGET_RELEASE BACKPORT_SUFFIX POOL_URL <<< "${DISTRO_CONFIGS[$TARGET_DISTRO]}"
# Set working directory based on distribution
BACKPORT_DIR="/opt/Projects/ostree-backport-${TARGET_DISTRO}"
# --- Functions ---
log_info() {
echo -e "\n\e[1;34m[INFO]\e[0m $1"
}
log_success() {
echo -e "\n\e[1;32m[SUCCESS]\e[0m $1"
}
log_warning() {
echo -e "\n\e[1;33m[WARNING]\e[0m $1"
}
log_error() {
echo -e "\n\e[1;31m[ERROR]\e[0m $1" >&2
exit 1
}
cleanup() {
log_info "Cleaning up temporary files..."
# Remove the added source list file
sudo rm -f /etc/apt/sources.list.d/${TARGET_RELEASE}-sources.list
# Remove the entire backport working directory
sudo rm -rf "${BACKPORT_DIR}"
sudo apt update >/dev/null 2>&1 || true
log_success "Cleanup completed."
}
# Safety check function
safety_check() {
log_info "Performing safety checks..."
# Check if we're running as root (shouldn't be)
if [ "$EUID" -eq 0 ]; then
log_error "This script should not be run as root. Please run as a regular user with sudo privileges."
fi
# Check if we're in a VM (recommended)
if ! grep -q "VMware\|VirtualBox\|QEMU\|KVM" /sys/class/dmi/id/product_name 2>/dev/null; then
log_warning "This doesn't appear to be running in a VM. Consider testing in a VM first."
read -p "Continue anyway? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Aborted by user."
exit 0
fi
fi
# Check if we have enough disk space (rough estimate: 500MB)
AVAILABLE_SPACE=$(df /opt | awk 'NR==2 {print $4}')
if [ "$AVAILABLE_SPACE" -lt 500000 ]; then
log_error "Insufficient disk space. Need at least 500MB available in /opt"
fi
log_success "Safety checks passed."
}
# Set trap to ensure cleanup runs on exit
# Commented out for debugging - uncomment when script is working
# trap cleanup EXIT
# --- Main Script ---
log_info "Starting ostree backport process for ${DISTRO_TYPE^} ${TARGET_RELEASE}..."
log_info "Source: ${SOURCE_RELEASE} → Target: ${TARGET_RELEASE}"
# Safety checks
safety_check
# Step 0: Clean up any existing backport directory
log_info "Step 0: Cleaning up any existing backport directory..."
if [ -d "${BACKPORT_DIR}" ]; then
log_info "Removing existing backport directory: ${BACKPORT_DIR}"
sudo rm -rf "${BACKPORT_DIR}"
fi
log_success "Cleanup completed."
# Step 1: Install Required Tools
log_info "Step 1: Installing essential build tools (devscripts, build-essential)..."
sudo apt update || log_error "Failed to update apt cache."
sudo apt install -y devscripts build-essential || log_error "Failed to install build tools."
log_success "Build tools installed."
# Step 1.5: Add Source Repositories
log_info "Step 1.5: Adding source repositories for build dependencies..."
if [[ "$DISTRO_TYPE" == "ubuntu" ]]; then
echo "deb-src http://us.archive.ubuntu.com/ubuntu/ ${TARGET_RELEASE} main universe" | sudo tee /etc/apt/sources.list.d/${TARGET_RELEASE}-sources.list
else
echo "deb-src http://deb.debian.org/debian/ ${TARGET_RELEASE} main contrib non-free" | sudo tee /etc/apt/sources.list.d/${TARGET_RELEASE}-sources.list
fi
sudo apt update || log_error "Failed to update apt cache with source repositories."
log_success "Source repositories added."
# Step 2: Create Backport Directory Structure
log_info "Step 2: Creating backport directory structure at ${BACKPORT_DIR}..."
mkdir -p "${BACKPORT_DIR}" || log_error "Failed to create directory ${BACKPORT_DIR}."
cd "${BACKPORT_DIR}" || log_error "Failed to change directory to ${BACKPORT_DIR}."
log_success "Directory structure created."
# Step 3: Download Source
log_info "Step 3: Downloading ostree ${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION} source from ${SOURCE_RELEASE}..."
# Construct the full filenames
DSC_FILE="ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.dsc"
ORIG_TAR_XZ_FILE="ostree_${OSTREE_VERSION}.orig.tar.xz"
DEBIAN_TAR_XZ_FILE="ostree_${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}.debian.tar.xz"
# Check if files already exist to avoid re-downloading
for file in "${DSC_FILE}" "${ORIG_TAR_XZ_FILE}" "${DEBIAN_TAR_XZ_FILE}"; do
if [ ! -f "$file" ]; then
wget "${POOL_URL}${file}" || log_error "Failed to download ${file}."
else
log_info "File ${file} already exists, skipping download."
fi
done
log_success "Source files downloaded."
# Step 4: Extract and Modify Source
log_info "Step 4: Extracting source and modifying debian/changelog..."
dpkg-source -x "${DSC_FILE}" || log_error "Failed to extract source package."
cd "ostree-${OSTREE_VERSION}" || log_error "Failed to change directory to ostree-${OSTREE_VERSION}."
# Create backport version entry in changelog
# For backports, we need to manually set the version and distribution
# Use -b to force the version change since backport versions are "less than" original
if ! dch --newversion "${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION}${BACKPORT_SUFFIX}" \
--distribution "${TARGET_RELEASE}-backports" \
-b \
"Backport ostree ${OSTREE_VERSION}-${OSTREE_DEBIAN_REVISION} from ${SOURCE_RELEASE} for ${TARGET_RELEASE} compatibility."; then
log_info "dch failed, attempting manual changelog update..."
log_error "Manual changelog update not implemented. Please check debian/changelog format."
fi
log_success "Source extracted and changelog updated."
# Step 5: Install Build Dependencies
log_info "Step 5: Installing build dependencies for ostree..."
# This command relies on the debian/control file in the extracted source
sudo apt build-dep ./ || log_error "Failed to install build dependencies. Check debian/control or your ${TARGET_RELEASE} repositories."
log_success "Build dependencies installed."
# Step 6: Build the Backport
log_info "Step 6: Building the ostree backport for ${TARGET_RELEASE}..."
dpkg-buildpackage -us -uc -b || log_error "Failed to build the Debian package."
log_success "ostree backport built successfully."
# Step 7: Install the Backport
log_info "Step 7: Installing the built ostree packages..."
cd .. # Go back to the directory where the .deb files are
# Find all .deb files from the current build (more flexible)
OSTREE_DEBS=$(find . -maxdepth 1 -name "*ostree*${BACKPORT_SUFFIX}*.deb" -o -name "*libostree*${BACKPORT_SUFFIX}*.deb")
if [ -z "$OSTREE_DEBS" ]; then
log_error "No .deb packages found to install. Build might have failed or naming is unexpected."
log_info "Available .deb files:"
ls -la *.deb 2>/dev/null || echo "No .deb files found"
exit 1
fi
log_info "Found packages to install: $OSTREE_DEBS"
sudo dpkg -i ${OSTREE_DEBS} || log_error "Failed to install the backported .deb packages."
log_success "Backported ostree packages installed."
# Run apt --fix-broken install to handle any missed dependencies if dpkg -i failed to resolve them
log_info "Running apt --fix-broken install to resolve any lingering dependencies..."
sudo apt --fix-broken install -y || log_error "apt --fix-broken install failed."
log_success "Dependency resolution attempted."
# Step 8: Verify Installation
log_info "Step 8: Verifying installation..."
if dpkg -l | grep -q "ostree.*${BACKPORT_SUFFIX}"; then
log_success "ostree backport successfully installed."
else
log_warning "ostree backport installation verification failed, but continuing..."
fi
# Step 9: Test with bootc
log_info "Step 9: Now you can try building bootc with the newly installed ostree."
log_info "Example: (assuming bootc source is in /opt/Projects/bootc-deb/bootc)"
echo "cd /opt/Projects/bootc-deb/bootc"
echo "cargo build --release"
log_info "Remember to monitor for AppArmor denials during bootc operation if issues arise."
log_success "ostree backport process completed for ${DISTRO_TYPE^} ${TARGET_RELEASE}."
log_warning "⚠️ IMPORTANT: Please reboot your system if you experience any issues with applications that use ostree (e.g., Flatpak)."
log_info "If you encounter problems, you can revert by reinstalling the original ostree packages from the ${TARGET_RELEASE} repositories."

BIN
steam.deb

Binary file not shown.

75
usage-guide.sh Executable file
View file

@ -0,0 +1,75 @@
#!/bin/bash
# Usage Guide for ostree Backport System
# This script provides information about the multi-distribution backport system
echo "=== ostree Backport System Usage Guide ==="
echo ""
echo "🎯 Supported Distributions:"
echo " • Ubuntu Noble (24.04 LTS) - Source: Ubuntu Questing"
echo " • Debian Trixie (12) - Source: Debian sid"
echo ""
echo "📦 Available Scripts:"
echo " • ostree-backport.sh [distro] - Main backport script"
echo " • backport-noble.sh - Ubuntu Noble wrapper"
echo " • backport-trixie.sh - Debian Trixie wrapper"
echo ""
echo "🚀 Quick Start Examples:"
echo ""
echo "For Ubuntu Noble:"
echo " ./backport-noble.sh"
echo " # or"
echo " ./ostree-backport.sh noble"
echo ""
echo "For Debian Trixie:"
echo " ./backport-trixie.sh"
echo " # or"
echo " ./ostree-backport.sh trixie"
echo ""
echo "🔧 What Each Script Does:"
echo " 1. Downloads ostree 2025.2-1 source from appropriate distribution"
echo " 2. Modifies changelog for backport versioning"
echo " 3. Installs build dependencies"
echo " 4. Builds all ostree packages"
echo " 5. Installs the backported packages"
echo ""
echo "⚠️ Safety Notes:"
echo " • Test in a VM first"
echo " • Have a system backup"
echo " • Be prepared for potential side effects with Flatpak"
echo ""
echo "📚 Source References:"
echo " • Debian sid: https://packages.debian.org/source/sid/ostree"
echo " • Ubuntu Questing: http://archive.ubuntu.com/ubuntu/pool/universe/o/ostree/"
echo ""
echo "🔗 CI/CD Workflow:"
echo " • Automated builds on every push"
echo " • Supports both distributions via matrix strategy"
echo " • Manual trigger available for specific distributions"
echo ""
echo "📋 Package Contents:"
echo " • libostree-dev - Development headers and libraries"
echo " • libostree-1-1 - Runtime libraries"
echo " • ostree - Command-line tools"
echo " • gir1.2-ostree-1.0 - GObject introspection"
echo " • libostree-doc - Documentation"
echo " • ostree-boot - Boot utilities"
echo " • ostree-tests - Test suite"
echo ""
echo "✅ Verification:"
echo " pkg-config --modversion ostree-1"
echo " # Should output: 2025.2"
echo ""
echo "🔄 Rollback:"
echo " sudo apt install --reinstall libostree-dev libostree-1-1 ostree"
echo " # Reinstall original packages from distribution repositories"

Binary file not shown.