Skip to content

🐧 Build kernel #6

🐧 Build kernel

🐧 Build kernel #6

Workflow file for this run

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
make olddefconfig
- 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/%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