Skip to content

Commit ff13d3a

Browse files
committed
CH-194 remove dependency on current path in deployment
1 parent 92c6f2f commit ff13d3a

8 files changed

Lines changed: 55 additions & 45 deletions

File tree

tools/deployment-cli-tools/ch_cli_tools/codefresh.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import os
2-
from os.path import join, relpath, exists, dirname, basename
2+
from os.path import join, relpath, exists, dirname, basename, abspath
33
from cloudharness_model.models.git_dependency_config import GitDependencyConfig
44

55
import logging
@@ -105,6 +105,9 @@ def create_codefresh_deployment_scripts(root_paths, envs=(), include=(), exclude
105105
for app in helm_values['apps'].values() if 'harness' in app]
106106
out_filename = f"codefresh-{'-'.join(envs)}.yaml"
107107

108+
if base_image_name is None:
109+
base_image_name = helm_values['name']
110+
108111
if build_included:
109112
logging.info(
110113
'Including the following subpaths to the build: %s.', ', '
@@ -125,10 +128,12 @@ def create_codefresh_deployment_scripts(root_paths, envs=(), include=(), exclude
125128

126129
steps = {}
127130
build_steps = {}
128-
for root_path in root_paths:
129-
if '.overrides' not in root_path:
130-
base_image_name = helm_values['name'] if root_path == root_paths[0] else\
131-
clean_image_name(os.path.basename(os.path.abspath(root_path)))
131+
has_overrides = any(DEFAULT_MERGE_PATH in root_path for root_path in root_paths)
132+
for i in range(len(root_paths)):
133+
134+
root_path = root_paths[i]
135+
base_name = clean_image_name(basename(abspath(root_path))) if i < len(root_paths) - (2 if has_overrides else 1) else base_image_name
136+
132137
for e in envs:
133138

134139
template_name = f"codefresh-template-{e}.yaml"
@@ -245,7 +250,7 @@ def codefresh_steps_from_base_path(base_path, fixed_context=None, include=build_
245250
relpath(
246251
dockerfile_path, root_path) if fixed_context else '',
247252
"Dockerfile"),
248-
base_name=base_image_name,
253+
base_name=base_name,
249254
helm_values=helm_values,
250255
dependencies=dependencies
251256
)
@@ -259,7 +264,7 @@ def codefresh_steps_from_base_path(base_path, fixed_context=None, include=build_
259264
steps[CD_STEP_PUBLISH]['steps']['publish_' + app_name] = codefresh_app_publish_spec(
260265
app_name=app_name,
261266
build_tag=build and build['tag'],
262-
base_name=base_image_name
267+
base_name=base_name
263268
)
264269
found = True
265270

@@ -314,7 +319,7 @@ def add_unit_test_step(app_config: ApplicationHarnessConfig):
314319
steps[CD_UNIT_TEST_STEP]['steps'][f"{app_name}_ut"] = dict(
315320
title=f"Unit tests for {app_name}",
316321
commands=test_config.unit.commands,
317-
image=image_tag_with_variables(app_name, tag, base_image_name),
322+
image=image_tag_with_variables(app_name, tag, base_name),
318323
)
319324

320325
if helm_values[KEY_TASK_IMAGES]:
@@ -325,15 +330,15 @@ def add_unit_test_step(app_config: ApplicationHarnessConfig):
325330
codefresh_steps_from_base_path(join(root_path, APPS_PATH), include=helm_values[KEY_TASK_IMAGES].keys())
326331
codefresh_steps_from_base_path(join(root_path, APPS_PATH), include=build_included)
327332

328-
if CD_E2E_TEST_STEP:
333+
if CD_E2E_TEST_STEP in steps:
329334
name = "test-e2e"
330335
if codefresh_steps_from_base_path(join(root_path, TEST_IMAGES_PATH), include=(name,), publish=False):
331-
steps[CD_E2E_TEST_STEP]["image"] = image_tag_with_variables(name, app_specific_tag_variable(name), base_name=base_image_name)
336+
steps[CD_E2E_TEST_STEP]["image"] = image_tag_with_variables(name, app_specific_tag_variable(name), base_name=base_name)
332337

333338
if CD_API_TEST_STEP in steps:
334339
name = "test-api"
335340
if codefresh_steps_from_base_path(join(root_path, TEST_IMAGES_PATH), include=(name,), fixed_context=relpath(root_path, os.getcwd()), publish=False):
336-
steps[CD_API_TEST_STEP]["image"] = image_tag_with_variables(name, app_specific_tag_variable(name), base_name=base_image_name)
341+
steps[CD_API_TEST_STEP]["image"] = image_tag_with_variables(name, app_specific_tag_variable(name), base_name=base_name)
337342

338343
if build_steps:
339344

tools/deployment-cli-tools/ch_cli_tools/configurationgenerator.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def _adjust_missing_values(self, helm_values):
9696
def _process_applications(self, helm_values, base_image_name=None):
9797
for i in range(len(self.root_paths)):
9898
root_path = self.root_paths[i]
99-
base_name = clean_image_name(root_path.name) if i > 0 else base_image_name
99+
base_name = clean_image_name(root_path.name) if i < len(self.root_paths) - 1 else base_image_name
100100
app_values = init_app_values(
101101
root_path, exclude=self.exclude, values=helm_values[KEY_APPS])
102102
helm_values[KEY_APPS] = dict_merge(helm_values[KEY_APPS],
@@ -152,7 +152,7 @@ def collect_app_values(self, app_base_path, base_image_name=None, helm_values=No
152152
def _init_static_images(self, base_image_name):
153153
for i in range(len(self.root_paths)):
154154
root_path = self.root_paths[i]
155-
base_name = clean_image_name(root_path.name) if i > 0 else base_image_name
155+
base_name = clean_image_name(root_path.name) if i < len(self.root_paths) - 1 else base_image_name
156156
for static_img_dockerfile in find_dockerfiles_paths(os.path.join(root_path, STATIC_IMAGES_PATH)):
157157
self.static_images.add(static_img_dockerfile)
158158

@@ -185,7 +185,7 @@ def _assign_static_build_dependencies(self, helm_values):
185185
def _init_base_images(self, base_image_name):
186186
for i in range(len(self.root_paths)):
187187
root_path = self.root_paths[i]
188-
base_name = clean_image_name(root_path.name) if i > 0 else base_image_name
188+
base_name = clean_image_name(root_path.name) if i < len(self.root_paths) - 1 else base_image_name
189189

190190
for base_img_dockerfile in self.__find_static_dockerfile_paths(root_path):
191191
img_name = image_name_from_dockerfile_path(
@@ -201,7 +201,7 @@ def _init_test_images(self, base_image_name):
201201
test_images = {}
202202
for i in range(len(self.root_paths)):
203203
root_path = self.root_paths[i]
204-
base_name = clean_image_name(root_path.name) if i > 0 else base_image_name
204+
base_name = clean_image_name(root_path.name) if i < len(self.root_paths) - 1 else base_image_name
205205

206206
for base_img_dockerfile in find_dockerfiles_paths(os.path.join(root_path, TEST_IMAGES_PATH)):
207207
img_name = image_name_from_dockerfile_path(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
mainapp: myapp
22
domain: myapp.local
3+
name: testprojectname
34
a: b
45
database:
56
auto: true

tools/deployment-cli-tools/tests/resources/infrastructure/base-images/cloudharness-base/Dockerfile

Whitespace-only changes.

tools/deployment-cli-tools/tests/test_codefresh.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
RESOURCES = os.path.join(HERE, 'resources')
99
OUT = '/tmp/deployment'
1010
CLOUDHARNESS_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE)))
11-
BUILD_MERGE_DIR = "./build/test_deployment"
11+
BUILD_MERGE_DIR = "./build/.overrides"
1212

1313
myapp_path = os.path.join(HERE, "resources/applications/myapp")
1414
if not os.path.exists(os.path.join(myapp_path, "dependencies/a/.git")):
@@ -61,8 +61,10 @@ def test_create_codefresh_configuration():
6161
steps = l1_steps[STEP_0]["steps"]
6262
assert len(steps) == 7, "all images that do not depend on othe builds should be included in the first step"
6363
assert "cloudharness-base" in steps, "cloudharness-base image should be included as dependency"
64+
assert "testprojectname/" in steps["cloudharness-base"]['image_name'], "cloudharness-base image should be overridden and take the main name"
6465
assert "cloudharness-base-debian" not in steps, "cloudharness-base image should not be included"
6566
assert "cloudharness-frontend-build" in steps, "cloudharness-frontend-build image should be included as dependency"
67+
assert "cloud-harness/" in steps["cloudharness-frontend-build"]['image_name'], "cloudharness-frontend-build image is not overridden and should keep the cloud-harness prefix"
6668

6769
step = steps["cloudharness-frontend-build"]
6870
assert os.path.samefile(step['working_directory'], CLOUDHARNESS_ROOT)
@@ -117,6 +119,7 @@ def test_create_codefresh_configuration():
117119

118120
step = steps["myapp"]
119121
assert step['dockerfile'] == "Dockerfile"
122+
assert "testprojectname/" in step['image_name'], f"myapp image should have the project name coming from the chart in its path, is {step['image_name']}"
120123
for build_argument in step['build_arguments']:
121124
if build_argument.startswith("CLOUDHARNESS_FLASK="):
122125
assert "cloud-harness" in build_argument, "Cloudharness flask image should have cloud-harness in its path"
@@ -132,7 +135,7 @@ def test_create_codefresh_configuration():
132135
) == 2, "Two unit test steps are expected"
133136
assert 'myapp_ut' in l1_steps[CD_UNIT_TEST_STEP]['steps'], "Myapp test step is expected"
134137
tstep = l1_steps[CD_UNIT_TEST_STEP]['steps']['myapp_ut']
135-
assert tstep['image'] == r"${{REGISTRY}}/resources/myapp:${{MYAPP_TAG}}", "The test image should be the one built for the current app"
138+
assert tstep['image'] == r"${{REGISTRY}}/testprojectname/myapp:${{MYAPP_TAG}}", "The test image should be the one built for the current app"
136139
assert len(
137140
tstep['commands']) == 2, "Unit test commands are not properly loaded from the unit test configuration file"
138141
assert tstep['commands'][0] == "tox", "Unit test commands are not properly loaded from the unit test configuration file"
@@ -175,7 +178,7 @@ def test_create_codefresh_configuration_multienv():
175178
for cmd in cf['steps']['prepare_deployment']['commands']:
176179
if 'harness-deployment' in cmd:
177180
assert '-e dev-test' in cmd
178-
assert "test_deployment" in cmd
181+
assert "test-${{NAMESPACE_BASENAME}}" in cmd
179182
assert "-i samples" in cmd
180183

181184
finally:

tools/deployment-cli-tools/tests/test_dockercompose.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def test_collect_compose_values(tmp_path):
2222
namespace='test', env='dev', local=False, tag=1, registry='reg')
2323

2424
# Auto values
25-
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'reg/resources/myapp:1'
26-
assert values.apps['myapp'].harness.deployment.image == 'reg/resources/myapp:1'
25+
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'reg/testprojectname/myapp:1'
26+
assert values.apps['myapp'].harness.deployment.image == 'reg/testprojectname/myapp:1'
2727
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['name'] == 'myapp'
2828
assert values[KEY_APPS]['legacy'][KEY_HARNESS]['name'] == 'legacy'
2929
assert values[KEY_APPS]['accounts'][KEY_HARNESS]['deployment']['image'] == 'reg/cloud-harness/accounts:1'
@@ -87,8 +87,8 @@ def test_collect_compose_values(tmp_path):
8787
# Checl base and task images
8888
assert values[KEY_TASK_IMAGES]
8989
assert 'cloudharness-base' in values[KEY_TASK_IMAGES]
90-
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'reg/cloud-harness/cloudharness-base:1'
91-
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'reg/resources/myapp-mytask:1'
90+
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'reg/testprojectname/cloudharness-base:1', "cloudharness-base image is overridden"
91+
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'reg/testprojectname/myapp-mytask:1'
9292
# Not indicated as a build dependency
9393
assert 'cloudharness-base-debian' not in values[KEY_TASK_IMAGES]
9494

@@ -99,7 +99,7 @@ def test_collect_compose_values_noreg_noinclude(tmp_path):
9999
namespace='test', env='dev', local=False, tag=1)
100100

101101
# Auto values
102-
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'resources/myapp:1'
102+
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'testprojectname/myapp:1'
103103
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['name'] == 'myapp'
104104
assert values[KEY_APPS]['legacy'][KEY_HARNESS]['name'] == 'legacy'
105105
assert values[KEY_APPS]['accounts'][KEY_HARNESS]['deployment']['image'] == 'cloud-harness/accounts:1'
@@ -157,8 +157,8 @@ def test_collect_compose_values_noreg_noinclude(tmp_path):
157157

158158
assert values[KEY_TASK_IMAGES]
159159
assert 'cloudharness-base' in values[KEY_TASK_IMAGES]
160-
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'cloud-harness/cloudharness-base:1'
161-
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'resources/myapp-mytask:1'
160+
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'testprojectname/cloudharness-base:1'
161+
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'testprojectname/myapp-mytask:1'
162162

163163

164164
def test_collect_compose_values_precedence(tmp_path):
@@ -208,7 +208,6 @@ def test_collect_compose_values_build_dependencies(tmp_path):
208208

209209
assert 'cloudharness-flask' in values[KEY_TASK_IMAGES], "Cloudharness-flask is included in the build dependencies"
210210
assert 'cloudharness-base' in values[KEY_TASK_IMAGES], "Cloudharness-base is included in cloudharness-flask Dockerfile and it should be guessed"
211-
assert 'cloudharness-base-debian' not in values[KEY_TASK_IMAGES], "Cloudharness-base-debian is not included in any dependency"
212211
assert 'cloudharness-frontend-build' not in values[KEY_TASK_IMAGES], "cloudharness-frontend-build is not included in any dependency"
213212

214213

@@ -219,7 +218,6 @@ def test_collect_compose_values_build_dependencies_nodeps(tmp_path):
219218

220219
assert 'cloudharness-flask' not in values[KEY_TASK_IMAGES], "Cloudharness-flask is not included in the build dependencies"
221220
assert 'cloudharness-base' not in values[KEY_TASK_IMAGES], "Cloudharness-base is not included in the build dependencies"
222-
assert 'cloudharness-base-debian' not in values[KEY_TASK_IMAGES], "Cloudharness-base-debian is not included in any dependency"
223221
assert 'cloudharness-frontend-build' not in values[KEY_TASK_IMAGES], "cloudharness-frontend-build is not included in any dependency"
224222

225223

@@ -316,9 +314,9 @@ def create():
316314
values = create()
317315

318316
# Auto values are set by using the directory hash
319-
assert 'reg/resources/myapp:' in values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image']
320-
assert 'reg/resources/myapp:' in values.apps['myapp'].harness.deployment.image
321-
assert 'resources/myapp-mytask' in values[KEY_TASK_IMAGES]['myapp-mytask']
317+
assert 'reg/testprojectname/myapp:' in values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image']
318+
assert 'reg/testprojectname/myapp:' in values.apps['myapp'].harness.deployment.image
319+
assert 'testprojectname/myapp-mytask' in values[KEY_TASK_IMAGES]['myapp-mytask']
322320
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == values.apps['myapp'].harness.deployment.image
323321
v1 = values.apps['myapp'].harness.deployment.image
324322
c1 = values["task-images"]["my-common"]
@@ -372,7 +370,7 @@ def create():
372370
finally:
373371
fname.unlink()
374372

375-
fname = Path(CLOUDHARNESS_ROOT) / 'atestfile'
373+
fname = Path(RESOURCES) / 'atestfile'
376374
try:
377375
fname.write_text('a')
378376

tools/deployment-cli-tools/tests/test_helm.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ def test_collect_helm_values(tmp_path):
3535
assert 'events' not in values[KEY_APPS]
3636

3737
# Auto values
38-
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'reg/resources/myapp:1'
38+
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'reg/testprojectname/myapp:1'
3939
assert values[KEY_APPS]['myapp']['build'] == True
40-
assert values.apps['myapp'].harness.deployment.image == 'reg/resources/myapp:1'
40+
assert values.apps['myapp'].harness.deployment.image == 'reg/testprojectname/myapp:1'
4141
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['name'] == 'myapp'
4242
assert values[KEY_APPS]['legacy'][KEY_HARNESS]['name'] == 'legacy'
4343
assert values[KEY_APPS]['accounts'][KEY_HARNESS]['deployment']['image'] == 'reg/cloud-harness/accounts:1'
@@ -74,8 +74,9 @@ def test_collect_helm_values(tmp_path):
7474
# Checl base and task images
7575
assert values[KEY_TASK_IMAGES]
7676
assert 'cloudharness-base' in values[KEY_TASK_IMAGES]
77-
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'reg/cloud-harness/cloudharness-base:1'
78-
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'reg/resources/myapp-mytask:1'
77+
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'reg/testprojectname/cloudharness-base:1', "Cloudharness base image is overridden, so takes the main project name prefix"
78+
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'reg/testprojectname/myapp-mytask:1'
79+
assert values[KEY_TASK_IMAGES]['cloudharness-flask'] == 'reg/cloud-harness/cloudharness-flask:1'
7980
# Not indicated as a build dependency
8081
assert 'cloudharness-base-debian' not in values[KEY_TASK_IMAGES]
8182

@@ -99,7 +100,7 @@ def test_collect_helm_values_noreg_noinclude(tmp_path):
99100
namespace='test', env='dev', local=False, tag=1)
100101

101102
# Auto values
102-
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'resources/myapp:1'
103+
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == 'testprojectname/myapp:1'
103104
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['name'] == 'myapp'
104105
assert values[KEY_APPS]['legacy'][KEY_HARNESS]['name'] == 'legacy'
105106
assert values[KEY_APPS]['accounts'][KEY_HARNESS]['deployment']['image'] == 'cloud-harness/accounts:1'
@@ -145,8 +146,10 @@ def test_collect_helm_values_noreg_noinclude(tmp_path):
145146

146147
assert values[KEY_TASK_IMAGES]
147148
assert 'cloudharness-base' in values[KEY_TASK_IMAGES]
148-
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'cloud-harness/cloudharness-base:1'
149-
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'resources/myapp-mytask:1'
149+
assert values[KEY_TASK_IMAGES]['cloudharness-base'] == 'testprojectname/cloudharness-base:1'
150+
assert values[KEY_TASK_IMAGES]['myapp-mytask'] == 'testprojectname/myapp-mytask:1'
151+
assert values[KEY_TASK_IMAGES]['my-common'] == 'testprojectname/my-common:1'
152+
150153

151154

152155
def test_collect_helm_values_precedence(tmp_path):
@@ -304,9 +307,9 @@ def create():
304307
values = create()
305308

306309
# Auto values are set by using the directory hash
307-
assert 'reg/resources/myapp:' in values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image']
308-
assert 'reg/resources/myapp:' in values.apps['myapp'].harness.deployment.image
309-
assert 'resources/myapp-mytask' in values[KEY_TASK_IMAGES]['myapp-mytask']
310+
assert 'reg/testprojectname/myapp:' in values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image']
311+
assert 'reg/testprojectname/myapp:' in values.apps['myapp'].harness.deployment.image
312+
assert 'testprojectname/myapp-mytask' in values[KEY_TASK_IMAGES]['myapp-mytask']
310313
assert values[KEY_APPS]['myapp'][KEY_HARNESS]['deployment']['image'] == values.apps['myapp'].harness.deployment.image
311314
v1 = values.apps['myapp'].harness.deployment.image
312315
c1 = values["task-images"]["my-common"]
@@ -360,7 +363,7 @@ def create():
360363
finally:
361364
fname.unlink()
362365

363-
fname = Path(CLOUDHARNESS_ROOT) / 'atestfile'
366+
fname = Path(RESOURCES) / 'atestfile'
364367
try:
365368
fname.write_text('a')
366369

0 commit comments

Comments
 (0)