swimtracker-app/deploy-app.py

115 lines
3.8 KiB
Python

import subprocess
from distutils.version import StrictVersion
import paramiko
from scp import SCPClient
import os
from glob import glob
import tempfile
# --------------------------------------------- Config ----------------------------------------------------------
NODE_PATH = "/home/martin/node-v18.18.0-linux-x64/bin"
JDK8_PATH = "/usr/lib/jvm/java-11-openjdk-amd64/bin/"
PUBLIC_URL = "https://swimtracker.bauer.tech"
DEPLOY_HOST = "server"
DEPLOY_PATH = "/docker/web/volumes/static-sites/swimtracker"
APP_UPDATE_FOLDER = "app-update"
APP_FOLDER = "app"
# ---------------------------------------------------------------------------------------------------------------
def create_env_with_node_path():
env = os.environ.copy()
env["PATH"] = NODE_PATH + ":" + JDK8_PATH + ":" + env['PATH']
return env
def create_ssh_client(server, port, user):
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(server, port, user)
return client
def version_number_from_git(tag_prefix='release/', sha_length=10, version_format="{version}.dev{commits}+{sha}"):
def get_released_versions():
tags = sorted(subprocess.getoutput('git tag').split('\n'))
versions = [t[len(tag_prefix):]
for t in tags if t.startswith(tag_prefix)]
return versions
def tag_from_version(v):
return tag_prefix + v
def increment_version(v):
parsed_version = [int(i) for i in v.split('.')]
parsed_version[-1] += 1
return '.'.join(str(i) for i in parsed_version)
version_strings = get_released_versions()
version_strings.sort(key=StrictVersion)
latest_release = version_strings[-1]
commits_since_tag = subprocess.getoutput(
'git rev-list {}..HEAD --count'.format(tag_from_version(latest_release)))
sha = subprocess.getoutput('git rev-parse HEAD')[:sha_length]
is_dirty = len(subprocess.getoutput(
"git status --untracked-files=no -s")) > 0
if int(commits_since_tag) == 0:
version_string = latest_release
else:
next_version = increment_version(latest_release)
version_string = version_format.format(
version=next_version, commits=commits_since_tag, sha=sha)
if is_dirty:
version_string += ".dirty"
return version_string
#
env_with_node_path = create_env_with_node_path()
ssh = create_ssh_client(DEPLOY_HOST, 22, "root")
scp = SCPClient(ssh.get_transport())
android_idx_url = f"{PUBLIC_URL}/{APP_UPDATE_FOLDER}/android-index.json"
version_name = version_number_from_git()
def deploy_apk_update_files():
cmd = [f"expo", "export", "--public-url", f"{PUBLIC_URL}/{APP_UPDATE_FOLDER}"]
subprocess.check_call(cmd, env=env_with_node_path)
scp.put(glob('dist/*'), recursive=True,
remote_path=os.path.join(DEPLOY_PATH, APP_UPDATE_FOLDER))
def deploy_apk():
with tempfile.TemporaryDirectory() as tmpdirname:
apk_file = os.path.join(tmpdirname, "app.apk")
cmd = ["eas", "build", "--platform", "android", "--local", "--profile", "production", "--output", "app.apk"]
subprocess.check_call(cmd, env=env_with_node_path)
target_file = os.path.join(DEPLOY_PATH, APP_FOLDER, f"swimtracker-{version_name}.apk")
scp.put(apk_file, target_file)
def deploy_web():
cmd = [f"expo", "build:web"]
subprocess.check_call(cmd, env=env_with_node_path)
scp.put('web-build', recursive=True,
remote_path=os.path.join(DEPLOY_PATH, APP_FOLDER))
if __name__ == "__main__":
print("----------- Building Web ------------------")
deploy_web()
print("Deploying version {}", version_name)
print("----------- Exporting deploy files -----------")
deploy_apk_update_files()
print("----------- Building APK ------------------")
deploy_apk()