-
Notifications
You must be signed in to change notification settings - Fork 1
/
tasks.py
112 lines (87 loc) · 2.79 KB
/
tasks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from pathlib import Path
import invoke
from colorama import init
PROJECT_BASE = Path(__file__).resolve().parent
init(autoreset=True)
@invoke.task()
def generate_tag(c):
"""Generate tag based on local branch & commit hash.
Set the config "tag" to the resulting tag.
Usage: inv image.tag
"""
if not hasattr(c.config, "tag"):
# gather build context
branch = c.run("git rev-parse --abbrev-ref HEAD", hide="out").stdout.strip()
branch = branch.replace("/", "-") # clean branch name
commit = c.run("git rev-parse --short HEAD", hide="out").stdout.strip()
dirty = c.run("git status --short").stdout.strip()
if dirty:
dirty = "-dirty"
c.config.tag = f"{branch}-{commit}{dirty}"
@invoke.task(pre=[generate_tag], default=True)
def build_image(c, tag=None, dockerfile=None):
"""Build Docker image using docker build. Tags with <tag> parameter and "latest".
Params:
tag: A user supplied tag for the image
dockerfile: A non-standard Dockerfile location and/or name
Usage: inv image.build --tag=<TAG> --dockerfile=<PATH_TO_DOCKERFILE>
"""
if tag is None:
tag = c.config.tag
if dockerfile is None:
dockerfile = "Dockerfile"
# build app image
c.run(
f"docker build -t {c.config.app}:latest -t {c.config.app}:{tag} -f {dockerfile} .",
echo=True,
)
c.config.tag = tag
@invoke.task()
def up(c):
"""Bring up deployable image.
Usage: inv image.up
"""
c.run("docker-compose up -d --remove-orphans")
@invoke.task()
def shell(c, name, local=False):
"""Shell into a running container.
:param c: Invoke context
:param name: The name of the running container
:param local: If true will connect to a local instance, default is to a connect to a heroku app instance.
:return:
Usage: inv image.shell -n my-heroku-app-name
inv image.shell -n my-docker-container --local
"""
command = f"heroku run bash -a {name}"
if local:
command = f"docker exec -ti {name} /bin/bash"
c.run(command, echo=True)
@invoke.task()
def stop(c):
"""Stop deployable image.
Usage: inv image.stop
"""
c.run("docker-compose stop", warn=True)
image = invoke.Collection("image")
image.add_task(generate_tag, "tag")
image.add_task(build_image, "build")
image.add_task(up, "up")
image.add_task(stop, "stop")
image.add_task(shell)
dc = invoke.Collection("dc")
ns = invoke.Collection()
ns.add_collection(image)
ns.add_collection(dc)
ns.configure(
{
"app": "revengine",
"aws": {"region": "us-east-1"},
"run": {
"echo": True,
"pty": True,
"env": {
"COMPOSE_FILE": "docker-compose.yml:docker-compose-deploy.yml",
},
},
}
)