115 lines
3.8 KiB
Python
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()
|