mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-07 03:29:36 +00:00
137ba15e6e
Use ccache to speedup kernel compilation. Ccache dir is cached across each build test. To refresh ccache directory we generate an hash of the kernel include files, that includes the kernel versions of every kernel supported and the kernel compile includes. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
210 lines
6.7 KiB
YAML
210 lines
6.7 KiB
YAML
name: Build Kernel
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- '.github/workflows/kernel.yml'
|
|
- 'include/kernel-*'
|
|
- 'package/kernel/**'
|
|
- 'target/linux/generic/**'
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
determine_targets:
|
|
name: Set targets
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
target: ${{ steps.find_targets.outputs.target }}
|
|
owner_lc: ${{ steps.lower_owner.outputs.owner_lc }}
|
|
ccache_hash: ${{ steps.ccache_hash.outputs.ccache_hash }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v2
|
|
|
|
- name: Set lower case owner name
|
|
id: lower_owner
|
|
run: |
|
|
OWNER_LC=$(echo "${{ github.repository_owner }}" \
|
|
| tr '[:upper:]' '[:lower:]')
|
|
echo "::set-output name=owner_lc::$OWNER_LC"
|
|
|
|
- name: Generate ccache hash
|
|
id: ccache_hash
|
|
run: |
|
|
CCACHE_HASH=$(md5sum include/kernel-* | awk '{ print $1 }' \
|
|
| md5sum | awk '{ print $1 }')
|
|
echo "::set-output name=ccache_hash::$CCACHE_HASH"
|
|
|
|
- name: Set targets
|
|
id: find_targets
|
|
run: |
|
|
export TARGETS="$(perl ./scripts/dump-target-info.pl targets 2>/dev/null \
|
|
| sort -u -t '/' -k1,1 \
|
|
| awk '{ print $1 }')"
|
|
|
|
JSON='['
|
|
FIRST=1
|
|
for TARGET in $TARGETS; do
|
|
[[ $FIRST -ne 1 ]] && JSON="$JSON"','
|
|
JSON="$JSON"'"'"${TARGET}"'"'
|
|
FIRST=0
|
|
done
|
|
JSON="$JSON"']'
|
|
|
|
echo -e "\n---- targets ----\n"
|
|
echo "$JSON"
|
|
echo -e "\n---- targets ----\n"
|
|
|
|
echo "::set-output name=target::$JSON"
|
|
|
|
build:
|
|
name: Build Kernel with external toolchain
|
|
needs: determine_targets
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: False
|
|
matrix:
|
|
target: ${{fromJson(needs.determine_targets.outputs.target)}}
|
|
|
|
container: ghcr.io/${{ needs.determine_targets.outputs.owner_lc }}/tools:latest
|
|
|
|
permissions:
|
|
contents: read
|
|
packages: read
|
|
|
|
steps:
|
|
- name: Checkout master directory
|
|
uses: actions/checkout@v2
|
|
with:
|
|
path: openwrt
|
|
|
|
- name: Checkout packages feed
|
|
uses: actions/checkout@v2
|
|
with:
|
|
repository: openwrt/packages
|
|
path: openwrt/feeds/packages
|
|
|
|
- name: Checkout luci feed
|
|
uses: actions/checkout@v2
|
|
with:
|
|
repository: openwrt/luci
|
|
path: openwrt/feeds/luci
|
|
|
|
- name: Checkout routing feed
|
|
uses: actions/checkout@v2
|
|
with:
|
|
repository: openwrt/routing
|
|
path: openwrt/feeds/routing
|
|
|
|
- name: Checkout telephony feed
|
|
uses: actions/checkout@v2
|
|
with:
|
|
repository: openwrt/telephony
|
|
path: openwrt/feeds/telephony
|
|
|
|
- name: Fix permission
|
|
run: |
|
|
chown -R buildbot:buildbot openwrt
|
|
|
|
- name: Initialization environment
|
|
run: |
|
|
TARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 1)
|
|
SUBTARGET=$(echo ${{ matrix.target }} | cut -d "/" -f 2)
|
|
echo "TARGET=$TARGET" >> "$GITHUB_ENV"
|
|
echo "SUBTARGET=$SUBTARGET" >> "$GITHUB_ENV"
|
|
|
|
- name: Update & Install feeds
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: |
|
|
./scripts/feeds update -a
|
|
./scripts/feeds install -a
|
|
|
|
- name: Parse toolchain file
|
|
working-directory: openwrt
|
|
run: |
|
|
TOOLCHAIN_STRING="$(curl "https://downloads.cdn.openwrt.org/snapshots/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/sha256sums" \
|
|
| grep ".*openwrt-toolchain.*tar.xz")"
|
|
TOOLCHAIN_FILE=$(echo "$TOOLCHAIN_STRING" | sed -n -e 's/.*\(openwrt-toolchain.*\).tar.xz/\1/p')
|
|
TOOLCHAIN_SHA256=$(echo "$TOOLCHAIN_STRING" | cut -d ' ' -f 1)
|
|
|
|
echo "TOOLCHAIN_FILE=$TOOLCHAIN_FILE" >> "$GITHUB_ENV"
|
|
echo "TOOLCHAIN_SHA256=$TOOLCHAIN_SHA256" >> "$GITHUB_ENV"
|
|
|
|
- name: Cache external toolchain
|
|
id: cache-external-toolchain
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: openwrt/${{ env.TOOLCHAIN_FILE }}
|
|
key: ${{ env.TOOLCHAIN_FILE }}-${{ env.TOOLCHAIN_SHA256 }}
|
|
|
|
- name: Cache ccache
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: openwrt/.ccache
|
|
key: ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-${{ needs.determine_targets.outputs.ccache_hash }}
|
|
restore-keys: |
|
|
ccache-kernel-${{ env.TARGET }}/${{ env.SUBTARGET }}-
|
|
|
|
- name: Download external toolchain
|
|
if: ${{ steps.cache-external-toolchain.outputs.cache-hit != 'true' }}
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: |
|
|
wget -O - https://downloads.cdn.openwrt.org/snapshots/targets/${{ env.TARGET }}/${{ env.SUBTARGET }}/${TOOLCHAIN_FILE}.tar.xz \
|
|
| tar --xz -xf -
|
|
|
|
- name: Extract prebuilt tools
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: ./scripts/ext-tools.sh --tools /tools.tar
|
|
|
|
- name: Configure external toolchain
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: |
|
|
echo CONFIG_ALL_KMODS=y >> .config
|
|
echo CONFIG_DEVEL=y >> .config
|
|
echo CONFIG_AUTOREMOVE=y >> .config
|
|
echo CONFIG_CCACHE=y >> .config
|
|
|
|
./scripts/ext-toolchain.sh \
|
|
--toolchain ${{ env.TOOLCHAIN_FILE }}/toolchain-* \
|
|
--overwrite-config \
|
|
--config ${{ env.TARGET }}/${{ env.SUBTARGET }}
|
|
|
|
- name: Show configuration
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: ./scripts/diffconfig.sh
|
|
|
|
- name: Build tools
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: make tools/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
|
|
|
|
- name: Build toolchain
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: make toolchain/install -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
|
|
|
|
- name: Build Kernel
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: make target/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
|
|
|
|
- name: Build Kernel Kmods
|
|
shell: su buildbot -c "sh -e {0}"
|
|
working-directory: openwrt
|
|
run: make package/linux/compile -j$(nproc) BUILD_LOG=1 || ret=$? .github/workflows/scripts/show_build_failures.sh
|
|
|
|
- name: Upload logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v2
|
|
with:
|
|
name: ${{ env.TARGET }}-${{ env.SUBTARGET }}-logs
|
|
path: "openwrt/logs"
|