2020-02-12 21:55:44 +03:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
def yv(v, depth=0):
|
2020-02-12 21:55:44 +03:00
|
|
|
if v is True:
|
|
|
|
return "true"
|
|
|
|
if v is False:
|
|
|
|
return "false"
|
|
|
|
if v is None:
|
|
|
|
return "nil"
|
|
|
|
|
|
|
|
if isinstance(v, str):
|
|
|
|
if "\n" in v:
|
2021-09-21 16:24:52 +03:00
|
|
|
indent = " " * depth
|
|
|
|
result = ""
|
|
|
|
for l in v.splitlines():
|
|
|
|
result = result + "\n" + (f"{indent}{l}" if l else "")
|
|
|
|
return "|" + result
|
2021-12-06 20:12:25 +03:00
|
|
|
# This is hideous
|
|
|
|
if '"' in v:
|
|
|
|
return "'" + v + "'"
|
2020-02-12 21:55:44 +03:00
|
|
|
return '"' + v + '"'
|
|
|
|
|
|
|
|
return v
|
|
|
|
|
|
|
|
|
|
|
|
class Step(object):
|
2021-09-21 16:24:52 +03:00
|
|
|
def render(self, f, env, depth=0):
|
2020-02-12 21:55:44 +03:00
|
|
|
raise NotImplementedError(repr(self))
|
|
|
|
|
|
|
|
|
|
|
|
class RunStep(Step):
|
2021-11-22 21:27:14 +03:00
|
|
|
def __init__(self, name, run, shell="bash", env=None):
|
2020-02-12 21:55:44 +03:00
|
|
|
self.name = name
|
|
|
|
self.run = run
|
|
|
|
self.shell = shell
|
2021-11-22 21:27:14 +03:00
|
|
|
self.env = env
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
def render(self, f, env, depth=0):
|
|
|
|
indent = " " * depth
|
|
|
|
f.write(f"{indent}- name: {yv(self.name)}\n")
|
2021-11-22 21:27:14 +03:00
|
|
|
if self.env:
|
|
|
|
f.write(f"{indent} env:\n")
|
|
|
|
for k, v in self.env.items():
|
|
|
|
f.write(f"{indent} {k}: {v}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.shell:
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} shell: {self.shell}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
run = self.run
|
|
|
|
|
|
|
|
if env:
|
|
|
|
for k, v in env.items():
|
2021-01-30 23:34:54 +03:00
|
|
|
if self.shell == "bash":
|
2020-02-12 21:55:44 +03:00
|
|
|
run = f"export {k}={v}\n{run}\n"
|
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} run: {yv(run, depth + 2)}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
class ActionStep(Step):
|
2021-09-21 16:17:23 +03:00
|
|
|
def __init__(self, name, action, params=None, env=None, condition=None):
|
2020-02-12 21:55:44 +03:00
|
|
|
self.name = name
|
|
|
|
self.action = action
|
|
|
|
self.params = params
|
|
|
|
self.env = env
|
2021-09-21 16:17:23 +03:00
|
|
|
self.condition = condition
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
def render(self, f, env, depth=0):
|
|
|
|
indent = " " * depth
|
|
|
|
f.write(f"{indent}- name: {yv(self.name)}\n")
|
|
|
|
f.write(f"{indent} uses: {self.action}\n")
|
2021-09-21 16:17:23 +03:00
|
|
|
if self.condition:
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} if: {self.condition}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.params:
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} with:\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
for k, v in self.params.items():
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} {k}: {yv(v, depth + 3)}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.env:
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} env:\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
for k, v in self.env.items():
|
2021-09-21 16:24:52 +03:00
|
|
|
f.write(f"{indent} {k}: {yv(v, depth + 3)}\n")
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
class CacheStep(ActionStep):
|
|
|
|
def __init__(self, name, path, key):
|
|
|
|
super().__init__(
|
2021-11-29 05:10:08 +03:00
|
|
|
name, action="actions/cache@v2.1.7", params={"path": path, "key": key}
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class CheckoutStep(ActionStep):
|
2021-12-08 21:19:00 +03:00
|
|
|
def __init__(self, name="checkout repo", submodules=True):
|
|
|
|
params = {}
|
|
|
|
if submodules:
|
|
|
|
params["submodules"] = "recursive"
|
|
|
|
super().__init__(name, action="actions/checkout@v2", params=params)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
class Job(object):
|
|
|
|
def __init__(self, runs_on, container=None, steps=None, env=None):
|
|
|
|
self.runs_on = runs_on
|
|
|
|
self.container = container
|
|
|
|
self.steps = steps
|
|
|
|
self.env = env
|
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
def render(self, f, depth=0):
|
2020-02-12 21:55:44 +03:00
|
|
|
for s in self.steps:
|
2021-09-21 16:24:52 +03:00
|
|
|
s.render(f, self.env, depth)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
class Target(object):
|
|
|
|
def __init__(
|
|
|
|
self,
|
|
|
|
name=None,
|
|
|
|
os="ubuntu-latest",
|
|
|
|
container=None,
|
|
|
|
bootstrap_git=False,
|
|
|
|
rust_target=None,
|
2020-05-03 21:21:58 +03:00
|
|
|
continuous_only=False,
|
|
|
|
app_image=False,
|
2020-02-12 21:55:44 +03:00
|
|
|
):
|
|
|
|
if not name:
|
|
|
|
if container:
|
|
|
|
name = container
|
|
|
|
else:
|
|
|
|
name = os
|
|
|
|
self.name = name.replace(":", "")
|
|
|
|
self.os = os
|
|
|
|
self.container = container
|
|
|
|
self.bootstrap_git = bootstrap_git
|
|
|
|
self.rust_target = rust_target
|
2020-05-03 21:21:58 +03:00
|
|
|
self.continuous_only = continuous_only
|
|
|
|
self.app_image = app_image
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def uses_yum(self):
|
|
|
|
if "fedora" in self.name:
|
|
|
|
return True
|
|
|
|
if "centos" in self.name:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
2020-05-03 21:21:58 +03:00
|
|
|
def uses_apt(self):
|
|
|
|
if "ubuntu" in self.name:
|
|
|
|
return True
|
|
|
|
if "debian" in self.name:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
2020-05-04 02:16:52 +03:00
|
|
|
def needs_sudo(self):
|
|
|
|
if not self.container and self.uses_apt():
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
|
|
def install_system_package(self, name):
|
|
|
|
installer = None
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.uses_yum():
|
2020-05-04 02:16:52 +03:00
|
|
|
installer = "yum"
|
|
|
|
elif self.uses_apt():
|
|
|
|
installer = "apt-get"
|
|
|
|
else:
|
|
|
|
return []
|
|
|
|
if self.needs_sudo():
|
|
|
|
installer = f"sudo -n {installer}"
|
|
|
|
return [RunStep(f"Install {name}", f"{installer} install -y {name}")]
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2020-05-03 21:21:58 +03:00
|
|
|
def install_curl(self):
|
2020-05-04 02:16:52 +03:00
|
|
|
if self.uses_yum() or (self.uses_apt() and self.container):
|
|
|
|
return self.install_system_package("curl")
|
|
|
|
return []
|
2020-05-03 21:21:58 +03:00
|
|
|
|
2021-09-27 05:30:50 +03:00
|
|
|
def install_openssh_server(self):
|
|
|
|
if self.uses_yum() or (self.uses_apt() and self.container):
|
2021-12-06 19:11:26 +03:00
|
|
|
return [
|
|
|
|
RunStep("Ensure /run/sshd exists", "mkdir -p /run/sshd")
|
|
|
|
] + self.install_system_package("openssh-server")
|
2021-09-27 05:30:50 +03:00
|
|
|
return []
|
|
|
|
|
2021-08-20 07:22:36 +03:00
|
|
|
def install_newer_compiler(self):
|
|
|
|
steps = []
|
|
|
|
if self.name == "centos7":
|
2021-08-20 07:31:46 +03:00
|
|
|
steps.append(
|
|
|
|
RunStep(
|
|
|
|
"Install SCL",
|
|
|
|
"yum install -y centos-release-scl-rh",
|
|
|
|
)
|
|
|
|
)
|
2021-08-20 07:22:36 +03:00
|
|
|
steps.append(
|
|
|
|
RunStep(
|
|
|
|
"Update compiler",
|
|
|
|
"yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++",
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return steps
|
|
|
|
|
2020-02-12 21:55:44 +03:00
|
|
|
def install_git(self):
|
2020-05-03 21:21:58 +03:00
|
|
|
steps = []
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.bootstrap_git:
|
2020-05-30 20:06:56 +03:00
|
|
|
GIT_VERS = "2.26.2"
|
2020-05-03 21:21:58 +03:00
|
|
|
steps.append(
|
2020-02-12 21:55:44 +03:00
|
|
|
CacheStep(
|
|
|
|
"Cache Git installation",
|
|
|
|
path="/usr/local/git",
|
2020-05-03 21:21:58 +03:00
|
|
|
key=f"{self.name}-git-{GIT_VERS}",
|
2020-06-07 22:20:56 +03:00
|
|
|
)
|
|
|
|
)
|
2020-05-03 21:21:58 +03:00
|
|
|
|
|
|
|
pre_reqs = ""
|
|
|
|
if self.uses_yum():
|
|
|
|
pre_reqs = "yum install -y wget curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker make"
|
|
|
|
elif self.uses_apt():
|
|
|
|
pre_reqs = "apt-get install -y wget libcurl4-openssl-dev libexpat-dev gettext libssl-dev libz-dev gcc libextutils-autoinstall-perl make"
|
|
|
|
|
2020-06-07 22:20:56 +03:00
|
|
|
steps.append(
|
|
|
|
RunStep(
|
|
|
|
name="Install Git from source",
|
|
|
|
shell="bash",
|
2021-09-21 16:24:52 +03:00
|
|
|
run=f"""{pre_reqs}
|
2020-02-12 21:55:44 +03:00
|
|
|
if test ! -x /usr/local/git/bin/git ; then
|
|
|
|
cd /tmp
|
2020-05-30 20:06:56 +03:00
|
|
|
wget https://github.com/git/git/archive/v{GIT_VERS}.tar.gz
|
|
|
|
tar xzf v{GIT_VERS}.tar.gz
|
2020-05-03 21:21:58 +03:00
|
|
|
cd git-{GIT_VERS}
|
2020-02-12 21:55:44 +03:00
|
|
|
make prefix=/usr/local/git install
|
|
|
|
fi
|
2021-09-21 16:24:52 +03:00
|
|
|
ln -s /usr/local/git/bin/git /usr/local/bin/git""",
|
2020-06-07 22:20:56 +03:00
|
|
|
)
|
|
|
|
)
|
2020-05-03 21:21:58 +03:00
|
|
|
|
|
|
|
else:
|
2020-05-04 02:16:52 +03:00
|
|
|
steps += self.install_system_package("git")
|
2020-05-03 21:21:58 +03:00
|
|
|
|
|
|
|
return steps
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2020-10-10 19:25:11 +03:00
|
|
|
def install_rust(self, cache=True):
|
|
|
|
salt = "2"
|
2020-10-31 08:09:58 +03:00
|
|
|
key_prefix = f"{self.name}-{self.rust_target}-{salt}-${{{{ runner.os }}}}-${{{{ hashFiles('**/Cargo.lock') }}}}"
|
2020-02-12 21:55:44 +03:00
|
|
|
params = {
|
|
|
|
"profile": "minimal",
|
|
|
|
"toolchain": "stable",
|
|
|
|
"override": True,
|
|
|
|
"components": "rustfmt",
|
|
|
|
}
|
|
|
|
if self.rust_target:
|
|
|
|
params["target"] = self.rust_target
|
2020-10-10 19:25:11 +03:00
|
|
|
steps = [
|
2020-02-12 21:55:44 +03:00
|
|
|
ActionStep(
|
2020-11-17 04:28:37 +03:00
|
|
|
name="Install Rust",
|
2020-11-17 23:03:24 +03:00
|
|
|
action="actions-rs/toolchain@v1",
|
2020-11-17 04:28:37 +03:00
|
|
|
params=params,
|
|
|
|
env={"ACTIONS_ALLOW_UNSECURE_COMMANDS": "true"},
|
2020-02-12 21:55:44 +03:00
|
|
|
),
|
|
|
|
]
|
2021-01-13 08:12:54 +03:00
|
|
|
if "macos" in self.name:
|
|
|
|
steps += [
|
2021-08-20 05:22:22 +03:00
|
|
|
RunStep(
|
|
|
|
name="Install Rust (ARM)",
|
|
|
|
run="rustup target add aarch64-apple-darwin",
|
|
|
|
)
|
2021-01-13 08:12:54 +03:00
|
|
|
]
|
2020-10-10 19:25:11 +03:00
|
|
|
if cache:
|
2021-01-13 08:12:54 +03:00
|
|
|
cache_paths = ["~/.cargo/registry", "~/.cargo/git", "target"]
|
2020-10-10 19:25:11 +03:00
|
|
|
steps += [
|
|
|
|
CacheStep(
|
|
|
|
name="Cache cargo",
|
2021-01-13 08:12:54 +03:00
|
|
|
path="\n".join(cache_paths),
|
2020-10-10 19:25:11 +03:00
|
|
|
key=f"{key_prefix}-cargo",
|
|
|
|
),
|
|
|
|
]
|
|
|
|
return steps
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def install_system_deps(self):
|
|
|
|
if "win" in self.name:
|
|
|
|
return []
|
2020-05-04 02:16:52 +03:00
|
|
|
sudo = "sudo -n " if self.needs_sudo() else ""
|
2021-08-20 05:22:22 +03:00
|
|
|
return [
|
2021-09-21 16:24:52 +03:00
|
|
|
RunStep(name="Install System Deps", run=f"{sudo}env PATH=$PATH ./get-deps")
|
2021-08-20 05:22:22 +03:00
|
|
|
]
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def check_formatting(self):
|
|
|
|
return [RunStep(name="Check formatting", run="cargo fmt --all -- --check")]
|
|
|
|
|
|
|
|
def build_all_release(self):
|
|
|
|
if "win" in self.name:
|
|
|
|
return [
|
|
|
|
RunStep(
|
|
|
|
name="Build (Release mode)",
|
|
|
|
shell="cmd",
|
|
|
|
run="""
|
|
|
|
PATH C:\\Strawberry\\perl\\bin;%PATH%
|
|
|
|
cargo build --all --release""",
|
|
|
|
)
|
|
|
|
]
|
2021-01-13 08:12:54 +03:00
|
|
|
if "macos" in self.name:
|
|
|
|
return [
|
|
|
|
RunStep(
|
|
|
|
name="Build (Release mode Intel)",
|
2021-08-20 05:22:22 +03:00
|
|
|
run="cargo build --target x86_64-apple-darwin --all --release",
|
|
|
|
),
|
2021-01-13 08:12:54 +03:00
|
|
|
RunStep(
|
|
|
|
name="Build (Release mode ARM)",
|
2021-08-20 05:22:22 +03:00
|
|
|
run="cargo build --target aarch64-apple-darwin --all --release",
|
|
|
|
),
|
2021-01-13 08:12:54 +03:00
|
|
|
]
|
2021-08-20 05:22:22 +03:00
|
|
|
if self.name == "centos7":
|
|
|
|
enable = "source /opt/rh/devtoolset-9/enable && "
|
|
|
|
else:
|
|
|
|
enable = ""
|
|
|
|
return [
|
|
|
|
RunStep(
|
|
|
|
name="Build (Release mode)", run=enable + "cargo build --all --release"
|
|
|
|
)
|
|
|
|
]
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def test_all_release(self):
|
2021-01-13 08:12:54 +03:00
|
|
|
if "macos" in self.name:
|
2021-08-20 05:22:22 +03:00
|
|
|
return [
|
|
|
|
RunStep(
|
|
|
|
name="Test (Release mode)",
|
|
|
|
run="cargo test --target x86_64-apple-darwin --all --release",
|
|
|
|
)
|
|
|
|
]
|
|
|
|
if self.name == "centos7":
|
|
|
|
enable = "source /opt/rh/devtoolset-9/enable && "
|
|
|
|
else:
|
|
|
|
enable = ""
|
|
|
|
return [
|
|
|
|
RunStep(
|
|
|
|
name="Test (Release mode)", run=enable + "cargo test --all --release"
|
|
|
|
)
|
|
|
|
]
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-11-22 21:27:14 +03:00
|
|
|
def package(self, trusted=False):
|
|
|
|
steps = []
|
|
|
|
deploy_env = None
|
|
|
|
if trusted and ("mac" in self.name):
|
|
|
|
deploy_env = {
|
|
|
|
"MACOS_CERT": "${{ secrets.MACOS_CERT }}",
|
2021-11-23 06:25:14 +03:00
|
|
|
"MACOS_CERT_PW": "${{ secrets.MACOS_CERT_PW }}",
|
2021-11-22 21:27:14 +03:00
|
|
|
"MACOS_TEAM_ID": "${{ secrets.MACOS_TEAM_ID }}",
|
|
|
|
"MACOS_APPLEID": "${{ secrets.MACOS_APPLEID }}",
|
|
|
|
"MACOS_APP_PW": "${{ secrets.MACOS_APP_PW }}",
|
|
|
|
}
|
|
|
|
steps = [RunStep("Package", "bash ci/deploy.sh", env=deploy_env)]
|
2020-05-03 21:21:58 +03:00
|
|
|
if self.app_image:
|
2020-10-11 03:14:06 +03:00
|
|
|
steps.append(RunStep("Source Tarball", "bash ci/source-archive.sh"))
|
2020-05-03 21:21:58 +03:00
|
|
|
steps.append(RunStep("Build AppImage", "bash ci/appimage.sh"))
|
|
|
|
return steps
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def upload_artifact(self):
|
2021-12-09 05:57:25 +03:00
|
|
|
steps = []
|
|
|
|
|
2020-02-12 21:55:44 +03:00
|
|
|
if self.uses_yum():
|
2021-12-09 05:57:25 +03:00
|
|
|
steps.append(
|
|
|
|
RunStep(
|
|
|
|
"Move RPM",
|
|
|
|
f"mv ~/rpmbuild/RPMS/*/*.rpm .",
|
|
|
|
)
|
|
|
|
)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-12-09 05:57:25 +03:00
|
|
|
patterns = self.asset_patterns()
|
|
|
|
glob = " ".join(patterns)
|
|
|
|
paths = "\n".join(patterns)
|
|
|
|
|
|
|
|
return steps + [
|
2020-02-12 21:55:44 +03:00
|
|
|
ActionStep(
|
|
|
|
"Upload artifact",
|
2021-12-07 05:37:33 +03:00
|
|
|
action="actions/upload-artifact@v2",
|
2021-12-09 05:57:25 +03:00
|
|
|
params={"name": self.name, "path": paths},
|
2020-02-12 21:55:44 +03:00
|
|
|
),
|
|
|
|
]
|
|
|
|
|
2020-05-03 21:21:58 +03:00
|
|
|
def asset_patterns(self):
|
|
|
|
patterns = []
|
|
|
|
if self.uses_yum():
|
|
|
|
patterns += ["wezterm-*.rpm"]
|
2020-05-25 10:12:36 +03:00
|
|
|
elif "win" in self.name:
|
|
|
|
patterns += ["WezTerm-*.zip", "WezTerm-*.exe"]
|
|
|
|
elif "mac" in self.name:
|
2020-05-03 21:21:58 +03:00
|
|
|
patterns += ["WezTerm-*.zip"]
|
|
|
|
elif ("ubuntu" in self.name) or ("debian" in self.name):
|
2021-12-06 23:14:16 +03:00
|
|
|
patterns += ["wezterm-*.deb", "wezterm-*.xz"]
|
2020-05-03 21:21:58 +03:00
|
|
|
|
|
|
|
if self.app_image:
|
2021-12-06 23:14:16 +03:00
|
|
|
patterns.append("*src.tar.gz")
|
2020-05-03 21:21:58 +03:00
|
|
|
patterns.append("*.AppImage")
|
2020-05-05 09:38:50 +03:00
|
|
|
patterns.append("*.zsync")
|
2020-05-03 21:21:58 +03:00
|
|
|
return patterns
|
|
|
|
|
2021-12-08 20:14:08 +03:00
|
|
|
def upload_artifact_nightly(self):
|
2020-02-12 21:55:44 +03:00
|
|
|
steps = []
|
|
|
|
|
|
|
|
if self.uses_yum():
|
|
|
|
steps.append(
|
2020-02-13 00:20:11 +03:00
|
|
|
RunStep(
|
|
|
|
"Move RPM",
|
|
|
|
f"mv ~/rpmbuild/RPMS/*/*.rpm wezterm-nightly-{self.name}.rpm",
|
|
|
|
)
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
2020-05-03 21:21:58 +03:00
|
|
|
|
2021-12-07 05:37:33 +03:00
|
|
|
patterns = self.asset_patterns()
|
|
|
|
glob = " ".join(patterns)
|
|
|
|
paths = "\n".join(patterns)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
return steps + [
|
2021-12-07 05:37:33 +03:00
|
|
|
ActionStep(
|
|
|
|
"Upload artifact",
|
|
|
|
action="actions/upload-artifact@v2",
|
2021-12-08 20:14:08 +03:00
|
|
|
params={"name": self.name, "path": paths, "retention-days": 5},
|
|
|
|
),
|
|
|
|
]
|
|
|
|
|
|
|
|
def upload_asset_nightly(self):
|
|
|
|
steps = []
|
|
|
|
|
|
|
|
patterns = self.asset_patterns()
|
|
|
|
glob = " ".join(patterns)
|
|
|
|
|
|
|
|
return steps + [
|
|
|
|
ActionStep(
|
|
|
|
"Download artifact",
|
|
|
|
action="actions/download-artifact@v2",
|
|
|
|
params={"name": self.name},
|
2021-12-07 05:37:33 +03:00
|
|
|
),
|
2021-12-06 19:11:26 +03:00
|
|
|
RunStep(
|
2020-02-12 21:55:44 +03:00
|
|
|
"Upload to Nightly Release",
|
2021-12-08 21:19:00 +03:00
|
|
|
f"bash ci/retry.sh gh release upload --clobber nightly {glob}",
|
2021-12-06 19:11:26 +03:00
|
|
|
env={"GITHUB_TOKEN": "${{ secrets.GITHUB_TOKEN }}"},
|
2021-12-07 05:37:33 +03:00
|
|
|
),
|
2020-02-12 21:55:44 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
def upload_asset_tag(self):
|
|
|
|
steps = []
|
|
|
|
|
2021-12-07 05:41:10 +03:00
|
|
|
patterns = self.asset_patterns()
|
|
|
|
glob = " ".join(patterns)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
return steps + [
|
2021-12-07 05:41:10 +03:00
|
|
|
ActionStep(
|
2021-12-09 05:57:25 +03:00
|
|
|
"Download artifact",
|
|
|
|
action="actions/download-artifact@v2",
|
|
|
|
params={"name": self.name},
|
2021-12-07 05:41:10 +03:00
|
|
|
),
|
2021-12-06 19:11:26 +03:00
|
|
|
RunStep(
|
|
|
|
"Create pre-release",
|
2022-01-01 23:33:40 +03:00
|
|
|
"bash ci/retry.sh bash ci/create-release.sh $(ci/tag-name.sh)",
|
2022-01-01 23:10:08 +03:00
|
|
|
env={
|
|
|
|
"GITHUB_TOKEN": "${{ secrets.GITHUB_TOKEN }}",
|
|
|
|
},
|
2021-12-06 19:11:26 +03:00
|
|
|
),
|
|
|
|
RunStep(
|
2020-02-12 21:55:44 +03:00
|
|
|
"Upload to Tagged Release",
|
2022-01-01 23:33:40 +03:00
|
|
|
f"bash ci/retry.sh gh release upload --clobber $(ci/tag-name.sh) {glob}",
|
2022-01-01 23:10:08 +03:00
|
|
|
env={
|
|
|
|
"GITHUB_TOKEN": "${{ secrets.GITHUB_TOKEN }}",
|
|
|
|
},
|
2021-12-06 19:11:26 +03:00
|
|
|
),
|
2020-02-12 21:55:44 +03:00
|
|
|
]
|
|
|
|
|
2020-06-07 22:48:41 +03:00
|
|
|
def update_homebrew_tap(self):
|
|
|
|
steps = []
|
|
|
|
if "macos" in self.name:
|
|
|
|
steps += [
|
|
|
|
ActionStep(
|
|
|
|
"Checkout homebrew tap",
|
|
|
|
action="actions/checkout@v2",
|
|
|
|
params={
|
|
|
|
"repository": "wez/homebrew-wezterm",
|
|
|
|
"path": "homebrew-wezterm",
|
2020-06-08 20:16:43 +03:00
|
|
|
"token": "${{ secrets.GH_PAT }}",
|
2020-06-07 22:48:41 +03:00
|
|
|
},
|
|
|
|
),
|
|
|
|
RunStep(
|
|
|
|
"Update homebrew tap formula",
|
2021-05-22 18:30:10 +03:00
|
|
|
"cp wezterm.rb homebrew-wezterm/Casks/wezterm.rb",
|
2020-06-07 22:48:41 +03:00
|
|
|
),
|
|
|
|
ActionStep(
|
|
|
|
"Commit homebrew tap changes",
|
|
|
|
action="stefanzweifel/git-auto-commit-action@v4",
|
|
|
|
params={
|
|
|
|
"commit_message": "Automated update to match latest tag",
|
2020-06-08 19:18:03 +03:00
|
|
|
"repository": "homebrew-wezterm",
|
2020-06-07 22:48:41 +03:00
|
|
|
},
|
|
|
|
),
|
|
|
|
]
|
2020-07-05 19:40:28 +03:00
|
|
|
elif self.app_image:
|
|
|
|
steps += [
|
|
|
|
ActionStep(
|
|
|
|
"Checkout linuxbrew tap",
|
|
|
|
action="actions/checkout@v2",
|
|
|
|
params={
|
|
|
|
"repository": "wez/homebrew-wezterm-linuxbrew",
|
|
|
|
"path": "linuxbrew-wezterm",
|
|
|
|
"token": "${{ secrets.GH_PAT }}",
|
|
|
|
},
|
|
|
|
),
|
|
|
|
RunStep(
|
|
|
|
"Update linuxbrew tap formula",
|
|
|
|
"cp wezterm-linuxbrew.rb linuxbrew-wezterm/Formula/wezterm.rb",
|
|
|
|
),
|
|
|
|
ActionStep(
|
|
|
|
"Commit linuxbrew tap changes",
|
|
|
|
action="stefanzweifel/git-auto-commit-action@v4",
|
|
|
|
params={
|
|
|
|
"commit_message": "Automated update to match latest tag",
|
|
|
|
"repository": "linuxbrew-wezterm",
|
|
|
|
},
|
|
|
|
),
|
|
|
|
]
|
2020-06-07 22:48:41 +03:00
|
|
|
|
|
|
|
return steps
|
|
|
|
|
2020-02-12 21:55:44 +03:00
|
|
|
def global_env(self):
|
|
|
|
env = {}
|
|
|
|
if "macos" in self.name:
|
|
|
|
env["MACOSX_DEPLOYMENT_TARGET"] = "10.9"
|
|
|
|
return env
|
|
|
|
|
2020-10-10 19:25:11 +03:00
|
|
|
def prep_environment(self, cache=True):
|
2020-02-12 21:55:44 +03:00
|
|
|
steps = []
|
2021-12-06 19:52:19 +03:00
|
|
|
sudo = "sudo -n " if self.needs_sudo() else ""
|
2020-06-20 07:28:05 +03:00
|
|
|
if self.uses_apt():
|
2020-06-20 07:46:33 +03:00
|
|
|
if self.container:
|
|
|
|
steps += [
|
|
|
|
RunStep(
|
|
|
|
"set APT to non-interactive",
|
|
|
|
"echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections",
|
|
|
|
),
|
|
|
|
]
|
2020-12-11 06:52:36 +03:00
|
|
|
steps += [
|
|
|
|
RunStep("Update APT", f"{sudo}apt update"),
|
|
|
|
]
|
2021-12-06 19:45:14 +03:00
|
|
|
|
2020-05-03 21:21:58 +03:00
|
|
|
if self.container:
|
2021-12-06 19:49:28 +03:00
|
|
|
if ("fedora" in self.container) or ("centos" in self.container):
|
2020-05-04 18:21:30 +03:00
|
|
|
steps += [
|
|
|
|
RunStep(
|
|
|
|
"Install config manager",
|
2020-06-07 22:20:56 +03:00
|
|
|
"dnf install -y 'dnf-command(config-manager)'",
|
2020-05-04 18:21:30 +03:00
|
|
|
),
|
2021-12-06 19:59:21 +03:00
|
|
|
]
|
|
|
|
if "centos" in self.container:
|
|
|
|
steps += [
|
2020-05-04 18:21:30 +03:00
|
|
|
RunStep(
|
|
|
|
"Enable PowerTools",
|
2020-12-08 08:34:30 +03:00
|
|
|
"dnf config-manager --set-enabled powertools",
|
2020-06-07 22:20:56 +03:00
|
|
|
),
|
2021-12-06 19:59:21 +03:00
|
|
|
]
|
2021-08-20 07:22:36 +03:00
|
|
|
steps += self.install_newer_compiler()
|
2020-02-12 21:55:44 +03:00
|
|
|
steps += self.install_git()
|
2020-05-03 21:21:58 +03:00
|
|
|
steps += self.install_curl()
|
2021-12-06 19:52:19 +03:00
|
|
|
|
|
|
|
if self.uses_apt():
|
|
|
|
if self.container:
|
|
|
|
steps += [
|
2021-12-06 20:40:51 +03:00
|
|
|
RunStep("Update APT", f"{sudo}apt update"),
|
2021-12-06 19:52:19 +03:00
|
|
|
]
|
|
|
|
|
2021-09-27 05:30:50 +03:00
|
|
|
steps += self.install_openssh_server()
|
2020-05-03 21:21:58 +03:00
|
|
|
steps += [
|
|
|
|
CheckoutStep(),
|
|
|
|
]
|
2020-10-10 22:00:18 +03:00
|
|
|
steps += self.install_rust(cache="mac" not in self.name)
|
2020-02-12 21:55:44 +03:00
|
|
|
steps += self.install_system_deps()
|
|
|
|
return steps
|
|
|
|
|
|
|
|
def pull_request(self):
|
|
|
|
steps = self.prep_environment()
|
|
|
|
steps += self.check_formatting()
|
|
|
|
steps += self.build_all_release()
|
|
|
|
steps += self.test_all_release()
|
|
|
|
steps += self.package()
|
|
|
|
steps += self.upload_artifact()
|
2021-12-08 20:14:08 +03:00
|
|
|
return (
|
|
|
|
Job(
|
|
|
|
runs_on=self.os,
|
|
|
|
container=self.container,
|
|
|
|
steps=steps,
|
|
|
|
env=self.global_env(),
|
|
|
|
),
|
|
|
|
None,
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
def continuous(self):
|
2020-10-10 22:00:18 +03:00
|
|
|
steps = self.prep_environment()
|
2020-02-12 21:55:44 +03:00
|
|
|
steps += self.build_all_release()
|
|
|
|
steps += self.test_all_release()
|
2021-11-22 21:27:14 +03:00
|
|
|
steps += self.package(trusted=True)
|
2021-12-08 20:14:08 +03:00
|
|
|
steps += self.upload_artifact_nightly()
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
env = self.global_env()
|
|
|
|
env["BUILD_REASON"] = "Schedule"
|
|
|
|
|
2021-12-08 21:19:00 +03:00
|
|
|
uploader = Job(
|
|
|
|
runs_on="ubuntu-latest",
|
|
|
|
steps=[CheckoutStep(submodules=False)] + self.upload_asset_nightly(),
|
|
|
|
)
|
2021-12-08 20:14:08 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
Job(
|
|
|
|
runs_on=self.os,
|
|
|
|
container=self.container,
|
|
|
|
steps=steps,
|
|
|
|
env=env,
|
|
|
|
),
|
|
|
|
uploader,
|
2020-11-17 04:28:37 +03:00
|
|
|
)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
def tag(self):
|
|
|
|
steps = self.prep_environment()
|
|
|
|
steps += self.build_all_release()
|
|
|
|
steps += self.test_all_release()
|
2021-11-22 21:27:14 +03:00
|
|
|
steps += self.package(trusted=True)
|
2021-12-09 05:57:25 +03:00
|
|
|
steps += self.upload_artifact()
|
2020-06-07 22:48:41 +03:00
|
|
|
steps += self.update_homebrew_tap()
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-12-09 05:57:25 +03:00
|
|
|
uploader = Job(
|
|
|
|
runs_on="ubuntu-latest",
|
|
|
|
steps=[CheckoutStep(submodules=False)] + self.upload_asset_tag(),
|
|
|
|
)
|
|
|
|
|
2020-02-12 21:55:44 +03:00
|
|
|
env = self.global_env()
|
2021-12-08 20:14:08 +03:00
|
|
|
return (
|
|
|
|
Job(
|
|
|
|
runs_on=self.os,
|
|
|
|
container=self.container,
|
|
|
|
steps=steps,
|
|
|
|
env=env,
|
|
|
|
),
|
2021-12-09 05:57:25 +03:00
|
|
|
uploader,
|
2020-11-17 04:28:37 +03:00
|
|
|
)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
|
|
|
|
TARGETS = [
|
2021-09-23 06:47:08 +03:00
|
|
|
Target(name="ubuntu:18", os="ubuntu-18.04", app_image=True),
|
2021-12-06 20:37:54 +03:00
|
|
|
Target(container="ubuntu:20.04", continuous_only=True),
|
2020-05-03 21:21:58 +03:00
|
|
|
# debian 8's wayland libraries are too old for wayland-client
|
|
|
|
# Target(container="debian:8.11", continuous_only=True, bootstrap_git=True),
|
|
|
|
Target(container="debian:9.12", continuous_only=True, bootstrap_git=True),
|
|
|
|
Target(container="debian:10.3", continuous_only=True),
|
2021-08-20 19:31:17 +03:00
|
|
|
Target(container="debian:11", continuous_only=True),
|
2021-08-18 07:06:12 +03:00
|
|
|
Target(name="macos", os="macos-11"),
|
2021-09-26 03:56:49 +03:00
|
|
|
# https://fedoraproject.org/wiki/End_of_life?rd=LifeCycle/EOL
|
2020-11-29 21:26:11 +03:00
|
|
|
Target(container="fedora:33"),
|
2021-05-02 19:29:40 +03:00
|
|
|
Target(container="fedora:34"),
|
2021-11-16 04:33:38 +03:00
|
|
|
Target(container="fedora:35"),
|
2020-05-04 18:21:30 +03:00
|
|
|
Target(container="centos:8"),
|
2021-11-23 16:57:48 +03:00
|
|
|
Target(name="windows", os="windows-latest", rust_target="x86_64-pc-windows-msvc"),
|
2020-02-12 21:55:44 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
|
2020-05-03 21:21:58 +03:00
|
|
|
def generate_actions(namer, jobber, trigger, is_continuous):
|
2020-02-12 21:55:44 +03:00
|
|
|
for t in TARGETS:
|
2020-06-07 22:20:56 +03:00
|
|
|
# if t.continuous_only and not is_continuous:
|
2020-05-03 21:21:58 +03:00
|
|
|
# continue
|
2020-02-12 21:55:44 +03:00
|
|
|
name = namer(t).replace(":", "")
|
|
|
|
print(name)
|
2021-12-08 20:14:08 +03:00
|
|
|
job, uploader = jobber(t)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
|
|
|
file_name = f".github/workflows/gen_{name}.yml"
|
|
|
|
if job.container:
|
|
|
|
container = f"container: {yv(job.container)}"
|
|
|
|
else:
|
|
|
|
container = ""
|
|
|
|
|
|
|
|
with open(file_name, "w") as f:
|
|
|
|
f.write(
|
2021-09-21 16:24:52 +03:00
|
|
|
f"""name: {name}
|
2020-02-12 21:55:44 +03:00
|
|
|
{trigger}
|
|
|
|
jobs:
|
|
|
|
build:
|
|
|
|
runs-on: {yv(job.runs_on)}
|
|
|
|
{container}
|
|
|
|
steps:
|
|
|
|
"""
|
|
|
|
)
|
|
|
|
|
2021-09-21 16:24:52 +03:00
|
|
|
job.render(f, 3)
|
2020-02-12 21:55:44 +03:00
|
|
|
|
2021-12-09 05:57:25 +03:00
|
|
|
# We upload using a native runner as github API access
|
|
|
|
# inside a container is really unreliable and can result
|
|
|
|
# in broken releases that can't automatically be repaired
|
|
|
|
# <https://github.com/cli/cli/issues/4863>
|
2021-12-08 20:14:08 +03:00
|
|
|
if uploader:
|
|
|
|
f.write(
|
|
|
|
"""
|
|
|
|
upload:
|
|
|
|
runs-on: ubuntu-latest
|
2021-12-08 20:16:58 +03:00
|
|
|
needs: build
|
2021-12-08 20:14:08 +03:00
|
|
|
steps:
|
|
|
|
"""
|
|
|
|
)
|
|
|
|
uploader.render(f, 3)
|
|
|
|
|
2020-02-12 21:55:44 +03:00
|
|
|
# Sanity check the yaml, if pyyaml is available
|
|
|
|
try:
|
|
|
|
import yaml
|
|
|
|
|
|
|
|
with open(file_name) as f:
|
|
|
|
yaml.safe_load(f)
|
|
|
|
except ImportError:
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
def generate_pr_actions():
|
|
|
|
generate_actions(
|
2020-02-13 00:36:31 +03:00
|
|
|
lambda t: f"{t.name}",
|
2020-02-12 21:55:44 +03:00
|
|
|
lambda t: t.pull_request(),
|
|
|
|
trigger="""
|
|
|
|
on:
|
|
|
|
pull_request:
|
|
|
|
branches:
|
2021-09-21 16:24:52 +03:00
|
|
|
- main
|
2021-01-30 23:34:54 +03:00
|
|
|
paths-ignore:
|
2021-09-21 16:24:52 +03:00
|
|
|
- ".cirrus.yml"
|
|
|
|
- "docs/*"
|
|
|
|
- "ci/build-docs.sh"
|
|
|
|
- "ci/generate-docs.py"
|
|
|
|
- "ci/subst-release-info.py"
|
|
|
|
- ".github/workflows/pages.yml"
|
2021-12-12 09:33:46 +03:00
|
|
|
- ".github/workflows/verify-pages.yml"
|
2021-09-21 16:24:52 +03:00
|
|
|
- ".github/ISSUE_TEMPLATE/*"
|
|
|
|
- "**/*.md"
|
2020-02-12 21:55:44 +03:00
|
|
|
""",
|
2020-05-03 21:21:58 +03:00
|
|
|
is_continuous=False,
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def continuous_actions():
|
|
|
|
generate_actions(
|
|
|
|
lambda t: f"{t.name}_continuous",
|
|
|
|
lambda t: t.continuous(),
|
|
|
|
trigger="""
|
|
|
|
on:
|
|
|
|
schedule:
|
2021-01-30 23:34:54 +03:00
|
|
|
- cron: "10 3 * * *"
|
|
|
|
push:
|
|
|
|
branches:
|
2021-09-21 16:24:52 +03:00
|
|
|
- main
|
2021-01-30 23:34:54 +03:00
|
|
|
paths-ignore:
|
2021-09-21 16:24:52 +03:00
|
|
|
- ".cirrus.yml"
|
|
|
|
- "docs/**"
|
|
|
|
- "ci/build-docs.sh"
|
|
|
|
- "ci/generate-docs.py"
|
|
|
|
- "ci/subst-release-info.py"
|
|
|
|
- ".github/workflows/pages.yml"
|
2021-12-12 09:33:46 +03:00
|
|
|
- ".github/workflows/verify-pages.yml"
|
2021-09-21 16:24:52 +03:00
|
|
|
- ".github/ISSUE_TEMPLATE/*"
|
|
|
|
- "**/*.md"
|
2020-02-12 21:55:44 +03:00
|
|
|
""",
|
2020-05-03 21:21:58 +03:00
|
|
|
is_continuous=True,
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def tag_actions():
|
|
|
|
generate_actions(
|
|
|
|
lambda t: f"{t.name}_tag",
|
|
|
|
lambda t: t.tag(),
|
|
|
|
trigger="""
|
|
|
|
on:
|
|
|
|
push:
|
|
|
|
tags:
|
|
|
|
- "20*"
|
|
|
|
""",
|
2020-05-03 21:21:58 +03:00
|
|
|
is_continuous=True,
|
2020-02-12 21:55:44 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
generate_pr_actions()
|
|
|
|
continuous_actions()
|
|
|
|
tag_actions()
|