Skip to content

TWRP Builder

TWRP Builder #11

Workflow file for this run

#
# 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 }}'"