-
Notifications
You must be signed in to change notification settings - Fork 3
/
publish_version.py
219 lines (176 loc) · 6.23 KB
/
publish_version.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
"""Create new version of Ax.
Custom script that automate building new version of Ax.
Usage:
publish_version.py [--major] [--minor] [--no-front]
Options:
--major Increment major version
--minor Increment minor version
--no-front Skip npm run build
"""
import os
import sys
import uuid
import subprocess
from pathlib import Path
import ruamel.yaml
from loguru import logger
from docopt import docopt
from alembic import command
setup_path = Path(__file__).parent.resolve()
ax_path = setup_path / 'ax'
frontend_path = setup_path / 'ax' / 'frontend'
sys.path.insert(0, str(ax_path))
# pylint: disable=wrong-import-position
import ax.backend.misc as ax_misc
import ax.backend.model as ax_model
import ax.backend.migration as ax_migration
import ax.main as ax_app
from backend.model import AxAlembicVersion
# pylint: enable=wrong-import-position
this = sys.modules[__name__]
app_yaml = None
app_yaml_path = None
final_version = None
revision_id = None
yaml = ruamel.yaml.YAML()
def init_ax():
"""Load config and init model"""
try:
ax_misc.load_configuration()
ax_app.init_model()
ax_migration.init_alembic_config()
except Exception:
logger.exception('Error getting ax settings')
raise
def bump_version(is_major=False, is_minor=False):
"""Increment ax version in app.yaml"""
try:
this.app_yaml_path = Path(
__file__).parent.resolve() / 'ax' / 'app.template.yaml'
if not is_major and not is_minor:
is_minor = True
with open(this.app_yaml_path) as yaml_file:
this.app_yaml = yaml.load(yaml_file)
version_string = this.app_yaml['env_variables']['AX_VERSION']
(major, minor, micro) = [int(s) for s in version_string.split('.')]
micro += 1
if is_minor:
minor += 1
micro = 0
if is_major:
major += 1
minor = 0
micro = 0
this.final_version = str(major) + "." + \
str(minor) + "." + str(micro)
this.app_yaml['env_variables']['AX_VERSION'] = this.final_version
except Exception:
logger.exception('Failed to bump version')
raise
def create_db_revision():
"""Genereting alembic database migration script"""
try:
logger.info('Database does not fit metadata. Creating revision')
rand = int(uuid.uuid4()) % 100000000000000
rand_str = str(hex(rand)[2:-1])
this.revision_id = 'v' + this.final_version + '_' + rand_str
message = ''
label = 'v' + this.final_version
command.revision(
ax_migration.alembic_cfg,
message,
rev_id=this.revision_id,
autogenerate=True,
branch_label=label
)
this.app_yaml['env_variables']['AX_DB_REVISION'] = this.revision_id
except Exception:
logger.exception('Error in creating database revision')
raise
def save_db_revision() -> None:
"""Saves db revision to current database"""
msg = 'Failed saving revision id to database'
with ax_model.scoped_session(msg) as db_session:
current_version = AxAlembicVersion()
current_version.version_num = this.revision_id
db_session.add(current_version)
def clear_pipy_dist() -> None:
"""Deletes all previos compiled packages"""
try:
# filelist = [f for f in os.listdir(str(this.setup_path / 'dist'))]
# for file in filelist:
# os.remove(os.path.join(str(this.setup_path / 'dist'), file))
# filelist = [f for f in os.listdir(str(this.setup_path / 'build'))]
# for file in filelist:
# os.remove(os.path.join(str(this.setup_path / 'build'), file))
cmd = 'python setup.py clean --all'
subprocess.check_call(cmd, shell=True, cwd=str(this.setup_path))
except Exception:
logger.exception('Failed clearing /dist folder')
raise
def npm_run_build() -> None:
"""Build frontend with webpack"""
try:
cmd = 'npm run build'
subprocess.check_call(cmd, shell=True, cwd=str(this.frontend_path))
except Exception:
logger.exception('Failed building frontend with npm run build')
raise
def buid_pypi() -> None:
"""Runs setup.py and builds ax package"""
try:
cmd = 'python setup.py sdist bdist_wheel'
subprocess.check_call(cmd, shell=True, cwd=str(this.setup_path))
except Exception:
logger.exception('Failed building pypi package')
raise
def save_yaml() -> None:
"""Saves yaml file to disk"""
try:
with open(this.app_yaml_path, "w") as yaml_file:
yaml.dump(this.app_yaml, yaml_file)
except Exception:
logger.exception('Error saving changes to app.yaml file')
raise
def upload_to_pypi() -> None:
"""Upload package to pypi with `twine upload`"""
try:
cmd = 'twine upload dist/*'
subprocess.check_call(cmd, shell=True, cwd=str(this.setup_path))
except Exception:
logger.exception('Uploading to pypi failed')
raise
def tag_git() -> None:
"""Tags current git commit"""
try:
cmd = 'git tag ' + this.final_version + \
' -a -m \'Release ' + this.final_version + '\''
subprocess.check_call(cmd, shell=True, cwd=str(this.setup_path))
except Exception:
logger.exception('Failed git tag')
raise
if __name__ == "__main__":
arguments = docopt(__doc__)
logger.info(arguments['--minor'])
# Init migration.py for alembic and model.py for database
# init_ax()
# Automatic bump version, save in app.yaml
clear_pipy_dist()
bump_version(is_major=arguments['--major'], is_minor=arguments['--minor'])
# # Create db migration script
# if ax_migration.database_fits_metadata() is False:
# # Create migration script and save revision on app.yaml
# create_db_revision()
# save_db_revision()
# else:
# logger.info('No database changes detected')
save_yaml()
if arguments['--no-front'] is False:
npm_run_build()
buid_pypi()
upload_to_pypi()
# tag_git()
# Publish pipy package to TEST pypi
# Run all tests
# Tag git commit
# Publish to real pypi