peach-package-builder/peach_package_builder/build_go_sbot.py

113 lines
4.0 KiB
Python

"""
script to create debian packages for cross-compiled go binaries for go-sbot
based off of this post
https://unix.stackexchange.com/questions/627689/how-to-create-a-debian-package-from-a-bash-script-and-a-systemd-service
"""
import subprocess
import argparse
import re
import shutil
import sys
from packaging import version as pversion
from peach_package_builder.constants import *
from peach_package_builder.utils import render_template, add_deb_to_freight, update_freight_cache
# manually update this version when we want to build a new peach-go-sbot package
GO_SBOT_VERSION = '0.1.25'
# constants
DEB_CONF_DIR = os.path.join(PROJECT_PATH, 'conf/templates/go_sbot')
DEB_BUILD_DIR = "/tmp/go_sbot"
GO_SSB_DIR = "/srv/peachcloud/automation/go-ssb"
def crosscompile_go_sbot():
subprocess.check_call(["git", "pull"], cwd=GO_SSB_DIR)
print("[CROSS-COMPILING sbotcli]")
subprocess.check_call(["env", "GOOS=linux", "GOARCH=arm64", "go", "build", "./cmd/sbotcli"], cwd=GO_SSB_DIR)
print("[CROSS-COMPILING go-sbot]")
subprocess.check_call(["env", "GOOS=linux", "GOARCH=arm64", "go", "build", "./cmd/go-sbot"], cwd=GO_SSB_DIR)
def package_go_sbot(version):
print("[ PACKAGING go-sbot ]")
# copy debian conf files into correct locations in package build directory
DEBIAN_SRC_DIR = os.path.join(DEB_CONF_DIR, 'DEBIAN')
DEBIAN_DEST_DIR = os.path.join(DEB_BUILD_DIR, 'DEBIAN')
os.makedirs(DEBIAN_DEST_DIR)
maintainer_scripts = ['postinst', 'postrm', 'prerm']
for script in maintainer_scripts:
src = os.path.join(DEBIAN_SRC_DIR, script)
dest = os.path.join(DEBIAN_DEST_DIR, script)
shutil.copyfile(src, dest)
subprocess.check_call(["chmod", "775", dest])
# copy control file putting in correct version number
src = os.path.join("go_sbot/DEBIAN/control")
dest = os.path.join(DEBIAN_DEST_DIR, "control")
render_template(src=src, dest=dest, template_vars={"version": version})
# copy systemd service file
SERVICE_DIR = os.path.join(DEB_BUILD_DIR, 'lib/systemd/system')
os.makedirs(SERVICE_DIR)
shutil.copyfile(
os.path.join(DEB_CONF_DIR, 'go-sbot.service'),
os.path.join(SERVICE_DIR, 'go-sbot.service')
)
# copy go-sbot config.toml
SBOT_CONFIG_DIR = os.path.join(DEB_BUILD_DIR, 'home/peach/.ssb-go')
os.makedirs(SBOT_CONFIG_DIR)
shutil.copyfile(
os.path.join(DEB_CONF_DIR, 'config.toml'),
os.path.join(SBOT_CONFIG_DIR, 'config.toml')
)
# copy cross-compiled binaries
GO_BINARIES = ['go-sbot', 'sbotcli']
BIN_DIR = os.path.join(DEB_BUILD_DIR, 'usr/bin')
os.makedirs(BIN_DIR)
for go_binary in GO_BINARIES:
destination = os.path.join(BIN_DIR, go_binary)
shutil.copyfile(
os.path.join(os.path.join(GO_SSB_DIR), go_binary),
destination
)
subprocess.check_call(["chmod", "770", destination])
# create deb package
deb_file_name = "go-sbot_{}_arm64.deb".format(version)
print("[ CREATING {}]".format(deb_file_name))
subprocess.check_call(["dpkg-deb", "-b", ".", deb_file_name], cwd=DEB_BUILD_DIR)
# copy deb package to MICROSERVICES_DEB_DIR
deb_path = os.path.join(DEB_BUILD_DIR, deb_file_name)
subprocess.check_call(["cp", deb_path, MICROSERVICES_DEB_DIR])
# add deb package to freight
add_deb_to_freight(package_name=deb_file_name, package_path=deb_path)
# update freight cache
update_freight_cache()
def build_go_sbot():
# gets the most recently built go_sbot version, and increments the micro-number by 1
version = GO_SBOT_VERSION
print("[ BUILDING GO-SBOT VERSION {}]".format(version))
# delete build directory if it already exists or create it
subprocess.check_call(["rm", "-rf", DEB_BUILD_DIR])
if not os.path.exists(DEB_BUILD_DIR):
os.makedirs(DEB_BUILD_DIR)
# cross-compile and package go-sbot with new version number
crosscompile_go_sbot()
package_go_sbot(version=version)
if __name__ == '__main__':
build_go_sbot()