Initial commit
This commit is contained in:
commit
bb27dc8dc1
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
__pycache__
|
||||
ovh_orchestrator/config.py
|
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
||||
Building Android (Lineage 17.1 / `/e/`) for LG G6 (h870)
|
||||
========================================================
|
||||
|
||||
Lots of RAM (12GB is short!) / good CPU required!
|
||||
|
||||
|
115
build_android.sh
Executable file
115
build_android.sh
Executable file
@ -0,0 +1,115 @@
|
||||
#!/bin/bash
|
||||
# Ubuntu 20.04 base
|
||||
set -e
|
||||
set -x
|
||||
|
||||
# Install dependencies
|
||||
apt-get update
|
||||
apt-get upgrade -y
|
||||
apt-get install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
|
||||
apt-get install -y default-jdk
|
||||
apt-get install -y python2
|
||||
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 # Android git repo hooks are python2-only
|
||||
|
||||
# Install repo
|
||||
mkdir ~/bin
|
||||
cat >> ~/.profile <<EOF
|
||||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "$HOME/bin" ] ; then
|
||||
PATH="$HOME/bin:$PATH"
|
||||
fi
|
||||
EOF
|
||||
source ~/.profile
|
||||
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
|
||||
chmod a+x ~/bin/repo
|
||||
|
||||
# Git config
|
||||
git config --global user.email "phyks@phyks.me"
|
||||
git config --global user.name "Phyks (Lucas Verney)"
|
||||
|
||||
# Use ccache
|
||||
cat >> ~/.bashrc <<EOF
|
||||
export USE_CCACHE=1
|
||||
export CCACHE_EXEC=/usr/bin/ccache
|
||||
EOF
|
||||
source ~/.bashrc
|
||||
ccache -M 50G
|
||||
ccache -o compression=true
|
||||
|
||||
# Clone Lineage 17.1 or /e/ codebase (takes roughly 1h!)
|
||||
mkdir -p ~/android/lineage
|
||||
cd ~/android/lineage
|
||||
if [[ "${BUILD_FLAVOR}" == "lineage" ]]; then
|
||||
repo init -u https://github.com/LineageOS/android.git -b lineage-17.1
|
||||
elif [[ "$BUILD_FLAVOR" == "e" ]]; then
|
||||
repo init -u https://gitlab.e.foundation/e/os/android.git -b v1-q
|
||||
else
|
||||
echo "Unknown build flavor! Exiting."
|
||||
exit 1
|
||||
fi
|
||||
repo sync
|
||||
source build/envsetup.sh
|
||||
|
||||
# Get h870-specific repos
|
||||
mkdir -p ~/android/lineage/.repo/local_manifests/
|
||||
cat > ~/android/lineage/.repo/local_manifests/roomservice.xml <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<manifest>
|
||||
<project name="LG-G6-DEV/android_device_lge_h870" path="device/lge/h870" remote="github" revision="lineage-17.0" />
|
||||
<project name="LG-G6-DEV/android_device_lge_msm8996-common" path="device/lge/msm8996-common" remote="github" revision="stagingAU" />
|
||||
<project name="LG-G6-DEV/android_kernel_lge_msm8996" path="kernel/lge/msm8996" remote="github" revision="Optimizing" />
|
||||
<project name="LG-G6-DEV/proprietary_vendor_lge" path="vendor/lge" remote="github" revision="new_audio" />
|
||||
</manifest>
|
||||
EOF
|
||||
repo sync
|
||||
|
||||
# Some h870 cherry picks
|
||||
croot
|
||||
cd frameworks/base/
|
||||
git remote add fixes https://github.com/BernardoBas/android_frameworks_base.git
|
||||
git fetch fixes
|
||||
# Phantom camera fixes
|
||||
git cherry-pick a904a84ad485d8768c7a523ec380696d573c9a9e 5a02ae0abfb2a341055aecbb46fb6ce3b24070cf
|
||||
# Sunrise/Sunset hardoded if location is not available
|
||||
git cherry-pick 2c9baf509fef40586cc07a8b3aed91bb3cc741b3
|
||||
croot
|
||||
cd device/lge/msm8996-common/
|
||||
git remote add brightness https://github.com/BernardoBas/android_device_lge_msm8996-common.git
|
||||
git fetch brightness
|
||||
# MIC LEVEL -- TODO
|
||||
git cherry-pick 9123565f56262e73dc6d613a0efc4bfb5867f5e6
|
||||
# ROUNDED CORNERS -- TODO
|
||||
git cherry-pick 5c490db56b5d2431bc21a35f865511a3ea86ca4a
|
||||
|
||||
|
||||
# If you want micro-g on Lineage, uncomment this part
|
||||
# Note: micro-g is already built-in with /e/
|
||||
# if [[ "${BUILD_FLAVOR}" == "lineage" ]]; then
|
||||
# croot
|
||||
# cd frameworks/base
|
||||
# curl https://raw.githubusercontent.com/lineageos4microg/docker-lineage-cicd/master/src/signature_spoofing_patches/android_frameworks_base-Q.patch > android_frameworks_base-Q.patch
|
||||
# patch -p1 -i android_frameworks_base-Q.patch
|
||||
# fi
|
||||
|
||||
if [[ "${BUILD_FLAVOR}" == "e" ]]; then
|
||||
# Remove some apps built with /e/, comment if you want to keep them
|
||||
croot
|
||||
# Remove MagicEarth (non-free)
|
||||
rm -r prebuilts/prebuiltapks/MagicEarth
|
||||
# Remove DemoApp
|
||||
rm -r prebuilts/prebuiltapks/DemoApp
|
||||
# Remove DroidGuard
|
||||
rm -r prebuilts/prebuiltapks/DroidGuard
|
||||
# Remove eDrive
|
||||
rm -r prebuilts/prebuiltapks/eDrive
|
||||
# Remove ESmsSync
|
||||
rm -r prebuilts/prebuiltapks/ESmsSync
|
||||
# Remove ESmsSync
|
||||
rm -r prebuilts/prebuiltapks/ESmsSync
|
||||
fi
|
||||
|
||||
# Build Lineage or /e/ (takes 2 to 3 hours!)
|
||||
croot
|
||||
make clean
|
||||
date | tee build.log; brunch h870 | tee build.log; date | tee build.log
|
||||
touch ~/BUILD_DONE
|
110
ovh_orchestrator/__init__.py
Normal file
110
ovh_orchestrator/__init__.py
Normal file
@ -0,0 +1,110 @@
|
||||
import uuid
|
||||
import sys
|
||||
import time
|
||||
|
||||
import ovh
|
||||
|
||||
from . import config
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
client = ovh.Client(
|
||||
endpoint=config.ovh_endpoint,
|
||||
application_key=config.ovh_application_key,
|
||||
application_secret=config.ovh_application_secret,
|
||||
consumer_key=config.ovh_consumer_key,
|
||||
)
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
sys.exit(1)
|
||||
|
||||
# Create VM
|
||||
if sys.argv[1] == 'init':
|
||||
# Get image id
|
||||
result = client.get(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/image',
|
||||
flavorType='s1-2',
|
||||
osType='linux',
|
||||
region=config.ovh_public_cloud_region,
|
||||
)
|
||||
image_id = next(
|
||||
x['id']
|
||||
for x in result
|
||||
if x['name'] == config.ovh_public_cloud_image
|
||||
)
|
||||
|
||||
# Get SSH key id
|
||||
result = client.get(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/sshkey',
|
||||
region=config.ovh_public_cloud_region,
|
||||
)
|
||||
ssh_key_id = next(
|
||||
x['id']
|
||||
for x in result
|
||||
if x['name'] == config.ovh_public_cloud_sshkey_name
|
||||
)
|
||||
|
||||
# Get flavor id
|
||||
result = client.get(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/flavor',
|
||||
region=config.ovh_public_cloud_region,
|
||||
)
|
||||
flavor_id = next(
|
||||
x['id']
|
||||
for x in result
|
||||
if x['name'] == 's1-2'
|
||||
)
|
||||
|
||||
# Create instance
|
||||
name = str(uuid.uuid4())
|
||||
result = client.post(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/instance',
|
||||
flavorId=flavor_id,
|
||||
imageId=image_id,
|
||||
monthlyBilling=False,
|
||||
name=name,
|
||||
region=config.ovh_public_cloud_region,
|
||||
sshKeyId=ssh_key_id
|
||||
)
|
||||
|
||||
if 'id' not in result:
|
||||
sys.exit(1)
|
||||
|
||||
# Wait for IP address
|
||||
while True:
|
||||
result = client.get(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/instance',
|
||||
region=config.ovh_public_cloud_region,
|
||||
)
|
||||
ipAddresses = next(
|
||||
x['ipAddresses']
|
||||
for x in result
|
||||
if x['name'] == name
|
||||
)
|
||||
if ipAddresses:
|
||||
print(ipAddresses[0])
|
||||
sys.exit(0)
|
||||
time.sleep(30)
|
||||
# Clear VM
|
||||
elif sys.argv[1] == 'purge':
|
||||
if len(sys.argv) < 3:
|
||||
sys.exit(1)
|
||||
|
||||
# Get instance id from its IP address
|
||||
result = client.get(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project + '/instance',
|
||||
region=config.ovh_public_cloud_region,
|
||||
)
|
||||
instance_id = next(
|
||||
x['id']
|
||||
for x in result
|
||||
if sys.argv[2] in x['ipAddresses']
|
||||
)
|
||||
|
||||
# Delete instance
|
||||
client.delete(
|
||||
'/cloud/project/' + config.ovh_public_cloud_project +
|
||||
'/instance/' + instance_id
|
||||
)
|
||||
else:
|
||||
sys.exit(1)
|
18
ovh_orchestrator/config.example.py
Normal file
18
ovh_orchestrator/config.example.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Create API credentials at https://eu.api.ovh.com/createToken/
|
||||
# See https://docs.ovh.com/fr/api/api-premiers-pas/#prerequis
|
||||
ovh_endpoint = 'ovh-eu'
|
||||
ovh_application_key = 'xxxxxxx'
|
||||
ovh_application_secret = 'xxxxxxx'
|
||||
ovh_consumer_key = 'xxxxxxx'
|
||||
|
||||
# Fill with ID of your public cloud project, found in the manager URI
|
||||
ovh_public_cloud_project = 'xxxxxxx'
|
||||
|
||||
ovh_public_cloud_region = 'SBG5'
|
||||
|
||||
# Fill with the name of your SSH key
|
||||
ovh_public_cloud_sshkey_name = 'xxx'
|
||||
|
||||
# These are tailored for Android builds at reasonable speed / cost
|
||||
ovh_public_cloud_image = 'Ubuntu 20.04'
|
||||
ovh_public_cloud_flavor = 'b2-30'
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
ovh
|
32
run.sh
Executable file
32
run.sh
Executable file
@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Install OVH orchestrator dependencies
|
||||
python3 -m venv .venv
|
||||
./.venv/bin/pip install -r requirements.txt
|
||||
|
||||
# Set up an OVH instance to run the build
|
||||
printf "%s" "Waiting for OVH instance ..."
|
||||
IP_ADDRESS=$(./.venv/bin/python3 -m ovh_orchestrator init)
|
||||
while ! timeout 0.2 ping -c 1 -n ${IP_ADDRESS} &> /dev/null
|
||||
do
|
||||
printf "%c" "."
|
||||
done
|
||||
|
||||
# Run the build on the OVH instance
|
||||
scp ./build_android.sh ubuntu@${IP_ADDRESS}:~
|
||||
ssh -f ubuntu@${IP_ADDRESS} 'screen -S build -dm bash ./build_android.sh'
|
||||
|
||||
# Wait for build to complete
|
||||
set +e
|
||||
printf "%s" "Building ..."
|
||||
until ssh ubuntu@${IP_ADDRESS} 'ls ~/BUILD_DONE'; do
|
||||
printf "%c" "."
|
||||
done
|
||||
set -e
|
||||
|
||||
# Fetch back the built images
|
||||
rsync -azr --progress ubuntu@${IP_ADDRESS}:~/android/lineage/out/target/product/h870/\*.{zip,md5sum,img} .
|
||||
|
||||
# Purge the OVH instance
|
||||
./.venv/bin/python3 -m ovh_orchestrator purge ${IP_ADDRESS}
|
Loading…
Reference in New Issue
Block a user