diff --git a/Jenkinsfile b/Jenkinsfile index aab3c8e04f..ca927d5a78 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,6 +10,11 @@ pipeline { stage('Build') { steps { sh 'Tools/package_release_build.py -p windows mac linux' + } + } + stage('Update build info') { + steps { + sh 'Tools/gen_build_info.py' archiveArtifacts artifacts: 'release/*.zip' } } diff --git a/Tools/gen_build_info.py b/Tools/gen_build_info.py new file mode 100755 index 0000000000..ca1440f8af --- /dev/null +++ b/Tools/gen_build_info.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +# Generates build info and injects it into the server zip files. + +import hashlib +import json +import os +from zipfile import ZipFile, ZIP_DEFLATED + +FILES = { + "linux": "SS14.Client_Linux_x64.zip", + "windows": "SS14.Client_Windows_x64.zip", + "macos": "SS14.Client_macOS_x64.zip" +} + +SERVER_FILES = [ + "SS14.Server_Linux_x64.zip", + "SS14.Server_Windows_x64.zip", + "SS14.Server_macOS_x64.zip" +] + +FORK_ID = "wizards" + + +def main() -> None: + manifest = generate_manifest("release") + + for server in SERVER_FILES: + inject_manifest(os.path.join("release", server), manifest) + + +def inject_manifest(zip_path: str, manifest: str) -> None: + with ZipFile(zip_path, "a", compression=ZIP_DEFLATED) as z: + z.writestr("build.json", manifest) + + +def generate_manifest(dir: str) -> str: + # Env variables set by Jenkins. + + jenkins_base = f"{os.environ['BUILD_URL']}artifact/release/" + + version = os.environ["BUILD_NUMBER"] + downloads = {} + hashes = {} + + for platform, filename in FILES.items(): + downloads[platform] = f"{jenkins_base}{filename}" + hashes[platform] = sha256_file(os.path.join(dir, filename)) + + return json.dumps({"downloads": downloads, "hashes": hashes, "version": version, "fork_id": FORK_ID}) + + +def sha256_file(path: str) -> str: + with open(path, "rb") as f: + h = hashlib.sha256() + for b in iter(lambda: f.read(4096), b""): + h.update(b) + + return h.hexdigest() + + +if __name__ == '__main__': + main()