From 026cc85dbb8f2ab6a8671453935e50f6071df428 Mon Sep 17 00:00:00 2001 From: qstokkink Date: Fri, 2 Aug 2024 11:39:49 +0200 Subject: [PATCH] WIP: Updated builders to use GitHub Actions --- .github/workflows/build.yml | 72 +++++++++++++++++++++++++++++++++ build/debian/makedist_debian.sh | 27 ++----------- build/debian/update_metainfo.py | 49 ++++++---------------- build/update_version.py | 47 --------------------- requirements-build.txt | 20 ++------- 5 files changed, 92 insertions(+), 123 deletions(-) create mode 100644 .github/workflows/build.yml delete mode 100644 build/update_version.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..2d45ccb5ac --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,72 @@ +name: Build +on: pull_request # TODO: Only run on workflow_dispatch +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest] # TODO: Run all [macos-12, ubuntu-latest, windows-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Check-out repository + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-tags: 'true' + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + cache: 'pip' + cache-dependency-path: | + **/requirements-build.txt + - name: Install Dependencies + run: | + pip install --upgrade -r requirements-build.txt + - name: Setup npm + uses: actions/setup-node@v4 + - name: Build npm + run: | + cd src/tribler/ui/ + npm install + npm run build + - name: Determine tag + run: | + git fetch --tags + git for-each-ref --count=1 --sort=-creatordate --format '%(refname)' refs/tags > raw_tag.txt + echo "GITHUB_TAG=$(git name-rev --tags --name-only $(cat raw_tag.txt))" >> $GITHUB_ENV + - name: Prepare version + shell: python + env: + GITHUB_REF: ${{ vars.GITHUB_SHA }} + GITHUB_TAG: ${{ env.GITHUB_TAG }} + run: | + from os import getenv + from time import ctime + print(f'Writing version ({getenv("GITHUB_SHA")}, {getenv("GITHUB_TAG")})') + with open("src/tribler/core/version.py", "w") as version_py: + version_py.write(f'version_id = "{getenv("GITHUB_TAG")}"\n') + version_py.write(f'build_date = "{ctime()}"\n') + version_py.write(f'commit_id = "{getenv("GITHUB_SHA")}"\n') + - name: Build Executables (Ubuntu) + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get install -y --allow-downgrades alien cpio=2.13+dfsg-7 devscripts fakeroot libgirepository1.0-dev rpm libayatana-appindicator3-dev gir1.2-ayatanaappindicator3-0.1 gir1.2-appindicator3-0.1 + ./build/debian/makedist_debian.sh + - name: Build Executables (MacOS-12) + if: matrix.os == 'macos-12' + run: | + ./build/mac/makedist_macos.sh + - name: Build Executables (Windows) + if: matrix.os == 'windows-latest' + run: | + ./build/win/makedist_win.bat + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: ${{ runner.os }} Build + path: | + build/debian/*.deb + dist/* + # ^^^^^^ DEBUG CRASH diff --git a/build/debian/makedist_debian.sh b/build/debian/makedist_debian.sh index 70e7f884a0..1918ede09e 100755 --- a/build/debian/makedist_debian.sh +++ b/build/debian/makedist_debian.sh @@ -2,32 +2,15 @@ set -x # print all commands set -e # exit when any command fails -LOG_LEVEL=${LOG_LEVEL:-"DEBUG"} - -if [[ ! -d build/debian ]]; then - echo "Please run this script from project root as:\n./build/debian/makedist_debian.sh" -fi - rm -rf build/tribler rm -rf dist/tribler rm -rf build/debian/tribler/usr/share/tribler -if [ ! -z "$VENV" ]; then - echo "Setting venv to $VENV" - source $VENV/bin/activate -else - echo "Creating a new venv" - python3 -m venv build-env - . ./build-env/bin/activate -fi - # ----- Install dependencies before the build -python3 -m pip install --upgrade pip -python3 -m pip install --upgrade -r requirements-build.txt +python3 -m pip install --upgrade PyGObject # ----- Update version -python3 ./build/update_version.py -r . -python3 ./build/debian/update_metainfo.py -r . +python3 ./build/debian/update_metainfo.py # ----- Build UI pushd . @@ -43,12 +26,10 @@ python3 setup.py build # ----- Build dpkg cp -r ./dist/tribler ./build/debian/tribler/usr/share/tribler -TRIBLER_VERSION=$(head -n 1 .TriblerVersion) # read the first line only - # Compose the changelog cd ./build/debian/tribler -dch -v $TRIBLER_VERSION "New release" -dch -v $TRIBLER_VERSION "See https://github.com/Tribler/tribler/releases/tag/$TRIBLER_VERSION for more info" +dch -v $GITHUB_TAG "New release" +dch -v $GITHUB_TAG "See https://github.com/Tribler/tribler/releases/tag/$GITHUB_TAG for more info" dpkg-buildpackage -b -rfakeroot -us -uc diff --git a/build/debian/update_metainfo.py b/build/debian/update_metainfo.py index 114623e154..b48733c80d 100644 --- a/build/debian/update_metainfo.py +++ b/build/debian/update_metainfo.py @@ -1,37 +1,12 @@ -import logging -import time -import xml.etree.ElementTree as xml -from argparse import ArgumentParser -from pathlib import Path - -import defusedxml.ElementTree as defxml - -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - - -def parse_arguments(): - parser = ArgumentParser(description='Update Tribler metainfo.xml') - parser.add_argument('-r', '--repo', type=str, help='path to a repository folder', default='.') - return parser.parse_args() - - -if __name__ == '__main__': - arguments = parse_arguments() - - version = Path('.TriblerVersion').read_text().lstrip('v').rstrip('\n') - - release_info = { - 'version': version, - 'date': time.strftime("%Y-%m-%d", time.localtime()) - } - - logger.info(f'Release info: {release_info}') - metainfo_xml = Path(arguments.repo) / 'build/debian/tribler/usr/share/metainfo/org.tribler.Tribler.metainfo.xml' - - xml_dom = defxml.parse(metainfo_xml) - releases = xml_dom.getroot().find('releases') - release = xml.SubElement(releases, 'release', release_info) - - xml_dom.write(metainfo_xml, encoding='utf-8', xml_declaration=True) - logger.info(f'Content of metainfo.xml: {metainfo_xml.read_text()}') +from os import getenv +from time import localtime, strftime +from xml.etree.ElementTree import SubElement, parse + +if __name__ == "__main__": + metainfo_xml = "build/debian/tribler/usr/share/metainfo/org.tribler.Tribler.metainfo.xml" + tree = parse(metainfo_xml) + root = tree.getroot() + releases_tag = root.find("releases") + releases_tag.append(SubElement(releases_tag, "release", {"version": getenv("GITHUB_TAG"), + "date": strftime("%Y-%m-%d", localtime())})) + tree.write(metainfo_xml, encoding="utf-8", xml_declaration=True) diff --git a/build/update_version.py b/build/update_version.py deleted file mode 100644 index 198cca051f..0000000000 --- a/build/update_version.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging -import os -from argparse import ArgumentParser -from pathlib import Path -from time import ctime - -logger = logging.getLogger(__name__) -logging.basicConfig(level=logging.INFO) - - -def parse_arguments(): - parser = ArgumentParser(description='Update Tribler Version') - parser.add_argument('-r', '--repo', type=str, help='path to a repository folder', default='.') - return parser.parse_args() - - -if __name__ == '__main__': - arguments = parse_arguments() - logger.info(f'Arguments: {arguments}') - - ref_name = Path('.TriblerVersion').read_text().rstrip('\n') - logger.info(f'Tribler tag: {ref_name}') - - commit = Path('.TriblerCommit').read_text().rstrip('\n') - logger.info(f'Git Commit: {commit}') - - build_time = ctime() - logger.info(f'Build time: {build_time}') - - sentry_url = os.environ.get('SENTRY_URL', None) - logger.info(f'Sentry URL (hash): {hash(sentry_url)}') - if sentry_url is None: - logger.critical('Sentry url is not defined. To define sentry url use:' - 'EXPORT SENTRY_URL=\n' - 'If you want to disable sentry, then define the following:' - 'EXPORT SENTRY_URL=') - exit(1) - - version_py = Path(arguments.repo) / 'src/tribler/core/version.py' - logger.info(f'Write info to: {version_py}') - version_py.write_text( - f'version_id = "{ref_name}"\n' - f'build_date = "{build_time}"\n' - f'commit_id = "{commit}"\n' - f'sentry_url = "{sentry_url}"\n' - ) - diff --git a/requirements-build.txt b/requirements-build.txt index cf088a6f22..0a9dca929f 100644 --- a/requirements-build.txt +++ b/requirements-build.txt @@ -1,19 +1,7 @@ -# These are specific versions of the packages that are used for making the build work. -# These are installed before other dependencies. -PyQt5==5.15.10 -PyQt5-sip==12.13.0 -pyqtgraph==0.13.3 - -r requirements.txt -cx_Freeze==7.0.0; sys_platform != 'darwin' -PyInstaller==6.6.0; sys_platform == 'darwin' - -setuptools==65.5.1; sys_platform == 'darwin' -text-unidecode==1.3; sys_platform == 'darwin' - -defusedxml==0.7.1; sys_platform == 'linux2' or sys_platform == 'linux' -markupsafe==2.0.1; sys_platform == 'linux2' or sys_platform == 'linux' -PyGObject==3.44.1; sys_platform == 'linux2' or sys_platform == 'linux' +cx_Freeze; sys_platform != 'darwin' +PyInstaller; sys_platform == 'darwin' -requests==2.31.0 +setuptools +requests