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