From 4212caa4c0b5e7271cf5db7a1f3454987dddfce4 Mon Sep 17 00:00:00 2001 From: Felipe Martin Date: Tue, 24 Sep 2019 13:15:39 +0200 Subject: [PATCH] Base builder --- .gitignore | 8 ++++ .pre-commit-config.yaml | 22 +++++++++ Dockerfile | 15 +++++++ README.md | 13 ++++++ build.py | 87 ++++++++++++++++++++++++++++++++++++ docker-build.sh | 13 ++++++ requirements-dev.txt | 5 +++ requirements.txt | 4 ++ setup.cfg | 16 +++++++ templates/PKGBUILD.base.j2 | 26 +++++++++++ templates/PKGBUILD.debian.j2 | 16 +++++++ 11 files changed, 225 insertions(+) create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 build.py create mode 100755 docker-build.sh create mode 100644 requirements-dev.txt create mode 100644 requirements.txt create mode 100644 setup.cfg create mode 100644 templates/PKGBUILD.base.j2 create mode 100644 templates/PKGBUILD.debian.j2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..424e859 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.vscode +.venv + +# Python +*.pyc + +# Debian builds +*.deb diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5586db7 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.2.3 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: flake8 + +- repo: https://github.com/asottile/seed-isort-config + rev: v1.9.2 + hooks: + - id: seed-isort-config +- repo: https://github.com/pre-commit/mirrors-isort + rev: v4.3.20 + hooks: + - id: isort + +- repo: https://github.com/ambv/black + rev: stable + hooks: + - id: black + language_version: python3.7 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..74c4c7b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM archlinux/base:latest +LABEL MAINTAINER "Felipe Martin " + +COPY requirements.txt /tmp/requirements.txt + +RUN pacman -Syu --noconfirm python python-pip base-devel && \ + pip install -r /tmp/requirements.txt && \ + useradd builder + +USER builder + +COPY build.py /tmp/build.py +WORKDIR /tmp + +CMD ["python", "/tmp/build.py"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..10c57cb --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# AUR Synology Drive Builder + +[![AUR Synology Drive](https://img.shields.io/badge/AUR-synology--drive-green.svg)](https://aur.archlinux.org/packages/synology-drive/) + +Simple script to generate the AUR builds for the Synology Drive software. + +## Usage + +``` +./docker-build.sh VERSION BUILD_NUMBER +``` + +This will generate a new folder in the builds folder with the _PKGBUILD_ and _.SRCINFO_ files which are the required files to create an AUR package. diff --git a/build.py b/build.py new file mode 100644 index 0000000..0d9a72c --- /dev/null +++ b/build.py @@ -0,0 +1,87 @@ +import os +import hashlib +import subprocess +from pathlib import Path + +import toml +import huepy +import requests +from jinja2 import Environment, FileSystemLoader + +PACKAGE_NAME = os.environ["PACKAGE_NAME"] +BUILDS_PATH = Path(f"/tmp/{PACKAGE_NAME}/builds") +PACKAGE_FILE = f"/tmp/{PACKAGE_NAME}/package.toml" + +package = toml.load(PACKAGE_FILE) +print( + huepy.run( + f'Building {PACKAGE_NAME} v{package["version"]}-{package["build_number"]}' + ) +) + +if os.path.isdir(BUILDS_PATH / Path(f"{package['version']}-{package['build_number']}")): + print( + huepy.bad( + f"{PACKAGE_NAME} {package['version']}-{package['build_number']} is already present." + ) + ) + exit(1) + + +def md5sum(url): + response = requests.get(url, stream=True) + hash_md5 = hashlib.md5() + for chunk in response.iter_content(chunk_size=512): + hash_md5.update(chunk) + return hash_md5.hexdigest() + + +class DebianBuilder: + template = "PKGBUILD.debian.j2" + + def update_package_definition(self, package): + if "i686" in package["arch"]: + source_i686 = package["sources"]["i686"]["url"].format(**package) + package["sources"]["i686"]["url"] = source_i686 + package["sources"]["i686"]["md5sum"] = md5sum(source_i686) + + if "x86_64" in package["arch"]: + source_x86_64 = package["sources"]["x86_64"]["url"].format(**package) + package["sources"]["x86_64"]["url"] = source_x86_64 + package["sources"]["x86_64"]["md5sum"] = md5sum(source_x86_64) + + +BUILDERS = {"debian": DebianBuilder} + +print(huepy.run(f"Using {package['builder']} builder")) +builder = BUILDERS[package["builder"]]() +builder.update_package_definition(package) + +print(huepy.run("Generating PKGBUILD")) +env = Environment( + loader=FileSystemLoader(["templates", f"/tmp/{PACKAGE_NAME}"]), trim_blocks=True +) +if not os.path.isfile(f"/tmp/{PACKAGE_NAME}/PKGBUILD"): + pkgbuild_template = env.get_template(builder.template) +else: + print(huepy.info("Using package-specific template")) + pkgbuild_template = env.get_template("PKGBUILD") +pkgbuild = pkgbuild_template.render(**package) + +build_path = BUILDS_PATH / Path("{version}-{build_number}".format(**package)) +os.makedirs(build_path, exist_ok=True) + +print(huepy.info(f"Writing PKGBUILD file...")) +with open("%s/PKGBUILD" % build_path, "w") as handler: + handler.write(pkgbuild) + +print(huepy.info("Wiring .SRCINFO file...")) +result = subprocess.run( + "makepkg --printsrcinfo > .SRCINFO", shell=True, cwd=build_path, capture_output=True +) +if result.returncode != 0: + print(huepy.bad("Error writing .SRCINFO file")) + print(result.stderr) + print(result.stdout) + +print(huepy.good("Build finished")) diff --git a/docker-build.sh b/docker-build.sh new file mode 100755 index 0000000..864f0c2 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,13 @@ +#!/bin/bash -xe + +NAME=$1 + +docker build -t aur-package-builder . + +clear + +docker run -it --rm \ + -e PACKAGE_NAME="$NAME" \ + -v "$PWD/$NAME:/tmp/$NAME" \ + -v "$PWD/templates:/tmp/templates" \ + aur-package-builder diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..e0c4539 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +-r requirements.txt +black +flake8 +isort +pre-commit diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c5465a7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +jinja2 +requests +toml +huepy diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..37ecfce --- /dev/null +++ b/setup.cfg @@ -0,0 +1,16 @@ +[flake8] +ignore = E203, E266, E501, W503, F403 +max-line-length = 88 +max-complexity = 18 +select = B,C,E,F,W,T4,B9 + +[isort] +use_parentheses = True +multi_line_output = 3 +include_trailing_comma = True +length_sort = 1 +lines_between_types = 0 +line_length = 88 +known_third_party = huepy,jinja2,requests,toml +sections = FUTURE, STDLIB, DJANGO, THIRDPARTY, FIRSTPARTY, LOCALFOLDER +no_lines_before = LOCALFOLDER diff --git a/templates/PKGBUILD.base.j2 b/templates/PKGBUILD.base.j2 new file mode 100644 index 0000000..b640b9f --- /dev/null +++ b/templates/PKGBUILD.base.j2 @@ -0,0 +1,26 @@ +# Maintainer: Felipe Martin + +pkgname="{{ name }}" +pkgver="{{ version }}" +pkgrel="{{ build_number }}" +pkgdesc="{{ description }}" +arch=('{{ arch|join("' '") }}') +url="{{ url }}" +license=('{{ license }}') +depends=('{{ depends|join("' '") }}') +optdepends=('{{ optdepends|join("' '") }}') +conflicts=('{{ conflicts|join("' '") }}') +source=() +md5sums=() + +{% if "i686" in arch %} +source_i686=({{ sources.i686.url }}) +md5sums_i686=('{{ sources.i686.md5sum }}') +{% endif %} + +{% if "x86_64" in arch %} +source_x86_64=({{ sources.x86_64.url }}) +md5sums_x86_64=('{{ sources.x86_64.md5sum }}') +{% endif %} + +{% block operations%}{% endblock %} diff --git a/templates/PKGBUILD.debian.j2 b/templates/PKGBUILD.debian.j2 new file mode 100644 index 0000000..792d601 --- /dev/null +++ b/templates/PKGBUILD.debian.j2 @@ -0,0 +1,16 @@ +{% extends "PKGBUILD.base.j2" %} + +{% block operations %} +prepare() { + cd "$srcdir" + mkdir -p data + ar x {{ name }}-* + xz -d data.tar.xz + tar xf data.tar --directory data +} + +package() { + cp -r "$srcdir/data/opt" "$pkgdir/opt" + cp -r "$srcdir/data/usr" "$pkgdir/usr" +} +{% endblock %}