Release automation
There are a lot of steps in preparing the release and so I'm trying to make sure that we're in a place where I can iterate on it locally.
This commit is contained in:
parent
7a40326719
commit
9c9f7cfa82
1 changed files with 128 additions and 0 deletions
128
release.py
Normal file
128
release.py
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
"""A script to automate building and uploading a release archive.
|
||||
|
||||
This is in python instead of bash because I abhor bash. Even though it's a
|
||||
little nicer for running commands, it's worse at everything else.
|
||||
"""
|
||||
|
||||
import dataclasses
|
||||
import os
|
||||
import os.path
|
||||
import pathlib
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
RELEASE_TAG = os.getenv("RELEASE_TAG")
|
||||
|
||||
BUILD = os.getenv("BUILD")
|
||||
if BUILD is None:
|
||||
raise Exception("you *must* set the BUILD environment variable")
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class BuildSettings:
|
||||
target: str
|
||||
test: bool = True
|
||||
man_page: bool = True
|
||||
strip: bool = True
|
||||
windows: bool = False
|
||||
ext: str = ""
|
||||
|
||||
|
||||
print(f"doing release: {BUILD}")
|
||||
build = {
|
||||
"linux": BuildSettings(
|
||||
target="x86_64-unknown-linux-musl",
|
||||
),
|
||||
"macos": BuildSettings(
|
||||
target="x86_64-apple-darwin",
|
||||
),
|
||||
"arm-macos": BuildSettings(
|
||||
target="aarch64-apple-darwin",
|
||||
),
|
||||
"windows": BuildSettings(
|
||||
target="x86_64-pc-windows-msvc",
|
||||
strip=False,
|
||||
man_page=False,
|
||||
windows=True,
|
||||
ext=".exe",
|
||||
),
|
||||
}[BUILD]
|
||||
|
||||
print(f"settings: {build}")
|
||||
|
||||
|
||||
target_dir = pathlib.Path("target") / build.target / "release"
|
||||
bins = [(target_dir / bin).with_suffix(build.ext) for bin in ["fwd", "fwd-browse"]]
|
||||
|
||||
|
||||
def build_and_test(staging: pathlib.Path):
|
||||
# Tools
|
||||
subprocess.run(
|
||||
["rustup", "target", "add", build.target],
|
||||
check=True,
|
||||
)
|
||||
|
||||
# Test...?
|
||||
if build.test:
|
||||
subprocess.run(
|
||||
["cargo", "test", "--verbose", "--release", "--target", build.target],
|
||||
check=True,
|
||||
)
|
||||
|
||||
# Build
|
||||
subprocess.run(
|
||||
["cargo", "build", "--verbose", "--release", "--target", build.target],
|
||||
check=True,
|
||||
)
|
||||
|
||||
# Strip
|
||||
if build.strip:
|
||||
for bin in bins:
|
||||
subprocess.run(["strip", bin], check=True)
|
||||
|
||||
# Copy
|
||||
for bin in bins:
|
||||
shutil.copyfile(bin, os.path.join(staging, os.path.basename(bin)))
|
||||
|
||||
|
||||
def build_docs(staging: pathlib.Path):
|
||||
shutil.copyfile("README.md", staging / "README.md")
|
||||
if build.man_page:
|
||||
print("Creating man page...")
|
||||
proc = subprocess.run(
|
||||
["pandoc", "-s", "-tman", os.path.join("doc", "fwd.man.md")],
|
||||
check=True,
|
||||
capture_output=True,
|
||||
encoding="utf8",
|
||||
)
|
||||
contents = proc.stdout
|
||||
with open(staging / "fwd.1", "w", encoding="utf-8") as f:
|
||||
f.write(contents)
|
||||
|
||||
|
||||
staging = pathlib.Path(f"fwd-{build.target}")
|
||||
os.makedirs(staging, exist_ok=True)
|
||||
|
||||
build_and_test(staging)
|
||||
build_docs(staging)
|
||||
|
||||
print("Creating archive...")
|
||||
if build.windows:
|
||||
archive = f"{staging}.zip"
|
||||
subprocess.run(["7z", "a", archive, f"{staging}"], check=True)
|
||||
else:
|
||||
archive = f"{staging}.tar.gz"
|
||||
subprocess.run(["tar", "czf", archive, f"{staging}"], check=True)
|
||||
|
||||
shutil.rmtree(staging)
|
||||
|
||||
if RELEASE_TAG is None:
|
||||
print("Not releasing to github, RELEASE_TAG is none.")
|
||||
else:
|
||||
print(f"Uploading {archive} to github release {RELEASE_TAG}...")
|
||||
subprocess.run(
|
||||
["gh", "release", "upload", RELEASE_TAG, archive, "--clobber"],
|
||||
check=True,
|
||||
)
|
||||
|
||||
os.unlink(archive)
|
||||
Loading…
Add table
Add a link
Reference in a new issue