Skip to content

Commit

Permalink
did it
Browse files Browse the repository at this point in the history
  • Loading branch information
joshuarli committed Jul 22, 2024
1 parent f08207d commit 9f43c1a
Showing 1 changed file with 33 additions and 112 deletions.
145 changes: 33 additions & 112 deletions devenv/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,74 +4,13 @@
import configparser
import functools
import os
import shlex
import subprocess

from libdevinfra.jobs import Job, Task, run_jobs

from devenv import constants
from devenv.lib import colima, config, fs, limactl, proc, venv, volta


# TODO: need to replace this with a nicer process executor in devenv.lib
def run_procs(
repo: str,
reporoot: str,
venv_path: str,
_procs: tuple[tuple[str, tuple[str, ...], dict[str, str]], ...],
) -> bool:
procs: list[tuple[str, tuple[str, ...], subprocess.Popen[bytes]]] = []

for name, cmd, extra_env in _procs:
print(f"⏳ {name}")
if constants.DEBUG:
proc.xtrace(cmd)
env = {
**constants.user_environ,
**proc.base_env,
"VIRTUAL_ENV": venv_path,
"VOLTA_HOME": f"{reporoot}/.devenv/bin/volta-home",
"PATH": f"{venv_path}/bin:{reporoot}/.devenv/bin:{proc.base_path}",
}
if extra_env:
env = {**env, **extra_env}
procs.append(
(
name,
cmd,
subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
env=env,
cwd=reporoot,
),
)
)

all_good = True
for name, final_cmd, p in procs:
out, _ = p.communicate()
if p.returncode != 0:
all_good = False
print(
f"""
{name}
failed command (code p.returncode):
{shlex.join(final_cmd)}
Output:
{out.decode()}
"""
)
else:
print(f"✅ {name}")

return all_good


def main(context: dict[str, str]) -> int:
repo = context["repo"]
reporoot = context["reporoot"]
Expand Down Expand Up @@ -154,8 +93,6 @@ def main(context: dict[str, str]) -> int:
)
jp3 = Task(
name="install dependencies",
# could opt out of syncing python if FRONTEND_ONLY but only if repo-local devenv
# and pre-commit were moved to inside devenv and not the sentry venv
func=functools.partial(
proc.run,
(
Expand All @@ -174,32 +111,48 @@ def main(context: dict[str, str]) -> int:
)
jp4 = Task(
name="install editable",
# could opt out of syncing python if FRONTEND_ONLY but only if repo-local devenv
# and pre-commit were moved to inside devenv and not the sentry venv
func=functools.partial(
proc.run,
(f"{venv_dir}/bin/python3", "-m", "tools.fast_editable", "--path", "."),
stdout=True,
),
)

# jp5 shoudl start devservices iff freontend-only

jp5 = Task(
name="init sentry config",
func=functools.partial(
proc.run,
(f"{venv_dir}/bin/sentry", "init", "--dev", "--no-clobber"),
stdout=True,
),
)
jpc1 = Task(
name="install pre-commit dependencies",
# could opt out of syncing python if FRONTEND_ONLY but only if repo-local devenv
# and pre-commit were moved to inside devenv and not the sentry venv
func=functools.partial(
proc.run,
(f"{venv_dir}/bin/pre-commit", "install", "--install-hooks", "-f"),
# pathprepend=f"{venv_path}/bin:{reporoot}/.devenv/bin",
stdout=True,
),
)
jm1 = Task(
name="bring up redis and postgres",
func=functools.partial(
proc.run,
(f"{venv_dir}/bin/sentry", "devservices", "up", "redis", "postgres"),
stdout=True,
),
)
jm2 = Task(
name="apply migrations",
func=functools.partial(
proc.run,
("make", "apply-migrations"),
pathprepend=f"{venv_dir}/bin:{reporoot}/.devenv/bin",
env={"VIRTUAL_ENV": venv_dir},
stdout=True,
),
)
jt1 = Task(
name="install js dependencies",
# could opt out of syncing python if FRONTEND_ONLY but only if repo-local devenv
# and pre-commit were moved to inside devenv and not the sentry venv
func=functools.partial(
proc.run,
(
Expand All @@ -218,54 +171,22 @@ def main(context: dict[str, str]) -> int:
),
)

jp = Job(name="python dependencies", tasks=(jp1, jp2, jp3, jp4))
jp = Job(name="python dependencies", tasks=(jp1, jp2, jp3, jp4, jp5))
jm = Job(name="sentry migrations", tasks=(jm1, jm2))
jpc = Job(name="pre-commit dependencies", tasks=(jpc1,))
jt = Job(name="javascript dependencies", tasks=(jt1,))

# after python deps are installed we can install pre-commit deps
jp3.spawn_jobs = (jpc,)

with concurrent.futures.ThreadPoolExecutor() as tpe:
run_jobs((jp, jt), tpe)

fs.ensure_symlink("../../config/hooks/post-merge", f"{reporoot}/.git/hooks/post-merge")

if not os.path.exists(f"{constants.home}/.sentry/config.yml") or not os.path.exists(
f"{constants.home}/.sentry/sentry.conf.py"
):
proc.run((f"{venv_dir}/bin/sentry", "init", "--dev"))

# Frontend engineers don't necessarily always have devservices running and
# can configure to skip them to save on local resources
if FRONTEND_ONLY:
print("Skipping python migrations since SENTRY_DEVENV_FRONTEND_ONLY is set.")
return 0

# TODO: check healthchecks for redis and postgres to short circuit this
proc.run(
(
f"{venv_dir}/bin/{repo}",
"devservices",
"up",
"redis",
"postgres",
),
pathprepend=f"{reporoot}/.devenv/bin",
exit=True,
)
else:
jp5.spawn_jobs = (jm,)

if run_procs(
repo,
reporoot,
venv_dir,
(
(
"python migrations",
("make", "apply-migrations"),
{},
),
),
):
return 0
with concurrent.futures.ThreadPoolExecutor() as tpe:
run_jobs((jp, jt), tpe)

return 1
fs.ensure_symlink("../../config/hooks/post-merge", f"{reporoot}/.git/hooks/post-merge")

0 comments on commit 9f43c1a

Please sign in to comment.