Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Letwory <jesterking>2020-09-23 12:19:49 +0300
committerJeroen Bakker <jeroen@blender.org>2020-09-23 12:23:10 +0300
commit782baa8f54bca659fdae60391147adbcad93d2bb (patch)
treefd93e6be101a4a828657a11e8df18ba80c1c72fc /release/windows/msix/create_msix_package.py
parentc3a0618fbffffffcf5abbeed8de3f19d8a401db1 (diff)
Windows Release: Script creation of MSIX package
Script create_msix_package.py will download the ZIP file from the given URL. It will create the MSIX package with the version number and publisher ID given. Strongly recommended are the path to a valid PFX file, and the password to use that PFX file. These are needed for signing the resulting MSIX package. The signing step is optional though, but the resulting MSIX package cannot be installed outside of the Microsoft Store Example set VERSION=2.83.2.0 set URL=https://download.blender.org/release/Blender2.83/blender-2.83.2-windows64.zip set PUBID=CN=PUBIDHERE set PFX=X:\path\to\cert.pfx set PFXPW=pwhere python create_msix_package.py --version %VERSION% --url %URL% --publisher %PUBID% --pfx %PFX% --password %PFXPW% Requirements: * Python default from the Microsoft Store should do (3.8) * requests can be installed with `pip install requests` Note that for an LTS release that gets uploaded to its own LTS application release in the store you need to specify the `--lts` switch on the command-line to the script. Upon completion there will be a file with the name blender-2.83.2.0-windows64.msix. In case PFX file and its password were given on the command line MSIX package will also be signed for the Microsoft Store. Related Wiki page: https://wiki.blender.org/wiki/Process/Release_On_Windows_Store Reviewed By: jbakker Maniphest Tasks: T77348, T79356 Differential Revision: https://developer.blender.org/D8310
Diffstat (limited to 'release/windows/msix/create_msix_package.py')
-rw-r--r--release/windows/msix/create_msix_package.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/release/windows/msix/create_msix_package.py b/release/windows/msix/create_msix_package.py
new file mode 100644
index 00000000000..69b0a2ef901
--- /dev/null
+++ b/release/windows/msix/create_msix_package.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import pathlib
+import requests
+import shutil
+import subprocess
+import zipfile
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--version", required=True, help="Version string in the form of 2.83.3.0")
+parser.add_argument("--url", required=True, help="Location of the release ZIP archive to download")
+parser.add_argument("--publisher", required=True, help="A string in the form of 'CN=PUBLISHER'")
+parser.add_argument("--pfx", required=False, help="Absolute path to the PFX file used for signing the resulting MSIX package")
+parser.add_argument("--password", required=False, default="blender", help="Password for the PFX file")
+parser.add_argument("--lts", required=False, help="If set this MSIX is for an LTS release", action='store_const', const=1)
+parser.add_argument("--skipdl", required=False, help="If set skip downloading of the specified URL as blender.zip. The tool assumes blender.zip exists", action='store_const', const=1)
+parser.add_argument("--leavezip", required=False, help="If set don't clean up the downloaded blender.zip", action='store_const', const=1)
+parser.add_argument("--overwrite", required=False, help="If set remove Content folder if it already exists", action='store_const', const=1)
+args = parser.parse_args()
+
+def execute_command(cmd : list, name : str, errcode : int):
+ """
+ Execute given command in cmd. Output is captured. If an error
+ occurs name is used to print ERROR message, along with stderr and
+ stdout of the process if either was captured.
+ """
+ cmd_process = subprocess.run(cmd, capture_output=True, encoding="UTF-8")
+ if cmd_process.returncode != 0:
+ print(f"ERROR: {name} failed.")
+ if cmd_process.stdout: print(cmd_process.stdout)
+ if cmd_process.stderr: print(cmd_process.stderr)
+ exit(errcode)
+
+LTSORNOT = ""
+PACKAGETYPE = ""
+if args.lts:
+ versionparts = args.version.split(".")
+ LTSORNOT = f" {versionparts[0]}.{versionparts[1]} LTS"
+ PACKAGETYPE = f"{versionparts[0]}.{versionparts[1]}LTS"
+
+blender_package_msix = pathlib.Path(".", f"blender-{args.version}-windows64.msix").absolute()
+content_folder = pathlib.Path(".", "Content")
+content_blender_folder = pathlib.Path(content_folder, "Blender").absolute()
+content_assets_folder = pathlib.Path(content_folder, "Assets")
+assets_original_folder = pathlib.Path(".", "Assets")
+
+local_blender_zip = pathlib.Path(".", "blender.zip")
+
+if args.pfx:
+ pfx_path = pathlib.Path(args.pfx)
+ if not pfx_path.exists():
+ print("ERROR: PFX file not found. Please ensure you give the correct path to the PFX file on the command-line.")
+ exit(1)
+ print(f"Creating MSIX package with signing using PFX file at {pfx_path}")
+else:
+ pfx_path = None
+ print("Creating MSIX package without signing.")
+
+msix_command = ["makeappx",
+ "pack",
+ "/h", "SHA256",
+ "/d", f"{content_folder.absolute()}",
+ "/p", f"{blender_package_msix}"
+ ]
+if pfx_path:
+ sign_command = ["signtool",
+ "sign",
+ "/fd", "sha256",
+ "/a", "/f", f"{pfx_path.absolute()}",
+ "/p", f"{args.password}",
+ f"{blender_package_msix}"
+ ]
+
+if args.overwrite:
+ if content_folder.joinpath("Assets").exists():
+ shutil.rmtree(content_folder)
+content_folder.mkdir(exist_ok=True)
+shutil.copytree(assets_original_folder, content_assets_folder)
+
+manifest_text = pathlib.Path("AppxManifest.xml.template").read_text()
+manifest_text = manifest_text.replace("[VERSION]", args.version)
+manifest_text = manifest_text.replace("[PUBLISHER]", args.publisher)
+manifest_text = manifest_text.replace("[LTSORNOT]", LTSORNOT)
+manifest_text = manifest_text.replace("[PACKAGETYPE]", PACKAGETYPE)
+pathlib.Path(content_folder, "AppxManifest.xml").write_text(manifest_text)
+
+if not args.skipdl:
+ print(f"Downloading blender archive {args.url} to {local_blender_zip}...")
+
+ with open(local_blender_zip, "wb") as download_zip:
+ response = requests.get(args.url)
+ download_zip.write(response.content)
+
+ print("... download complete.")
+else:
+ print("Skipping download")
+
+print(f"Extracting files from ZIP to {content_blender_folder}...")
+
+# Extract the files from the ZIP archive, but skip the leading part of paths
+# in the ZIP. We want to write the files to the content_blender_folder where
+# blender.exe ends up as ./Content/Blender/blender.exe, and not
+# ./Content/Blender/blender-2.83.3-windows64/blender.exe
+with zipfile.ZipFile(local_blender_zip, "r") as blender_zip:
+ for entry in blender_zip.infolist():
+ if entry.is_dir(): continue
+ entry_location = pathlib.Path(entry.filename)
+ target_location = content_blender_folder.joinpath(*entry_location.parts[1:])
+ pathlib.Path(target_location.parent).mkdir(parents=True, exist_ok=True)
+ extracted_entry = blender_zip.read(entry)
+ target_location.write_bytes(extracted_entry)
+
+print("... extraction complete.")
+
+
+
+print(f"Creating MSIX package using command: {' '.join(msix_command)}")
+
+# Remove MSIX file if it already exists. Otherwise the MakeAppX tool
+# will hang.
+if blender_package_msix.exists():
+ os.remove(blender_package_msix)
+execute_command(msix_command, "MakeAppX", 2)
+
+if args.pfx:
+ print(f"Signing MSIX package using command: {' '.join(sign_command)}")
+ execute_command(sign_command, "SignTool", 3)
+
+if not args.leavezip:
+ os.remove(local_blender_zip)
+shutil.rmtree(content_folder)
+
+print("Done.")