diff --git a/.github/workflows/build-deb.yaml b/.github/workflows/build-deb.yaml index 1592ca1..c1692b4 100644 --- a/.github/workflows/build-deb.yaml +++ b/.github/workflows/build-deb.yaml @@ -1,4 +1,4 @@ -name: Build DEB Package +name: Build and Publish Debian Package on: push: @@ -33,7 +33,8 @@ jobs: build-deb: runs-on: ubuntu-latest env: - DEB_BUILD_OPTIONS: nocheck + DEB_BUILD_OPTIONS: "compress=gzip nocheck" + PKGNAME: "libosal" strategy: matrix: distro: [debian-12, debian-11, ubuntu-24.04, ubuntu-22.04] @@ -59,9 +60,10 @@ jobs: steps: - name: Install build dependencies + shell: bash run: | apt-get update - apt-get install -y build-essential devscripts debhelper autotools-dev autoconf-archive fakeroot sed git python3-pip python3-venv curl jq + apt-get install -y build-essential devscripts debhelper autoconf-archive autotools-dev pkg-config sed git curl jq rsync - name: Checkout source uses: actions/checkout@v4 @@ -73,19 +75,8 @@ jobs: - name: update branch name and version run: | - safe_branch=$(echo "${GITHUB_REF_NAME}" | tr '/' '-') VERSION=$(dpkg-parsechangelog | sed -n 's/^Version: //p') sed "s|PACKAGE_VERSION|$VERSION|" configure.ac.in > configure.ac - env: - GITHUB_REF_NAME: ${{ github.ref_name }} - - - name: Set VERSION env variable - id: set_version - run: | - echo "VERSION=$(dpkg-parsechangelog | sed -n 's/^Version: //p')" >> $GITHUB_ENV - - - name: Prepare autotools - run: autoreconf -fi - name: Build .deb package shell: bash @@ -94,93 +85,110 @@ jobs: CODENAME=$(lsb_release -sc) DEBEMAIL="robert.burger@dlr.de" DEBFULLNAME="Robert Burger" - - if ! dpkg-parsechangelog | grep -q "~${CODENAME}"; then - dch --local ~${CODENAME} "Build for ${CODENAME}"; + VERSION=$(dpkg-parsechangelog --show-field Version) + + # Check if version already contains codename suffix + if [[ "$VERSION" == *"~${CODENAME}"* || "$VERSION" == *"+${CODENAME}"* ]]; then + echo "Version already contains codename suffix, skipping dch." + else + # If there's already a ~ in version (like ~pre1), add +codename + if [[ "$VERSION" == *"~"* ]]; then + dch --local +${CODENAME} --distribution ${CODENAME} "Build for ${CODENAME}" + else + dch --local ~${CODENAME} --distribution ${CODENAME} "Build for ${CODENAME}" + fi fi - dpkg-buildpackage -us -uc -S - dpkg-buildpackage -us -uc -d + dpkg-buildpackage -us -uc -sa - - name: Collect .deb artifact + - name: Debug artifact files run: | - mkdir -p artifacts/${{ matrix.os }}/${{ matrix.version }} - mv ../libosal*.deb artifacts/${{ matrix.os }}/${{ matrix.version }} - + ls -l ../ + - name: Set sanitized image name id: sanitize run: | version=$(dpkg-parsechangelog | sed -n 's/^Version: //p') - echo "sanitized_image=$(echo "${version}_amd64" | tr '/:' '--')" >> $GITHUB_OUTPUT + echo "sanitized_image=$(echo "${version}" | tr '/:' '--')" >> $GITHUB_OUTPUT + + - name: Upload to APT repository + env: + DEPLOY_TOKEN: ${{ secrets.BS_UPLOAD_KEY }} + shell: bash + run: | + DISTRO="${{ matrix.distro }}" + SANITIZED_IMAGE="${{ steps.sanitize.outputs.sanitized_image }}" + + if [[ "$DISTRO" == "ubuntu-24.04" || "$DISTRO" == "ubuntu-22.04" ]]; then + OLD_EXT=".ddeb" + NEW_EXT=".deb" + + OLD_FILE="${PKGNAME}-dbgsym_${SANITIZED_IMAGE}_amd64${OLD_EXT}" + NEW_FILE="${PKGNAME}-dbgsym_${SANITIZED_IMAGE}_amd64${NEW_EXT}" + CHANGES_FILE="${PKGNAME}_${SANITIZED_IMAGE}_amd64.changes" + + mv "../$OLD_FILE" "../$NEW_FILE" + sed -i "s/${OLD_FILE}/${NEW_FILE}/g" "../$CHANGES_FILE" + fi + + DBG_FILE="../${PKGNAME}-dbgsym_${SANITIZED_IMAGE}_amd64.deb" + DEV_FILE="../${PKGNAME}-dev_${SANITIZED_IMAGE}_amd64.deb" + DEB_FILE="../${PKGNAME}_${SANITIZED_IMAGE}_amd64.deb" + CHANGES_FILE="../${PKGNAME}_${SANITIZED_IMAGE}_amd64.changes" + BUILDINFO_FILE="../${PKGNAME}_${SANITIZED_IMAGE}_amd64.buildinfo" + DSC_FILE="../${PKGNAME}_${SANITIZED_IMAGE}.dsc" + TAR_FILE="../${PKGNAME}_${SANITIZED_IMAGE}.tar.gz" + + for f in "$DEB_FILE" "$DEV_FILE" "$DBG_FILE" "$CHANGES_FILE" "$BUILDINFO_FILE" "$DSC_FILE" "$TAR_FILE"; do + [[ -f "$f" ]] || { echo "Missing file: $f"; exit 1; } + done + + curl -X POST https://deb.burger-system.de/upload \ + -H "Authorization: Bearer $DEPLOY_TOKEN" \ + -F "deb=@$DEB_FILE" \ + -F "deb-dev=@$DEV_FILE" \ + -F "dbgsym=@$DBG_FILE" \ + -F "changes=@$CHANGES_FILE" \ + -F "buildinfo=@$BUILDINFO_FILE" \ + -F "dsc=@$DSC_FILE" \ + -F "source=@$TAR_FILE" + + - name: Collect .deb artifact + run: | + mkdir -p artifacts/ + rsync -av --exclude=${PKGNAME} ../ artifacts/ - name: Upload .deb package artifact uses: actions/upload-artifact@v4 with: - name: libosal_${{ steps.sanitize.outputs.sanitized_image }}.deb - path: artifacts/${{ matrix.os }}/${{ matrix.version }}/*.deb - - - name: Debug artifact files - run: | - ls -l ./artifacts/${{ matrix.os }}/${{ matrix.version }}/ + name: ${{ env.PKGNAME }}-artifacts-${{ steps.sanitize.outputs.sanitized_image }} + path: artifacts/ # Fetch the release upload URL dynamically on tag builds - - name: Get Release Upload URL + - name: Upload all artifacts to Release if: startsWith(github.ref, 'refs/tags/') - id: get_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} run: | release_json=$(curl -sSL \ - -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/repos/${{ github.repository }}/releases/tags/${GITHUB_REF_NAME}") + upload_url=$(echo "$release_json" | jq -r '.upload_url' | sed -e "s/{?name,label}//") - echo "upload_url=$upload_url" >> $GITHUB_OUTPUT - env: - GITHUB_REF_NAME: ${{ github.ref_name }} - - - name: Upload asset manually with curl - if: startsWith(github.ref, 'refs/tags/') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - UPLOAD_URL: ${{ steps.get_release.outputs.upload_url }} - FILE_PATH: ./artifacts/${{ matrix.os }}/${{ matrix.version }}/libosal_${{ steps.sanitize.outputs.sanitized_image }}.deb - FILE_PATH_DEV: ./artifacts/${{ matrix.os }}/${{ matrix.version }}/libosal-dev_${{ steps.sanitize.outputs.sanitized_image }}.deb - FILE_NAME: libosal_${{ steps.sanitize.outputs.sanitized_image }}.deb - FILE_NAME_DEV: libosal-dev_${{ steps.sanitize.outputs.sanitized_image }}.deb - run: | - echo "Uploading $FILE_PATH to $UPLOAD_URL?name=$FILE_NAME" - curl --fail -X POST \ - -H "Authorization: token $GITHUB_TOKEN" \ - -H "Content-Type: application/vnd.debian.binary-package" \ - --data-binary @"$FILE_PATH" \ - "$UPLOAD_URL?name=$FILE_NAME" - - echo "Uploading $FILE_PATH_DEV to $UPLOAD_URL?name=$FILE_NAME_DEV" - curl --fail -X POST \ - -H "Authorization: token $GITHUB_TOKEN" \ - -H "Content-Type: application/vnd.debian.binary-package" \ - --data-binary @"$FILE_PATH_DEV" \ - "$UPLOAD_URL?name=$FILE_NAME_DEV" - - - name: Upload to Cloudsmith (${{ matrix.os }}/${{ matrix.version }}) - if: startsWith(github.ref, 'refs/tags/') - env: - CLOUDSMITH_API_KEY: ${{ secrets.CLOUDSMITH_API_KEY }} - shell: bash - run: | - FILENAME="artifacts/${{ matrix.os }}/${{ matrix.version }}/libosal_${{ steps.sanitize.outputs.sanitized_image }}.deb" - FILENAME_DEV="artifacts/${{ matrix.os }}/${{ matrix.version }}/libosal-dev_${{ steps.sanitize.outputs.sanitized_image }}.deb" - - python3 -m venv cloudsmith - cd cloudsmith - source bin/activate - - python3 -m pip install --upgrade pip - pip3 install cloudsmith-cli - - cloudsmith push deb robertburger/common/${{ matrix.os }}/${{ matrix.version }} ../${FILENAME} \ - --republish \ - --api-key "$CLOUDSMITH_API_KEY" + echo "Release upload URL: $upload_url" - cloudsmith push deb robertburger/common/${{ matrix.os }}/${{ matrix.version }} ../${FILENAME_DEV} \ - --republish \ - --api-key "$CLOUDSMITH_API_KEY" + if [ -d "./artifacts" ]; then + for file in ./artifacts/*; do + filename=$(basename "$file") + echo "Uploading $file as $filename" + curl --fail -X POST \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @"$file" \ + "$upload_url?name=$filename" + done + else + echo "Artifacts directory not found, skipping upload." + fi diff --git a/debian/rules b/debian/rules index 1e32a82..9b4752f 100755 --- a/debian/rules +++ b/debian/rules @@ -15,6 +15,8 @@ %: dh $@ +override_dh_builddeb: + dh_builddeb -- -Zgzip # dh_make generated override targets # This is example for Cmake (See https://bugs.debian.org/641051 )