Add a deployment command group to the website script

This group has one command so far: next-tag. It looks at the git tag list and
figured out the next deployment tag. For the most part tags are named like so:

    deploy-%Y-%m-%d-NN

The middle segments are year-month-day, and the last segment is an incrementing
counter. For the most part this number will be 01. On days when I deploy more than
once, it will increment.
This commit is contained in:
Eryn Wells 2025-08-29 08:59:03 -06:00
parent 69760a802d
commit 2688e4e339
3 changed files with 75 additions and 1 deletions

View file

@ -0,0 +1,72 @@
#!/usr/bin/env python3
# Eryn Wells <eryn@erynwells.me>
import argparse
import datetime
import subprocess
from typing import List
from .scripting import Command
DATE_FORMAT = "%Y-%m-%d"
class DeploymentCommand(Command):
@property
def help(self) -> str:
return 'Deployment tools'
def add_arguments(self, parser: argparse.ArgumentParser):
commands = parser.add_subparsers(title="Deployment", required=True)
deployment_command = commands.add_parser(
'next-tag',
help='Calculate the next deployment tag for a given date, examining all other tags for that day'
)
deployment_command.add_argument(
'--date', '-d',
type=self.__class__.parse_date_argument,
default=datetime.date.today(),
help="date to calculate a new deployment tag for (default: today)"
)
deployment_command.set_defaults(handler=self.handle_next_deployment_tag_command)
@staticmethod
def parse_date_argument(date_string: str) -> datetime.date:
return datetime.datetime.strptime(date_string, DATE_FORMAT).date()
def handle_next_deployment_tag_command(self, args: argparse.Namespace):
next_deployment_tag = deployment_tag_for_date(args.date)
print(next_deployment_tag)
def deployment_tag_for_date(date: datetime.date) -> str:
formatted_date = date.strftime(DATE_FORMAT)
def deploy_tag_filter(tag):
return tag.startswith("deploy-") and formatted_date in tag
filtered_tags = sorted(filter(deploy_tag_filter, git_tags()))
if len(filtered_tags) == 0:
return f"deploy-{formatted_date}-01"
else:
last_tag = filtered_tags[-1]
components = last_tag.split("-")
if len(components) == 5:
# A previous numbered deployment. Add one to the last deployment
# number.
deployment_number = int(components[-1]) + 1
return f"deploy-{formatted_date}-{deployment_number:02}"
else:
# An old style deployment tag that doesn't have a number. There
# should only ever be one of these.
assert len(filtered_tags) == 1
return f"deploy-{formatted_date}-02"
def git_tags() -> List[str]:
return subprocess.check_output(
"git tag -l",
shell=True,
encoding="utf-8"
).splitlines()

View file

@ -20,5 +20,5 @@ class Command:
def help(self) -> str:
return ''
def add_arguments(self, _: argparse.ArgumentParser):
def add_arguments(self, parser: argparse.ArgumentParser):
raise NotImplementedError()

View file

@ -9,10 +9,12 @@ import argparse
from typing import List
from erynwells_me.scripting import Command
from erynwells_me.weeknotes import WeeknotesCommand
from erynwells_me.deployment import DeploymentCommand
COMMANDS: List[Command] = [
WeeknotesCommand(),
DeploymentCommand(),
]