TWRP Builder #11
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
# | |
# Copyright (C) 2024 Antonino Scordino | |
# Copyright (C) 2024 Souhrud Reddy | |
# | |
# SPDX-License-Identifier: Apache-2.0 | |
# | |
name: TWRP Builder | |
on: | |
workflow_dispatch: | |
# Various inputs to simplify usage of workflow. | |
inputs: | |
BASE_PROJECT: | |
description: 'Choose a base project:' | |
required: true | |
default: 'LineageOS 20.0' | |
type: choice | |
options: | |
- 'TWRP 12.1' | |
BUILD_DIFFERENT_ROM: | |
description: "Command to initialize a different 'repo' project:" | |
required: false | |
default: "echo 'Build Starting!'" | |
REMOVALS: | |
description: "Folders to be removed before syncing:" | |
required: false | |
LOCAL_MANIFEST: | |
description: "Personal local manifest [repository or raw]:" | |
required: true | |
default: 'https://github.com/sounddrill31/local_manifests' | |
LOCAL_MANIFEST_BRANCH: | |
description: "Personal local manifest's branch:" | |
required: false | |
default: 'twrp-oxygen' | |
DEVICE_NAME: | |
description: "Device's codename:" | |
required: true | |
default: "oxygen" | |
PRODUCT_NAME: | |
description: "Product to build:" | |
required: true | |
default: "twrp_oxygen" | |
BUILD_COMMAND: | |
description: 'Command to be used for compiling:' | |
required: true | |
default: 'mka recoveryimage' | |
BUILD_TYPE: | |
description: 'Type of build:' | |
required: true | |
default: 'eng' | |
type: choice | |
options: | |
- 'eng' | |
- 'userdebug' | |
- 'user' | |
CLEAN_BUILD: | |
description: 'Build with a clean workspace?' | |
required: true | |
default: 'no' | |
type: choice | |
options: | |
- 'yes' | |
- 'no' | |
jobs: | |
test: | |
name: Build TWRP using foss.crave.io | |
# Change this to self-hosted after setting up devspace as github actions runner | |
runs-on: ubuntu-latest | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
steps: | |
# Create a project folder | |
- name: Create Project Folders | |
run: | | |
mkdir -p devspace | |
sudo mkdir -p /crave-devspaces | |
sudo ln -sf ${pwd}/devspace /crave-devspaces | |
sudo chmod 777 /crave-devspaces | |
export PROJECTFOLDER="/crave-devspaces/TWRP" | |
mkdir -p $PROJECTFOLDER | |
echo "PROJECTFOLDER=$PROJECTFOLDER" >> "$GITHUB_ENV" | |
echo "OLDDIR=$(pwd)" >> "$GITHUB_ENV" | |
# Check-out in order to access the repository's files. | |
- name: Check-out to repository | |
uses: actions/checkout@v4 | |
# Set-up a spearate directory for the device. | |
- name: Set-up workspace environment | |
run: | | |
mkdir ${{ github.event.inputs.DEVICE_NAME }} | |
cd ${{ github.event.inputs.DEVICE_NAME }} | |
continue-on-error: true | |
# Download and configure 'repo'. | |
- name: Configure the 'repo' environment | |
run: | | |
mkdir "${HOME}/bin" | |
curl https://storage.googleapis.com/git-repo-downloads/repo >> "${HOME}/bin/repo" | |
chmod a+x "${HOME}/bin/repo" | |
sudo ln -sf "/home/${USER}/bin/repo" "/usr/bin/repo" | |
continue-on-error: true | |
# Generate 'git' credential in base of the workflow's author. | |
- name: Set-up 'git' credential(s) | |
run: | | |
git config --global user.name "${{ github.actor }}" | |
git config --global user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com" | |
# Test Your Personal 'Local Manifests' against The ROM | |
- name: Test Local Manifests | |
run: | | |
cd $PROJECTFOLDER | |
rm -rf tester | |
mkdir tester | |
cd tester | |
if [ "${{ github.event.inputs.BUILD_DIFFERENT_ROM }}" == "echo 'Build Starting!'" ]; then | |
case "${{ github.event.inputs.BASE_PROJECT }}" in | |
"TWRP 12.1") | |
repo init -u https://github.com/ArrowOS/android_manifest.git -b arrow-13.1 --depth=1 | |
;; | |
esac | |
else | |
${{ github.event.inputs.BUILD_DIFFERENT_ROM }} | |
fi | |
git clone ${{ github.event.inputs.LOCAL_MANIFEST }} --depth 1 -b ${{ github.event.inputs.LOCAL_MANIFEST_BRANCH }} .repo/local_manifests && \ | |
timeout 1m repo sync --force-sync || { exit_code=$?; [ $exit_code -eq 124 ] || (echo "Error: Process failed with exit code $exit_code"; exit $exit_code); } | |
rm -rf .repo | |
timeout-minutes: 10 | |
# Initialize the previously choosen 'repo' project. | |
- name: Set the 'crave' project | |
run: | | |
cd $PROJECTFOLDER | |
case "${{ github.event.inputs.BASE_PROJECT }}" in | |
"TWRP 12.1") | |
repo init -u https://github.com/minimal-manifest-twrp/platform_manifest_twrp_aosp.git -b twrp-12.1 | |
;; | |
esac | |
if [ "${{ github.event.inputs.BUILD_DIFFERENT_ROM }}" == "echo 'Build Starting!'" ]; then | |
echo "Building ${{ github.event.inputs.BASE_PROJECT }}" | |
else | |
export BUILD_DIFFERENT_ROM="${{ github.event.inputs.BUILD_DIFFERENT_ROM }}" | |
fi | |
echo "BUILD_DIFFERENT_ROM=$BUILD_DIFFERENT_ROM" >> "$GITHUB_ENV" | |
# Download and configure 'crave'. | |
- name: Configure the 'crave' environment | |
run: | | |
if [ "${DCDEVSPACE}" == "1" ]; then | |
echo 'No need to set up crave, we are already running in devspace!' | |
else | |
curl -s https://raw.githubusercontent.com/accupara/crave/master/get_crave.sh | bash -s -- | |
mv ${PWD}/crave ${HOME}/bin/ | |
sudo ln -sf /home/${USER}/bin/crave /usr/bin/crave | |
envsubst < ${PWD}/crave.conf.sample >> ${PWD}/crave.conf | |
rm -rf ${PWD}/crave.conf.sample | |
cp crave.conf $PROJECTFOLDER | |
fi | |
if [[ -z "${{ secrets.CUSTOM_YAML }}" ]]; then | |
cp crave.yaml.twrp $PROJECTFOLDER/.repo/manifests | |
echo "No Custom Configuration Found, Using Template!" | |
else | |
touch $PROJECTFOLDER/.repo/manifests/crave.yaml || true | |
echo "${{ secrets.CUSTOM_YAML }}" > $PROJECTFOLDER/.repo/manifests/crave.yaml | |
echo "Custom Configuration Found!" | |
fi | |
env: | |
CRAVE_USERNAME: ${{ secrets.CRAVE_USERNAME }} | |
CRAVE_TOKEN: ${{ secrets.CRAVE_TOKEN }} | |
# Create a 'crave' job for building. | |
- name: Start compilation through 'crave' | |
run: | | |
cd $PROJECTFOLDER | |
if [ "${{ github.event.inputs.CLEAN_BUILD }}" == "yes" ]; then | |
export CLEAN="clean" | |
fi | |
crave run --no-patch --${CLEAN} "rm -rf .repo/local_manifests/ ${{ github.event.inputs.REMOVALS }} && \ | |
# Clone local_manifests repository | |
$BUILD_DIFFERENT_ROM ; \ | |
git clone ${{ github.event.inputs.LOCAL_MANIFEST }} --depth 1 -b ${{ github.event.inputs.LOCAL_MANIFEST_BRANCH }} .repo/local_manifests && \ | |
if [ ! $? == 0 ]; then \ | |
curl -o .repo/local_manifests ${{ github.event.inputs.LOCAL_MANIFEST }}; \ | |
fi \ | |
# Sync the repositories | |
/opt/crave/resync.sh && \ | |
# Set up build environment | |
export BUILD_USERNAME=${{ github.actor }} ; \ | |
export BUILD_HOSTNAME=crave ; \ | |
source build/envsetup.sh && \ | |
export ALLOW_MISSING_DEPENDENCIES=true; \ | |
# Build the ROM | |
lunch ${{ github.event.inputs.PRODUCT_NAME }}-${{ github.event.inputs.BUILD_TYPE }} && \ | |
make installclean && \ | |
${{ github.event.inputs.BUILD_COMMAND }}" | |
# Only reach this wheter the user killed the workflow. | |
- name: Execute if the job is cancelled | |
if: ${{ cancelled() }} | |
run: | | |
cd $PROJECTFOLDER | |
crave stop --all | |
# Upload '.zip's and '.img's directly from 'crave' ssh. | |
- name: Upload build artifact(s) | |
run: | | |
cd $PROJECTFOLDER | |
echo "${{ secrets.GITHUB_TOKEN }}" > token.txt | |
crave push token.txt -d $(crave ssh -- pwd | grep -v Select | sed -s 's/\r//g')/ | |
crave ssh -- "bash /opt/crave/github-actions/upload.sh '${{ github.run_id }}' '${{ github.event.inputs.DEVICE_NAME }}' '${{ github.repository }}' '${{ github.event.inputs.PRODUCT_NAME }}-${{ github.run_id }}'" |