publish-scripts/ubuntu/buildDEB.py (71 lines of code) (raw):
#! /usr/bin/env python3
import os
import wget
import zipfile
import shutil
import datetime
from string import Template
from shared import constants
from shared import helper
# version used in url is provided from user input
# version used for packaging .deb package needs a slight modification
# for beta, change to tilde, so it will be placed before rtm versions in apt
# https://unix.stackexchange.com/questions/230911/what-is-the-meaning-of-the-tilde-in-some-debian-openjdk-package-version-string/230921
def returnDebVersion(version):
"""
Convert user-provided version into Debian package format.
Uses tilde (~) to ensure beta versions are correctly sorted before RTM versions.
"""
strlist = version.split('-')
if len(strlist) == 1:
return strlist[0]+"-1"
elif len(strlist) == 2:
return f"{strlist[0]}~{strlist[1]}-1"
else:
raise NotImplementedError
# depends on gzip, dpkg-deb, strip
@helper.restoreDirectory
def preparePackage():
"""
Prepares and builds a Debian package.
This includes setting up directories, copying necessary files,
generating SHA256 hashes, and building the final .deb package.
"""
os.chdir(constants.DRIVERROOTDIR)
debianVersion = returnDebVersion(constants.VERSION)
packageFolder = f"{constants.PACKAGENAME}_{debianVersion}"
buildFolder = os.path.join(os.getcwd(), constants.BUILDFOLDER, packageFolder)
helper.linuxOutput(buildFolder)
os.chdir(buildFolder)
document = os.path.join("usr", "share", "doc", constants.PACKAGENAME)
os.makedirs(document)
# Copy MIT copyright file
print("include MIT copyright")
scriptDir = os.path.abspath(os.path.dirname(__file__))
shutil.copyfile(os.path.join(scriptDir, "copyright"), os.path.join(document, "copyright"))
# Generate changelog file from template
with open(os.path.join(scriptDir, "changelog_template")) as f:
stringData = f.read() # read until EOF
t = Template(stringData)
# datetime example: Tue, 06 April 2018 16:32:31
time = datetime.datetime.utcnow().strftime("%a, %d %b %Y %X")
with open(os.path.join(document, "changelog.Debian"), "w") as f:
print(f"writing changelog with date utc: {time}")
f.write(t.safe_substitute(DEBIANVERSION=debianVersion, DATETIME=time, VERSION=constants.VERSION, PACKAGENAME=constants.PACKAGENAME))
# Compress changelog using gzip (by default gzip compress file in place)
helper.printReturnOutput(["gzip", "-9", "-n", os.path.join(document, "changelog.Debian")])
helper.chmodFolderAndFiles(os.path.join("usr", "share"))
debian = "DEBIAN"
os.makedirs(debian)
# Generate SHA256 hashes for all files in 'usr/'
print("trying to produce sha256 hashes")
with open('DEBIAN/sha256sums', 'w') as sha256file:
# iterate over all files under 'usr/' & get their sha256sum
for dirpath, _, filenames in os.walk('usr'):
for f in filenames:
filepath = os.path.join(dirpath, f)
if not os.path.islink(filepath):
h = helper.produceHashForfile(filepath, 'sha256', Upper=False)
sha256file.write(f"{h} {filepath}\n")
# Generate the control file with package dependencies from template
deps = []
for key, value in constants.LINUXDEPS.items():
entry = f"{key} ({value})"
deps.append(entry)
deps = ','.join(deps)
with open(os.path.join(scriptDir, "control_template")) as f:
stringData = f.read()
t = Template(stringData)
with open(os.path.join(debian, "control"), "w") as f:
print("trying to write control file")
f.write(t.safe_substitute(DEBIANVERSION=debianVersion, PACKAGENAME=constants.PACKAGENAME, DEPENDENCY=deps))
helper.chmodFolderAndFiles(debian)
# Generate post-install script
postinst = ''
with open(os.path.join(scriptDir, "postinst_template")) as f:
postinst = f.read()
with open(os.path.join(debian, "postinst"), "w") as f:
print("trying to write postinst file")
f.write(postinst)
# Ensure post-install script has correct permissions
# postinstall has to be 0755 in order for it to work.
os.chmod(os.path.join(debian, "postinst"), 0o755)
# Build the Debian package using dpkg-deb
os.chdir(constants.DRIVERROOTDIR)
output = helper.printReturnOutput(["fakeroot", "dpkg-deb", "--build", "-Zxz",
os.path.join(constants.BUILDFOLDER, packageFolder), os.path.join(constants.ARTIFACTFOLDER, packageFolder+".deb")])
assert(f"building package '{constants.PACKAGENAME}'" in output)