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.
72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
#!/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()
|