Support for debian packaging

This commit is contained in:
John Doty 2024-08-16 10:23:57 -07:00
parent f13139e79b
commit 940e573468
2 changed files with 73 additions and 20 deletions

View file

@ -1,12 +1,14 @@
[package] [package]
name = "fwd" name = "fwd"
version = "0.9.2" version = "0.9.2"
authors = ["John Doty <john@d0ty.me>"]
edition = "2021" edition = "2021"
license = "MIT" license = "MIT"
description = "Automatically forward ports to a remote server over ssh" description = "Automatically forward ports to a remote server"
readme = "README.md"
documentation = "https://github.com/DeCarabas/fwd"
homepage = "https://github.com/DeCarabas/fwd" homepage = "https://github.com/DeCarabas/fwd"
repository = "https://github.com/DeCarabas/fwd" repository = "https://github.com/DeCarabas/fwd"
readme = "README.md"
[[bin]] [[bin]]
name = "fwd-browse" name = "fwd-browse"
@ -41,3 +43,21 @@ procfs = "0.14.1"
[target.'cfg(target_family="unix")'.dependencies] [target.'cfg(target_family="unix")'.dependencies]
libc = "0.2.155" libc = "0.2.155"
[package.metadata.deb]
section = "net"
depends = [] # No auto deps?
assets = [
["target/release/fwd", "usr/bin/", "755"],
["LICENSE", "usr/share/doc/fwd/", "644"],
["README.md", "usr/share/doc/fwd/README", "644"],
# The man page is automatically generated by fwd's build process. See
# release.py for details.
["target/release/fwd.1", "usr/share/man/man1/fwd.1", "644"],
]
extended-description = """\
fwd enumerates the listening ports the remote server and automatically listens
for connections on the same ports on the local machine. When fwd receives a
connection on the local machine, it automatically forwards that connection to
the remote machine.
"""

View file

@ -5,6 +5,7 @@ little nicer for running commands, it's worse at everything else.
""" """
import dataclasses import dataclasses
import enum
import os import os
import os.path import os.path
import pathlib import pathlib
@ -18,14 +19,20 @@ if BUILD is None:
raise Exception("you *must* set the BUILD environment variable") raise Exception("you *must* set the BUILD environment variable")
class Archive(enum.Enum):
TARBALL = 1
ZIP = 2
DEB = 3
@dataclasses.dataclass @dataclasses.dataclass
class BuildSettings: class BuildSettings:
target: str target: str # The rust target to build for
test: bool = True test: bool = True # Whether or not to run tests
man_page: bool = True man_page: bool = True # Whether or not to generate a man page
strip: bool = True strip: bool = True # Whether or not to strip binaries
windows: bool = False archive: Archive = Archive.TARBALL # Archive type
ext: str = "" ext: str = "" # The file extension of the binary
print(f"doing release: {BUILD}") print(f"doing release: {BUILD}")
@ -33,6 +40,11 @@ build = {
"linux": BuildSettings( "linux": BuildSettings(
target="x86_64-unknown-linux-musl", target="x86_64-unknown-linux-musl",
), ),
"deb": BuildSettings(
target="x86_64-unknown-linux-musl",
test=False,
archive=Archive.DEB,
),
"macos": BuildSettings( "macos": BuildSettings(
target="x86_64-apple-darwin", target="x86_64-apple-darwin",
), ),
@ -43,7 +55,7 @@ build = {
target="x86_64-pc-windows-msvc", target="x86_64-pc-windows-msvc",
strip=False, strip=False,
man_page=False, man_page=False,
windows=True, archive=Archive.ZIP,
ext=".exe", ext=".exe",
), ),
}[BUILD] }[BUILD]
@ -100,29 +112,50 @@ def build_docs(staging: pathlib.Path):
f.write(contents) f.write(contents)
def build_archive(staging: pathlib.Path) -> pathlib.Path:
print("Creating archive...")
if build.archive == Archive.ZIP:
archive = pathlib.Path(f"{staging}.zip")
subprocess.run(["7z", "a", archive, f"{staging}"], check=True)
elif build.archive == Archive.DEB:
subprocess.run(["cargo", "install", "cargo-deb"], check=True)
shutil.copyfile(staging / "fwd.1", target_dir / "fwd.1")
subprocess.run(["cargo", "deb", "--target", build.target], check=True)
# Knowing the deb path means knowing the target version but I don't
# actually have the version here. (Or, like, I have the release tag
# but not in testing.) So just find the hopefully singular .deb that
# we made.
deb_path = pathlib.Path("target") / build.target / "debian"
archives = list(deb_path.glob("*.deb"))
assert len(archives) == 1
archive = archives[0]
else:
assert build.archive == Archive.TARBALL
archive = pathlib.Path(f"{staging}.tar.gz")
subprocess.run(["tar", "czf", archive, f"{staging}"], check=True)
return archive
staging = pathlib.Path(f"fwd-{build.target}") staging = pathlib.Path(f"fwd-{build.target}")
os.makedirs(staging, exist_ok=True) os.makedirs(staging, exist_ok=True)
build_and_test(staging) build_and_test(staging)
build_docs(staging) build_docs(staging)
archive = build_archive(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) shutil.rmtree(staging)
assert archive.exists()
if RELEASE_TAG is None: if RELEASE_TAG is None:
print("Not releasing to github, RELEASE_TAG is none.") print(f"Not releasing {archive} to github, RELEASE_TAG is none.")
else: else:
print(f"Uploading {archive} to github release {RELEASE_TAG}...") print(f"Uploading {archive} to github release {RELEASE_TAG}...")
subprocess.run( subprocess.run(
["gh", "release", "upload", RELEASE_TAG, archive, "--clobber"], ["gh", "release", "upload", RELEASE_TAG, archive, "--clobber"],
check=True, check=True,
) )
os.unlink(archive)
os.unlink(archive)