Build kernels #59
This file contains 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 kernels" | |
env: | |
CONFIGURATION: "repos.json" | |
OUT_DIR: "${{ github.workspace }}/out" | |
on: | |
watch: | |
types: [started] | |
workflow_dispatch: | |
jobs: | |
Set-repos: | |
name: "Configuration CI" | |
runs-on: ubuntu-latest | |
outputs: | |
repos: ${{ steps.generate-matrix.outputs.repos }} | |
builddate: ${{ steps.generate-builddate.outputs.builddate }} | |
steps: | |
- name: "Checkout" | |
uses: actions/checkout@v4 | |
- name: "Generate CI" | |
id: generate-matrix | |
run: | | |
echo "repos<<EOF" >> $GITHUB_OUTPUT | |
cat ${{ env.CONFIGURATION }} >> $GITHUB_OUTPUT | |
echo "EOF" >> $GITHUB_OUTPUT | |
- name: "Set builddate" | |
id: generate-builddate | |
run: echo "builddate=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT | |
Build-Kernel: | |
name: "Build kernel" | |
runs-on: ubuntu-latest | |
needs: | |
- Set-repos | |
strategy: | |
max-parallel: 4 | |
fail-fast: false | |
matrix: | |
repos: ${{ fromJSON(needs.Set-repos.outputs.repos) }} | |
env: | |
TZ: Asia/Jakarta | |
DEVICE: ${{ github.event.inputs.device }} | |
WORKSPACE: ${{ github.workspace }} | |
builddate: "${{ needs.Set-repos.outputs.builddate }}" | |
KERNEL_NAME: ${{ matrix.repos.kernelSource.name }} | |
KERNEL_REPO: ${{ matrix.repos.kernelSource.repo }} | |
KERNEL_BRANCH: ${{ matrix.repos.kernelSource.branch }} | |
KERNEL_DEVICE: ${{ matrix.repos.kernelSource.device }} | |
DEFCONFIG_NAME: ${{ matrix.repos.kernelSource.defconfig }} | |
withKernelSU: ${{ matrix.repos.withKernelSU }} | |
ccache: ${{ matrix.repos.ccache }} | |
useAnykernel: ${{ matrix.repos.AnyKernel3.use }} | |
release: ${{ matrix.repos.AnyKernel3.release }} | |
steps: | |
- name: "Install Dependency" | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y build-essential clang bc bison libssl-dev libfl-dev libncurses5-dev libzstd-dev libtinfo5 | |
sudo apt-get install -y curl git ftp lftp wget libarchive-tools ccache python2 python2-dev | |
sudo apt-get install -y zip unzip tar gzip bzip2 rar unrar cpio | |
- name: Set swap to 10G | |
uses: pierotofy/set-swap-space@master | |
with: | |
swap-size-gb: 10 | |
- name: "Setup Anykernel3" | |
env: | |
params: "${{ toJSON(matrix.repos.AnyKernel3) }}" | |
run: | | |
ANYKERNEL_REPO=$(echo $params | jq -r ".repo") | |
ANYKERNEL_BRANCH=$(echo $params | jq -r ".branch") | |
git clone --recursive --depth=1 -j $(nproc) --branch $ANYKERNEL_BRANCH $ANYKERNEL_REPO AnyKernel3 | |
echo "Setup Anykernel3 => ($ANYKERNEL_REPO)" | |
- name: "Clone kernel source => (${{ env.KERNEL_REPO }})" | |
run: | | |
git clone --recursive --depth=1 -j $(nproc) --branch $KERNEL_BRANCH $KERNEL_REPO $KERNEL_NAME | |
echo "Clone kernel source => ($KERNEL_REPO)" | |
- name: "Clone Clang" | |
env: | |
toolchains: "${{ toJSON(matrix.repos.toolchains) }}" | |
run: | | |
toolchains_num="$(echo $toolchains | jq 'length')" | |
echo "There is $toolchains_num defined toolchains." | |
for ((i=0;i<toolchains_num;i++)); do | |
toolchain_name=$(echo $toolchains | jq -r ".[$i].name") | |
# Github | |
toolchain_repo=$(echo $toolchains | jq -r ".[$i].repo") | |
toolchain_branch=$(echo $toolchains | jq -r ".[$i].branch") | |
# From archive | |
toolchain_url=$(echo $toolchains | jq -r ".[$i].url") | |
echo $toolchain_url | |
if [ -z "${toolchain_url:-}" ] || [ "$toolchain_url" = "null" ]; then | |
git clone --recursive --depth=1 -j $(nproc) --branch $toolchain_branch $toolchain_repo $toolchain_name | |
echo "Clone $toolchain_name => ($toolchain_repo)" | |
else | |
wget "$toolchain_url" | |
filename="${toolchain_url##*/}" | |
mkdir -p $toolchain_name | |
case "$filename" in | |
*.zip) | |
unzip -d $toolchain_name "$filename" | |
;; | |
*.tar) | |
tar xvf "$filename" -C $toolchain_name | |
;; | |
*.tar.gz) | |
tar zxvf "$filename" -C $toolchain_name | |
;; | |
*.rar) | |
unrar x "$filename" $toolchain_name | |
;; | |
*) | |
echo "unknown file type: $filename" | |
;; | |
esac | |
fi | |
jq -r ".[$i].binPath[] | tostring" <<< "$toolchains" | while read -r bin_path; do | |
echo "$WORKSPACE/$toolchain_name/$bin_path" >> $GITHUB_PATH | |
done | |
done | |
- name: "Set args" | |
id: generate-args | |
env: | |
params: "${{ toJSON(matrix.repos.params) }}" | |
THREAD: $(nproc --all) | |
run: | | |
echo "PATH Variable: $PATH" | |
ARCH=$(echo $params | jq -r ".ARCH") | |
CC=$(echo $params | jq -r ".CC") | |
args="-j${{ env.THREAD }}" | |
if [ -n "${{ env.OUT_DIR }}" ]; then | |
mkdir -p ${{ env.OUT_DIR }} && args="$args O=${{ env.OUT_DIR }}" | |
fi | |
if [ -n "$ARCH" ]; then | |
args="$args ARCH=$ARCH" | |
fi | |
if [ -n "$CC" ]; then | |
if [[ "$CC" == *"/"* ]]; then | |
CC=${{ env.WORKSPACE }}/$CC | |
fi | |
if [ ${{ env.ccache }} = true ]; then | |
args="$args CC=\"ccache $CC\"" | |
else | |
args="$args CC=$CC" | |
fi | |
fi | |
while read -r externalCommand; do | |
key=$(echo "$externalCommand" | cut -d= -f1) | |
value=$(echo "$externalCommand" | cut -d= -f2) | |
if [[ "$value" == *"/"* ]]; then | |
value="${{ env.WORKSPACE }}/$value" | |
fi | |
args="$args $key=$value" | |
done < <(jq -r '.externalCommand | to_entries[] | "\(.key)=\(.value)"' <<< "$params") | |
echo "$args" | |
echo "ARCH=$ARCH" >> $GITHUB_OUTPUT | |
echo "args=$args" >> $GITHUB_OUTPUT | |
- name: "Make defconfig" | |
working-directory: ${{ env.KERNEL_NAME }} | |
env: | |
args: ${{ steps.generate-args.outputs.args }} | |
arch: ${{ steps.generate-args.outputs.ARCH }} | |
run: | | |
echo "PATH Variable: $PATH" | |
make ${{ env.args }} ${{ env.DEFCONFIG_NAME }} | |
- name: Set Git Config | |
run: | | |
git config --global user.name "shenprjkt" | |
git config --global user.email "[email protected]" | |
- name: "Build kernel" | |
working-directory: ${{ env.KERNEL_NAME }} | |
env: | |
args: ${{ steps.generate-args.outputs.args }} | |
run: | | |
echo "PATH Variable: $PATH" | |
make ${{ env.args }} | |
- name: "Upload Image.gz-dtb" | |
uses: actions/upload-artifact@v4 | |
env: | |
arch: ${{ steps.generate-args.outputs.ARCH }} | |
with: | |
name: Image.gz-dtb${{ env.KERNEL_DEVICE }}-${{ env.KERNEL_NAME }}-${{ env.builddate }} | |
path: ${{ env.OUT_DIR }}/arch/${{ env.arch }}/boot/Image.gz-dtb | |
if-no-files-found: ignore | |
retention-days: 7 | |
- name: "Pack AnyKernel3.zip" | |
if: ${{ env.useAnykernel == 'true' }} | |
env: | |
arch: ${{ steps.generate-args.outputs.ARCH }} | |
anykernel: "${{ env.WORKSPACE }}/${{ env.KERNEL_DEVICE }}-${{ env.KERNEL_NAME }}_${{ env.builddate }}" | |
run: | | |
ls -al | |
if [ -e "${{ env.OUT_DIR }}/arch/${{ env.arch }}/boot/Image.gz-dtb" ]; then | |
cp -f ${{ env.OUT_DIR }}/arch/${{ env.arch }}/boot/Image.gz-dtb ./AnyKernel3/ | |
fi | |
cd AnyKernel3/ | |
zip -q -r "${{ env.anykernel }}.zip" * | |
- name: "Upload AnyKernel3 image => (${{ env.builddate }})" | |
uses: actions/upload-artifact@v4 | |
if: ${{ env.useAnykernel == 'true' }} | |
with: | |
name: "${{ env.KERNEL_DEVICE }}-${{ env.KERNEL_NAME }}_${{ env.builddate }}" | |
path: AnyKernel3/* | |
- name: Create GitHub Release => (${{ env.builddate }}) | |
continue-on-error: true | |
uses: softprops/action-gh-release@v2 | |
if: ${{ env.useAnykernel == 'true' && env.release == 'true' }} | |
with: | |
tag_name: v${{ env.builddate }}.${{ github.run_number }} | |
files: "${{ env.WORKSPACE }}/${{ env.KERNEL_DEVICE }}-${{ env.KERNEL_NAME }}_${{ env.builddate }}.zip" | |
generate_release_notes: true | |
- name: Upload Telegram | |
run: | | |
wget https://raw.githubusercontent.com/shenprjkt/Kernel_CI/master/upload.sh | |
bash upload.sh |