π§ Build kernel #9
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: π§ Build kernel | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| config: | |
| description: 'π Kernel config name (ej: config-6.18.2-debian13 from configs/)' | |
| required: true | |
| default: 'config-6.18.2-debian13' | |
| patch: | |
| description: 'π§© Optional patch name (from patchs/ in repo)' | |
| required: false | |
| default: '' | |
| localversion: | |
| description: 'π Local version name (ej: -custom, -local..)' | |
| required: true | |
| default: '' | |
| tag: | |
| description: 'π·οΈ Git tag from torvalds/linux repo (used if no URL)' | |
| required: false | |
| default: '' | |
| url: | |
| description: 'π¦ Kernel tarball URL from kernel.org (.tar.gz or .tar.xz)' | |
| required: false | |
| default: '' | |
| permissions: | |
| contents: write | |
| jobs: | |
| build-kernel: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: π§Ή Clean up space | |
| run: | | |
| sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache | |
| df -h | |
| - name: βοΈ Install build dependencies | |
| run: | | |
| sudo apt update -qq | |
| sudo apt install -y git build-essential fakeroot bc bison flex libdw-dev libelf-dev libssl-dev \ | |
| libncurses5-dev libncurses-dev dwarves debhelper rsync python3 ccache curl jq patch | |
| - name: π₯ Download kernel tarball | |
| if: ${{ inputs.url != '' }} | |
| id: download_tarball | |
| run: | | |
| FILENAME=$(basename "${{ inputs.url }}") | |
| EXT="${FILENAME##*.}" | |
| if [[ "$EXT" != "gz" && "$EXT" != "xz" ]]; then | |
| echo "β Only .tar.gz or .tar.xz are allowed" | |
| exit 1 | |
| fi | |
| echo "β¬οΈ Downloading kernel package..." | |
| curl -L -o kernel_package.tar."$EXT" "${{ inputs.url }}" | |
| mkdir -p kernel_build | |
| tar -xf kernel_package.tar."$EXT" -C kernel_build --strip-components=1 | |
| TAG=$(echo "$FILENAME" | sed -E 's/linux-([0-9]+\.[0-9]+\.[0-9]+)\.tar\.(gz|xz)/\1/') | |
| echo "kernel_tag=$TAG" >> $GITHUB_ENV | |
| - name: π₯ Clone torvalds/linux repo | |
| if: ${{ inputs.url == '' && inputs.tag != '' }} | |
| id: clone_repo | |
| run: | | |
| git clone --depth 1 --branch ${{ inputs.tag }} https://github.com/torvalds/linux kernel_build | |
| echo "kernel_tag=${{ inputs.tag }}" >> $GITHUB_ENV | |
| - name: π Verify kernel source | |
| run: | | |
| if [ ! -d kernel_build ]; then | |
| echo "β No kernel source available! Provide either a valid URL or a tag." | |
| exit 1 | |
| fi | |
| - name: π Download .config and optional patch from GitHub | |
| run: | | |
| CONFIG_INPUT="${{ inputs.config }}" | |
| PATCH_INPUT="${{ inputs.patch }}" | |
| CONFIG_URL="https://raw.githubusercontent.com/azagramac/linux-kernel/refs/heads/master/configs/${CONFIG_INPUT}" | |
| echo "β¬οΈ Downloading config from $CONFIG_URL..." | |
| curl -L -o kernel_build/.config "$CONFIG_URL" | |
| if [ -n "$PATCH_INPUT" ]; then | |
| PATCH_URL="https://raw.githubusercontent.com/azagramac/linux-kernel/refs/heads/master/patchs/${PATCH_INPUT}" | |
| echo "β¬οΈ Downloading patch from $PATCH_URL..." | |
| if curl -L -f -o kernel_build/patch_file.patch "$PATCH_URL"; then | |
| echo "β Patch downloaded successfully" | |
| else | |
| echo "β οΈ Patch $PATCH_INPUT not found, skipping..." | |
| fi | |
| fi | |
| - name: π§ Apply kernel config | |
| run: | | |
| cd kernel_build | |
| echo "π§ Applying configuration..." | |
| scripts/config --enable IKHEADERS | |
| scripts/config --enable DEBUG_INFO | |
| - name: π§© Apply patch | |
| if: ${{ inputs.patch != '' }} | |
| run: | | |
| cd kernel_build | |
| if [ -f patch_file.patch ]; then | |
| echo "π§ Applying patch patch_file.patch" | |
| patch -p1 < patch_file.patch || true | |
| else | |
| echo "β οΈ No patch to apply, continuing build" | |
| fi | |
| - name: π Show kernel version | |
| run: | | |
| cd kernel_build | |
| echo "π·οΈ Kernel to be built: $(make kernelrelease)" | |
| - name: π§ Build kernel | |
| run: | | |
| cd kernel_build | |
| make -j$(nproc) bindeb-pkg LOCALVERSION=${{ inputs.localversion }} KDEB_PKGVERSION=1 | |
| - name: π Get compiled kernel version | |
| id: get_version | |
| run: | | |
| cd kernel_build | |
| echo "version=$(make kernelrelease)" >> $GITHUB_OUTPUT | |
| - name: π¦ Move .deb artifacts | |
| run: | | |
| mkdir -p artifacts | |
| find .. -name "*.deb" -exec cp {} artifacts/ \; | |
| find .. -name "*.changes" -exec cp {} artifacts/ \; | |
| find .. -name "*.buildinfo" -exec cp {} artifacts/ \; | |
| - name: π Generate formatted release body from .changes | |
| id: release_body | |
| shell: bash | |
| run: | | |
| CHANGES_FILE=$(find artifacts -maxdepth 1 -name "*.changes" | head -n1) | |
| if [ -z "$CHANGES_FILE" ]; then | |
| echo "β No .changes file found in artifacts" | |
| exit 1 | |
| fi | |
| get_field() { | |
| awk -F': ' -v key="$1" '$1==key {print $2}' "$CHANGES_FILE" | |
| } | |
| FORMAT=$(get_field "Format") | |
| DATE=$(get_field "Date") | |
| SOURCE=$(get_field "Source") | |
| ARCH=$(get_field "Architecture") | |
| VERSION=$(get_field "Version") | |
| DIST=$(get_field "Distribution") | |
| URGENCY=$(get_field "Urgency") | |
| MAINTAINER=$(get_field "Maintainer") | |
| CHANGED_BY=$(get_field "Changed-By") | |
| BINARIES=$(get_field "Binary" | sed 's/ /\` \`/g; s/^/\`/; s/$/\`/') | |
| DESCRIPTION=$(awk ' | |
| /^Description:/ {flag=1; next} | |
| /^Changes:/ {flag=0} | |
| flag && NF {print " - "$0} | |
| ' "$CHANGES_FILE") | |
| SHA1=$(awk ' | |
| /^Checksums-Sha1:/ {flag=1; next} | |
| /^Checksums-Sha256:/ {flag=0} | |
| flag && NF {print} | |
| ' "$CHANGES_FILE") | |
| SHA256=$(awk ' | |
| /^Checksums-Sha256:/ {flag=1; next} | |
| /^Files:/ {flag=0} | |
| flag && NF {print} | |
| ' "$CHANGES_FILE") | |
| FILES=$(awk ' | |
| /^Files:/ {flag=1; next} | |
| flag && NF {print} | |
| ' "$CHANGES_FILE") | |
| cat <<EOF > release.md | |
| **Format:** $FORMAT | |
| **Date:** $DATE | |
| **Source:** $SOURCE | |
| **Binary:** $BINARIES | |
| **Architecture:** $ARCH | |
| **Version:** $VERSION | |
| **Distribution:** $DIST | |
| **Urgency:** $URGENCY | |
| **Maintainer:** $MAINTAINER | |
| **Changed-By:** $CHANGED_BY | |
| ## π Description: | |
| $DESCRIPTION | |
| ## π ChangeLog: | |
| * Custom built Linux kernel. | |
| ## β Checksums-Sha1: | |
| \`\`\`bash | |
| $SHA1 | |
| \`\`\` | |
| ## β Checksums-Sha256: | |
| \`\`\`bash | |
| $SHA256 | |
| \`\`\` | |
| ## π¦ Files: | |
| \`\`\`bash | |
| $FILES | |
| \`\`\` | |
| EOF | |
| echo "body<<EOF" >> $GITHUB_OUTPUT | |
| cat release.md >> $GITHUB_OUTPUT | |
| echo "EOF" >> $GITHUB_OUTPUT | |
| - name: π Upload Linux Kernel | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: kernel-${{ github.run_number }} | |
| name: "Kernel ${{ steps.get_version.outputs.version }}" | |
| body: ${{ steps.release_body.outputs.body }} | |
| files: artifacts/*.deb | |
| overwrite_files: true | |
| generate_release_notes: true | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: π€ Send Telegram notification | |
| if: always() | |
| env: | |
| TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} | |
| TELEGRAM_CHATID: ${{ secrets.TELEGRAM_CHATID }} | |
| GITHUB_RUN_ID: ${{ github.run_id }} | |
| BUILD_STATUS: ${{ job.status }} | |
| KERNEL_VERSION: ${{ steps.get_version.outputs.version }} | |
| run: | | |
| STATUS_EMOJI="β " | |
| if [ "$BUILD_STATUS" != "success" ]; then | |
| STATUS_EMOJI="β" | |
| fi | |
| MESSAGE=$(printf "<b> π§ Linux Kernel Build %s %s</b>\n\n \ | |
| π·οΈ <b>VersiΓ³n:</b> %s\n \ | |
| π <a href=\"https://github.com/%s/actions/runs/%s\">Ver detalles en GitHub</a>" \ | |
| "$STATUS_EMOJI" "${BUILD_STATUS^}" "$KERNEL_VERSION" "${{ github.repository_owner }}" "${{ github.repository }}" "$GITHUB_RUN_ID") | |
| curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \ | |
| --data-urlencode "chat_id=${TELEGRAM_CHATID}" \ | |
| --data-urlencode "parse_mode=HTML" \ | |
| --data-urlencode "text=$MESSAGE" >/dev/null 2>&1 |