1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import dataclasses
import logging
import shutil
import subprocess
from datetime import datetime
from datetime import timezone
from pathlib import Path
LOG_FORMAT = '%(asctime)s %(levelname)s %(message)s'
logging.basicConfig(format=LOG_FORMAT, level=logging.DEBUG)
log = logging.getLogger()
ROOT_DIR = Path(__file__).resolve().parent.parent
BUILD_DIR = ROOT_DIR / 'debian_build'
DATE = datetime.now().strftime('%Y%m%d')
DATE_TIME = datetime.now(tz=timezone.utc).strftime('%a, %d %b %Y %T %z')
@dataclasses.dataclass
class ReleaseContext:
app: str
pkg_name: str
rev: str
release_name: str
release_dir: Path
tarball: Path
@classmethod
def from_tarball(cls, path: str, prefix: str, rev: str) -> ReleaseContext:
tarball = Path(path)
app = tarball.name.split('-', maxsplit=1)[0]
pkg_name = f'{prefix}{app}-nightly'
release_name = f'{pkg_name}_{DATE}'
release_dir = BUILD_DIR / release_name
return cls(app=app,
pkg_name=pkg_name,
rev=rev,
release_name=release_name,
release_dir=release_dir,
tarball=tarball)
def clean_build_dir() -> None:
log.info('Cleanup build directory')
if BUILD_DIR.exists():
shutil.rmtree(BUILD_DIR)
BUILD_DIR.mkdir()
def prepare_package_dir(context: ReleaseContext) -> None:
log.info('Extract tarball')
tarball = Path(shutil.copy(context.tarball, BUILD_DIR))
tarball = tarball.rename(BUILD_DIR / f'{context.release_name}.orig.tar.gz')
shutil.unpack_archive(tarball, BUILD_DIR)
log.info('Rename dir to: %s', context.release_name)
folder = list(BUILD_DIR.glob(f'{context.app}-?.?.?'))[0]
folder = folder.rename(context.release_dir)
log.info('Copy debian folder into release directory')
shutil.copytree(ROOT_DIR / 'debian', context.release_dir / 'debian')
def prepare_changelog(context: ReleaseContext) -> None:
log.info('Prepare Changelog')
changelog = context.release_dir / 'debian' / 'changelog'
content = changelog.read_text()
content = content.replace('{DATE}', f'{DATE}-{context.rev}')
content = content.replace('{DATE_TIME}', DATE_TIME)
changelog.write_text(content)
def build(context: ReleaseContext) -> None:
log.info('Start package build')
subprocess.run(
[
'dpkg-buildpackage',
'--no-sign'
],
cwd=context.release_dir,
check=True)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Build debian package')
parser.add_argument('tarball', help='Path to tarball e.g. app.tar.gz')
parser.add_argument('rev', help='The package revision e.g. 1')
parser.add_argument('--pkgprefix', default='', required=False,
help='Prefix for the package name e.g. python3-')
args = parser.parse_args()
context = ReleaseContext.from_tarball(args.tarball,
args.pkgprefix,
args.rev)
clean_build_dir()
prepare_package_dir(context)
prepare_changelog(context)
build(context)
|