Bump version to 2.2.0 #26
Workflow file for this run
This file contains hidden or 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: CI | |
| on: | |
| push: | |
| branches: [ main ] | |
| tags: | |
| - 'v*.*.*' # Push events to matching semantic versions only (v1.0.0, v1.2.3, etc.) | |
| pull_request: | |
| branches: [ main ] | |
| workflow_dispatch: | |
| jobs: | |
| test-aptly-installation: | |
| name: Test Aptly Installation | |
| runs-on: ubuntu-24.04 | |
| strategy: | |
| matrix: | |
| aptly-version: ['1.6.2'] | |
| cache: ['true', 'false'] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Setup Python environment | |
| run: | | |
| uv venv | |
| uv pip install -r requirements-test.txt | |
| - name: Test aptly installation | |
| uses: ./ | |
| with: | |
| version: ${{ matrix.aptly-version }} | |
| cache: ${{ matrix.cache }} | |
| - name: Run Python test suite | |
| run: | | |
| source .venv/bin/activate | |
| python test.py | |
| test-aptly-publishing: | |
| name: Test Aptly Publishing (Mock) | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Create mock .deb files for testing | |
| run: | | |
| mkdir -p test-debs | |
| # Create a minimal mock .deb file structure | |
| mkdir -p mock-package/DEBIAN | |
| cat > mock-package/DEBIAN/control << EOF | |
| Package: test-package | |
| Version: 1.0.0 | |
| Section: utils | |
| Priority: optional | |
| Architecture: amd64 | |
| Maintainer: Test <test@example.com> | |
| Description: Mock package for testing | |
| EOF | |
| # Create the .deb file | |
| dpkg-deb --build mock-package test-debs/test-package_1.0.0_amd64.deb | |
| echo "Created mock .deb files:" | |
| ls -la test-debs/ | |
| - name: Setup GPG for testing | |
| run: | | |
| # Create a test GPG key for signing | |
| cat > gpg-batch << EOF | |
| Key-Type: RSA | |
| Key-Length: 2048 | |
| Subkey-Type: RSA | |
| Subkey-Length: 2048 | |
| Name-Real: Test User | |
| Name-Email: test@example.com | |
| Expire-Date: 1y | |
| %no-protection | |
| %commit | |
| EOF | |
| gpg --batch --generate-key gpg-batch | |
| # Export the key ID | |
| GPG_KEY_ID=$(gpg --list-secret-keys --keyid-format LONG | grep sec | head -1 | sed 's/.*\/\([A-F0-9]*\).*/\1/') | |
| echo "GPG_KEY_ID=$GPG_KEY_ID" >> $GITHUB_ENV | |
| echo "Generated test GPG key: $GPG_KEY_ID" | |
| - name: Checkout APT repo (for local testing) | |
| uses: actions/checkout@v4 | |
| with: | |
| repository: feelpp/apt | |
| path: apt-repo | |
| - name: Test publishing workflow (will fail at git push) | |
| shell: bash | |
| run: | | |
| set +e # Don't exit on error | |
| # Install feelpp-aptly-publisher | |
| cd apt-repo | |
| pip install -e . | |
| cd .. | |
| # Run the publish command | |
| # This will succeed up until the git push, which will fail without credentials | |
| # That's expected and validates the rest of the publishing logic works | |
| echo "Testing feelpp-apt-publish workflow..." | |
| feelpp-apt-publish \ | |
| --component test-package \ | |
| --distro noble \ | |
| --channel testing \ | |
| --debs test-debs \ | |
| --verbose \ | |
| --sign \ | |
| --keyid ${{ env.GPG_KEY_ID }} 2>&1 | tee publish-output.log | |
| EXIT_CODE=$? | |
| # Check if we got far enough to attempt the git push | |
| if grep -q "git push origin gh-pages" publish-output.log; then | |
| echo "✅ Publishing logic validated (failed at expected git push step)" | |
| exit 0 | |
| elif grep -q "Publish test-package (noble/testing)" publish-output.log; then | |
| echo "✅ Publishing logic validated (git operations executed)" | |
| exit 0 | |
| else | |
| echo "❌ Publishing failed before completing expected steps" | |
| cat publish-output.log | |
| exit 1 | |
| fi | |
| continue-on-error: false | |
| id: mock-publish | |
| - name: Verify publishing behavior | |
| run: | | |
| echo "✅ Publishing workflow tested successfully" | |
| echo "Note: Test validates publishing logic up to git push" | |
| test-cross-platform: | |
| name: Test Cross-Platform Support | |
| runs-on: ${{ matrix.runner }} | |
| strategy: | |
| matrix: | |
| include: | |
| - runner: ubuntu-24.04 | |
| arch: amd64 | |
| aptly-version: '1.6.2' | |
| - runner: ubuntu-24.04-arm | |
| arch: arm64 | |
| aptly-version: '1.6.2' | |
| - runner: ubuntu-22.04 | |
| arch: amd64 | |
| aptly-version: '1.6.2' | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Test aptly installation on ${{ matrix.runner }} (${{ matrix.arch }}) | |
| uses: ./ | |
| with: | |
| version: ${{ matrix.aptly-version }} | |
| architecture: ${{ matrix.arch }} | |
| - name: Verify cross-platform functionality | |
| run: | | |
| aptly version | |
| uname -m | |
| echo "✅ Aptly works on ${{ matrix.runner }} (${{ matrix.arch }})" | |
| test-input-validation: | |
| name: Test Input Validation | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Test with invalid version (should fail gracefully) | |
| uses: ./ | |
| with: | |
| version: '999.999.999' | |
| continue-on-error: true | |
| id: invalid-version | |
| - name: Verify invalid version handling | |
| run: | | |
| if [ "${{ steps.invalid-version.outcome }}" = "success" ]; then | |
| echo "❌ Expected failure for invalid version" | |
| exit 1 | |
| else | |
| echo "✅ Invalid version handled correctly" | |
| fi | |
| test-caching: | |
| name: Test Caching Behavior | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: First run with caching enabled | |
| uses: ./ | |
| with: | |
| version: '1.6.2' | |
| cache: 'true' | |
| - name: Second run should use cache | |
| uses: ./ | |
| with: | |
| version: '1.6.2' | |
| cache: 'true' | |
| - name: Verify caching works | |
| run: | | |
| echo "✅ Caching behavior verified" | |
| integration-test: | |
| name: Integration Test | |
| runs-on: ubuntu-24.04 | |
| needs: [test-aptly-installation, test-cross-platform] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Full integration test | |
| uses: ./ | |
| with: | |
| version: '1.6.2' | |
| cache: 'true' | |
| - name: Test aptly functionality | |
| run: | | |
| set -e | |
| echo "Testing aptly functionality..." | |
| # Test repository operations | |
| aptly repo create integration-test-repo | |
| aptly repo list | grep integration-test-repo | |
| # Test snapshot operations | |
| aptly snapshot create empty-snapshot from repo integration-test-repo | |
| aptly snapshot list | grep empty-snapshot | |
| # Test cleanup | |
| aptly snapshot drop empty-snapshot | |
| aptly repo drop integration-test-repo | |
| echo "✅ Aptly functionality verified" | |
| test-python: | |
| name: Test Python Components | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup uv | |
| uses: astral-sh/setup-uv@v6 | |
| with: | |
| enable-cache: true | |
| - name: Setup Python environment and install dependencies | |
| run: | | |
| uv venv | |
| uv pip install -r requirements-test.txt | |
| - name: Install aptly for testing | |
| uses: ./ | |
| with: | |
| version: '1.6.2' | |
| cache: 'true' | |
| - name: Run Python tests | |
| run: | | |
| source .venv/bin/activate | |
| python -m pytest tests/ -v --tb=short | |
| - name: Run local Python test script | |
| run: | | |
| source .venv/bin/activate | |
| python test.py | |
| release: | |
| name: Create Release | |
| runs-on: ubuntu-24.04 | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| needs: [test-aptly-installation, test-aptly-publishing, test-cross-platform, test-input-validation, test-caching, integration-test, test-python] | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Create or Update Release | |
| id: release | |
| continue-on-error: true | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| draft: false | |
| prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc')}} | |
| name: Release ${{ github.ref_name }} | |
| generate_release_notes: true | |
| tag_name: ${{ github.ref }} | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| make_latest: ${{ !contains(github.ref, 'alpha') && !contains(github.ref, 'beta') && !contains(github.ref, 'rc') }} | |
| fail_on_unmatched_files: false | |
| - name: Handle existing release | |
| if: steps.release.outcome == 'failure' | |
| run: | | |
| echo "Release may already exist for tag ${{ github.ref_name }}" | |
| echo "This can happen when the release was created via GitHub UI" | |
| echo "The major version tag will still be updated below" | |
| echo "⚠️ Release creation skipped - release may already exist" | |
| - name: Update major version tag | |
| if: ${{ !contains(github.ref, 'alpha') && !contains(github.ref, 'beta') && !contains(github.ref, 'rc') }} | |
| run: | | |
| # Extract major version from tag (e.g., v1.2.3 -> v1) | |
| TAG_NAME=${GITHUB_REF#refs/tags/} | |
| MAJOR_VERSION=$(echo $TAG_NAME | sed -E 's/^(v[0-9]+)\..*/\1/') | |
| echo "Updating major version tag $MAJOR_VERSION to point to $TAG_NAME" | |
| # Configure git | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| # Create/update the major version tag | |
| git tag -f $MAJOR_VERSION | |
| git push origin $MAJOR_VERSION --force |