Skip to content

Commit 0157b8a

Browse files
Release 0.7.0 (#264)
* Bump chart to 0.5.0-a2 * Bump service to 0.5.0-a2 * Updated administrator docs with post auth hook * feat: added extraEnv variable to chart * Bump chart to 0.5.0-a3 * chart: fixed wrong extraEnv identation * Bump chart to 0.5.0-a4 * feat: add envs to celery worker * Bump chart to 0.5.0-a5 * fix: added grader-service-config to db-migration * Bump chart to 0.5.0-a6 * Revert "Update file pattern in grading executors" This reverts commit 86ab0f3. * Revert "Changed default notebook matcher pattern to **/*.ipynb; Added recusrive flag for glob.glob to search in sub directories" This reverts commit 5926837. * Bump service to 0.5.0-a3 * Revert "Bump service to 0.5.0-a3" This reverts commit 9c3cd75. * Bump chart to 0.5.0-a7 * Bump service to 0.5.0-a3 * Bump chart to 0.5.0-a8 * Update alembic migrate with GraderService instance to get db_url instead of regex pattern * Bump chart to 0.5.0-a9 * Bump service to 0.5.0-a4 * Fix alembic revision for oauth * fix: added custom command for chart * Bump chart to 0.5.0-a10 * Bump service to 0.5.0-a5 * refactor: cleaned migrate and env.py * Fix name of column in user table for oauth migrate Quote user table name for postgres select * Bump chart to 0.5.0-a11 * Bump service to 0.5.0-a6 * Fix quotes for UPDATE user SQL statement in oauth revision Fix command of db-migration init-container (removed /bin/sh) * Bump chart to 0.5.0-a12 * Bump service to 0.5.0-a7 * Fix check if GraderService has been instantiated and config has been loaded for Worker Add better logging for incorrect submission Disable authentication redirect for base path in GraderService * Bump chart to 0.5.0-a13 * Bump service to 0.5.0-a8 * Add health endpoint to unauthenticated list * Bump chart to 0.5.0-a14 * Bump service to 0.5.0-a9 * Re-add service.set_config() so that RequestHandlerConfig() is set correctly * Bump chart to 0.5.0-a15 * Bump service to 0.5.0-a10 * Fix base template for login views * Bump chart to 0.5.0 * Bump service to 0.5.0 * feat: updated dev env * fix: changed import of logouthandler to fix logout endpoint * Bump chart to 0.5.1 * Bump service to 0.5.1 * feat: added logout and no auth error page to lti authenticator * Bump chart to 0.5.2-a1 * Bump service to 0.5.2-a1 * Revert "Bump service to 0.5.2-a1" This reverts commit 1d0f595. * Bump service to 0.5.2-a1 * fix: stop throwing errors after request is finished * Bump chart to 0.5.2-a2 * Bump service to 0.5.2-a2 * fix: remove the correct cookie in lti logout handler * Bump chart to 0.5.2-a3 * Bump service to 0.5.2-a3 * fix: logout now correct cookie * Bump chart to 0.5.2-a4 * Bump service to 0.5.2-a4 * Fix logout by implementing correct logout procedure in base_handler.py * Fix filtering of APIToken for logout in base_handler.py * Bump chart to 0.5.2-a5 * Bump service to 0.5.2-a5 * docs: change dev environment authenticator * fix: hardcode expires token value * Bump chart to 0.5.2-a6 * Bump service to 0.5.2-a6 * Added configurable cookie secret * fix: removed db_url logging because it is a security vulnerability * fix: Don't allow user to delete submission if feedback for that submission was generated, also don't allow deleting submission if deadline is over. #53 * fix: changed lti task calling to delay * Slightly fancier logout page * Bump chart to 0.5.2-a7 * Bump service to 0.5.2-a7 * fix: updated sql queries to use feedback status * Bump chart to 0.5.2-a8 * Bump service to 0.5.2-a8 * Revert "Bump service to 0.5.2-a8" This reverts commit bc3e9fe. * Bump service to 0.5.2-a8 * fix: added brackets * Bump chart to 0.5.2-a9 * Bump service to 0.5.2-a9 * fix: added result collection to lti endpoint * Bump chart to 0.5.2-a10 * Bump service to 0.5.2-a10 * Add TODOs to documentation * chore: removed deprecated grader-convert package from examples * Initial book documentation and converting rst files to md * chore: sorted dependencies * fix: get typing object from non deprecated import * fix: updated utc time collection with non deprecated function * Update requirements-docs.txt to work with new theme * Added architecture overview image * Added TODOs and copied missing documentation from release-0.5.0. * Broke installation and administrator pages to smaller units, to get toggles in the left sidebar. * Added TU Vienna icon link to the left sidebar, updated installation script in dev_environment, updated installation from source docs. * Minimal config setup in dev environment * Updated system_architecture.md Deleted examples/lab * refactor: updated traitlet configuration of lti plugin and the corresponding chart values * Organize markdown files in directories. * Updated student guide, removed old photos and updated them with relevant ones. * Updated student and instructor guide. TODO: Sections in instructor guide from "Customizing Assignment Creation with grader_config.py" have to be updated. * feat: added file status enum * chore: updated all packages and removed unused packages for version 0.6 * refactor: use / instead /services/grader as a default base url, also add /api to each api endpoint * chore: update all api models * refactor: updated session creation logic, also use timezone aware dates instead of deprecated function utcnow() * chore: added clear and homogeneous error handling using reason params * Updated instructor guide. # TODO: add documentation for edit submission feature. * Extend system architecture docs Update grader_architecture.excalidraw.svg to include indication for helm chart components and excalidraw source * Documented edit submission feature. * fix: added /services/grader back in as base url prefix * Updated about page + added documentation of pushing only selected files. * Try to install example chart in ci * Try to install example chart in ci * Try to install example chart in ci now with rabbitmq * Try to install example chart in ci now with waiting for ingress-nginx * Check deployment status using kubectl rollout status * Check deployment status using kubectl rollout status now with hub * Also wait for rabbit mq pod to run * Run curl * Fixed curl * Fixed curl 2 * Fixed curl 3 * Fixed curl 4 * Fixed curl 5 * Fixed curl 6 * Fixed curl 7 * Fixed curl 8 * fix: added check if assignment has no deadline * feat: added bruno api test collection * chore: removed old docker image * test: added new api request tests and updated version handler * fix: for delete submission feature there has been problem with date format when checking if deadline has passed because of date format changes, we can't compare offset-naive and offset-aware datetimes -> fixed that * Fix: ensure assignment.automatic_grading is AutoGradingBehaviour Enum and not a string when creating assignment. When first starting application and trying to create new assignment, grader service wasn't recognising assignment.automatic_grading enum type, but mistaking it for a string, which threw 500 error. * fix: updated cookie path to always match base url without trailing slash * fix: fixed bug where assignment could not be updated because of non functioning enum * Bump chart to 0.6.0-a1 * Bump service to 0.6.0-a1 * test: updated tests to reflect new enum management * Revert "Bump service to 0.6.0-a1" This reverts commit 60517d6. * Revert "Bump chart to 0.6.0-a1" This reverts commit 6148703. * Bump chart to 0.6.0-a1 * Bump service to 0.6.0-a1 * fix: remove useless health liveness container * Bump chart to 0.6.0 * Bump service to 0.6.0 * fix: delete numpydoc import from docs config, it causes a problem in building the docs. * chore: return list of lectures sorted by id * Update get_started_instructor.md * Fix submission delete state * Remove connectivity check in chart CI test * Bump chart to 0.6.1 * Bump service to 0.6.1 * feat: added async io loop check in kube grader * Bump chart to 0.6.2 * Bump service to 0.6.2 * merge release 0.7.0 * chore: format autograder logs as timestamp/level-name/message, so they can be shown properly to the user #249 * chore: remove false positive warnings about checksum from autograde logs. #249 * chore: use log level info for signaling overwriting of cell's source. #249 * Implement GET for all submissions lecture * Update doc string of GET method * import Assignments in submissions handler, add missing submissions bruno file * 262 refactor assignment customisation options (#263) * refactor: added configurationable values for grading poll intervals and max grading time * Bump chart to 0.6.3 * Bump service to 0.6.3 * fix: updated rabbitmq timeout to increase max grading time * Bump chart to 0.6.4 * ci: removed management ci actions * feat: updated lti process by changing rest method and including new sync options * chore: make function get_latest and get_best_submissions reusable for both student and instructor version #250 * fix: updated oauth_login endpoints * refactor: changed kube autograde pod name to enhance user experience Refs: #253 * feat: added new customisation options to kube_grader and deprecated old ones. KubeGrader has now multiple new options to customise autograding pods (labels, tolerations, image pull secrets). Furthermore, autograding pods can be dynamically adapted before startup using the `post_auth_hook` traitlet. Refs: #259 * refactor: added new kube customisation options to chart and deprecated old settings * WIP: updated assignment model and setup running build with some default replacements * feat: added new configuration option 'allowed_files' which contains glob patterns used to whitelist additional submission files * feat: added assignment settings functionality to kube grader --------- Co-authored-by: Marijana Petojevic <[email protected]> * ci: build and test grader service on pullrequest * Bump chart to 0.7.0-a1 * Bump service to 0.7.0-a1 * fix: fixed spacing of config vars in helm chart * Bump chart to 0.7.0-a2 * Bump chart to 0.7.0-a3 * fix: removed no new lines templating from chart * Bump chart to 0.7.0-a4 * fix: added default json serialize function to handle datetime case * Bump chart to 0.7.0-a5 * Bump service to 0.7.0-a2 * Bump chart to 0.7.0-a6 * refactor: moved assignment settings collection to a utils function * Bump chart to 0.7.0-a7 * Bump service to 0.7.0-a3 * fix: set assignment settings env to valid json * Bump chart to 0.7.0-a8 * Bump service to 0.7.0-a4 * fix: removed unpacking of params and use original values * ci: upgrade to new upload-artifact action * fix: updated model imports to fix tests * fix: use pickle instead of json serial * fix: moved to single serialize * chore: updated types in celery task * fix: wrong imports of submission * refactor: added grader_config.py back in as a configuration file * refactor: updated errorhandling for lti endpoint * chore: added logger to configurable function * Bump chart to 0.7.0-a9 * Bump service to 0.7.0-a5 * refactor: send submissions id instead of whole object to lti endpoint * fix: make deadline timezone aware * fix: removed redudant group by from query * Bump chart to 0.7.0 * Bump service to 0.7.0 * ci: updated deprecated action * fix: added configuration option for pre_spawn_hook * Bump chart to 0.7.1 * Bump service to 0.7.1 * fix: removed redundant code passage * Bump chart to 0.7.2 * Bump service to 0.7.2 * fix: updated commit logic of autograder to properly handle special chars in filenames (#266) * Bump chart to 0.7.3 * Bump service to 0.7.3
1 parent b3fce52 commit 0157b8a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1548
-1181
lines changed

.github/workflows/action_main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
name: MAIN
22

33
on:
4+
pull_request:
5+
branches:
6+
- main
7+
- release-*
48
push:
59
tags:
610
- grader-service-* # for release_helm action

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
4949
# Upload Artifacts
5050
- name: Archive service artifacts
51-
uses: actions/upload-artifact@v3
51+
uses: actions/upload-artifact@v4
5252
with:
5353
name: dist-service
5454
retention-days: 1

.github/workflows/publish_helm.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ name: Release Charts
22

33
on:
44
workflow_call:
5+
workflow_dispatch:
56

67
jobs:
78
release:

.github/workflows/publish_service.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
python -m pip install --upgrade pip
3030
pip install twine
3131
- name: Download a labextension artifact
32-
uses: actions/download-artifact@v3
32+
uses: actions/download-artifact@v4
3333
with:
3434
name: dist-service
3535
path: ./dist

README.rst

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,13 @@ This repository contains all the necessary packages for a full installation of t
103103
pip install grader-labextension
104104
105105
106+
Development Environment
107+
^^^^^^^^^^^^^^^^^^^^^^^^
108+
109+
Alternatively you can run the installation scripts in ``examples/dev_environment``.
110+
Follow the documentation there. The directory also contains the config files for a local installation.
106111

107-
.. installation-end
112+
.. installation-from-soruce-end
108113
109114
.. installation-from-soruce-start
110115
@@ -141,3 +146,105 @@ Configuration
141146
===============
142147
Check out the ``examples/dev_environment`` directory which contains configuration details or the (Administrator Guide)[https://grader-service.readthedocs.io/en/latest/admin/administrator.html].
143148

149+
In order to use the grader service with an LMS like Moodle, the groups first have to be added to the JupyterHub so the grader service gets the necessary information from the hub.
150+
151+
For this purpose, the `LTI 1.3 Authenticator <https://github.com/TU-Wien-dataLAB/lti13oauthenticator>`_ can be used so that users from the LMS can be added to the JupyterHub.
152+
153+
To automatically add the groups for the grader service from the LTI authenticator, the following `post auth hook <https://jupyterhub.readthedocs.io/en/stable/api/auth.html#jupyterhub.auth.Authenticator.post_auth_hook>`_ can be used.
154+
155+
.. code-block:: python
156+
157+
from jupyterhub import orm
158+
import sqlalchemy
159+
160+
def post_auth_hook(authenticator, handler, authentication):
161+
db: sqlalchemy.orm.session.Session = authenticator.db
162+
log = authenticator.log
163+
164+
course_id = authentication["auth_state"]["course_id"].replace(" ","")
165+
user_role = authentication["auth_state"]["user_role"]
166+
user_name = authentication["name"]
167+
168+
# there are only Learner and Instructors
169+
if user_role == "Learner":
170+
user_role = "student"
171+
elif user_role == "Instructor":
172+
user_role = "instructor"
173+
user_model: orm.User = orm.User.find(db, user_name)
174+
if user_model is None:
175+
user_model = orm.User()
176+
user_model.name = user_name
177+
db.add(user_model)
178+
db.commit()
179+
180+
group_name = f"{course_id}:{user_role}"
181+
group = orm.Group.find(db, group_name)
182+
if group is None:
183+
log.info(f"Creating group: '{group_name}'")
184+
group = orm.Group()
185+
group.name = group_name
186+
db.add(group)
187+
db.commit()
188+
189+
extra_grader_groups = [g for g in user_model.groups if g.name.startswith(f"{course_id}:") and g.name != group_name]
190+
for g in extra_grader_groups:
191+
log.info(f"Removing user from group: {g.name}")
192+
g.users.remove(user_model)
193+
db.commit()
194+
195+
if user_model not in group.users:
196+
log.info(f"Adding user to group: {group.name}")
197+
group.users.append(user_model)
198+
db.commit()
199+
200+
return authentication
201+
202+
203+
Make sure that the ``course_id`` does not contain any spaces or special characters!
204+
205+
Optional Configuration of JupyterLab >=3.4
206+
==========================================
207+
208+
The grader labextension also uses the embedded cell toolbar of JupyterLab for further cell manipulation.
209+
These optional features include:
210+
211+
* ``Run Cell``: This command simply run the current cell without advancing.
212+
213+
* ``Revert Cell``: In the conversion process new metadata is set to allow students to revert every answer cell to their original state.
214+
215+
* ``Show Hint``: Students can access a hint to a task if one is specified.
216+
217+
To access these commands buttons have to be added to the JupyterLab cell toolbar by editing the `overrides.json file <https://jupyterlab.readthedocs.io/en/stable/user/directories.html#overridesjson>`_.
218+
We also recommend that all other built in cell toolbar buttons should be disabled in the config because they might enable unwanted cell manipulation by students.
219+
220+
A sample overrides.json file could look like this:
221+
222+
.. code-block:: json
223+
224+
{
225+
"@jupyterlab/cell-toolbar-extension:plugin": {
226+
"toolbar": [
227+
{
228+
"args": {},
229+
"command": "notebookplugin:run-cell",
230+
"disabled": false,
231+
"rank": 501,
232+
"name": "run-cell"
233+
},
234+
{
235+
"args": {},
236+
"command": "notebookplugin:revert-cell",
237+
"disabled": false,
238+
"rank": 502,
239+
"name": "revert-cell"
240+
},
241+
{
242+
"args": {},
243+
"command": "notebookplugin:show-hint",
244+
"disabled": false,
245+
"rank": 503,
246+
"name": "show-hint"
247+
}
248+
]
249+
}
250+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
meta {
2+
name: submissions
3+
type: http
4+
seq: 4
5+
}
6+
7+
get {
8+
url: {{grader-base-url}}/api/lectures/1/submissions?filter=latest&format=json
9+
body: none
10+
auth: inherit
11+
}
12+
13+
params:query {
14+
filter: latest
15+
format: json
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
meta {
2+
name: submissions
3+
type: http
4+
seq: 4
5+
}
6+
get {
7+
url: {{grader-base-url}}/api/lectures/1/submissions?filter=latest&format=json
8+
body: none
9+
auth: inherit
10+
}
11+
params:query {
12+
filter: latest
13+
format: json
14+
}

charts/grader-service/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ type: application
1515
# This is the chart version. This version number should be incremented each time you make changes
1616
# to the chart and its templates, including the app version.
1717
# Versions are expected to follow Semantic Versioning (https://semver.org/)
18-
version: 0.6.4
18+
version: 0.7.3
1919

2020
# This is the version number of the application being deployed. This version number should be
2121
# incremented each time you make changes to the application. Versions are not expected to
2222
# follow Semantic Versioning. They should reflect the version the application is using.
2323
# It is recommended to use it with quotes.
24-
appVersion: "0.6.3"
24+
appVersion: "0.7.3"

charts/grader-service/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
github_url = "https://github.com/TU-Wien-dataLAB/grader-service"
44

55
[tool.tbump.version]
6-
current = "0.6.4"
6+
current = "0.7.3"
77

88
# Example of a semver regexp.
99
# Make sure this matches current_version before

charts/grader-service/templates/configmap.yaml

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,43 @@ metadata:
77
{{- include "grader-service.labels" . | nindent 4 }}
88
data:
99
grader_service_config.py: |
10-
{{ .Values.extraConfig | indent 4 }}
10+
# Grader Service Config
11+
### Log Level
12+
c.GraderService.log_level = "{{ .Values.logLevel }}"
1113
12-
{{ if eq .Values.autogradeExecutorClass "KubeAutogradeExecutor" }}
14+
### Autograde Executor
15+
{{- if eq .Values.autogradeExecutorClass "KubeAutogradeExecutor" }}
1316
from grader_service.autograding.kube.kube_grader import KubeAutogradeExecutor
1417
c.RequestHandlerConfig.autograde_executor_class = KubeAutogradeExecutor
15-
{{ else }}
16-
from grader_service.autograding.local_grader import LocalAutogradeExecutor
17-
c.RequestHandlerConfig.autograde_executor_class = LocalAutogradeExecutor
18-
{{ end }}
19-
20-
21-
{{- if .Values.requestHandlerConfig }}
22-
{{- if .Values.requestHandlerConfig.git_max_file_mb }}
23-
c.RequestHandlerConfig.git_max_file_size_mb = {{ .Values.requestHandlerConfig.git_max_file_mb }}
24-
{{- end }}
25-
{{- end }}
26-
2718
c.KubeAutogradeExecutor.kube_context = None
28-
29-
{{- if .Values.kubeAutogradeExecutor.namespace }}
19+
{{- if .Values.kubeAutogradeExecutor.namespace }}
3020
c.KubeAutogradeExecutor.namespace = {{ .Values.kubeAutogradeExecutor.namespace | quote }}
31-
{{- end }}
32-
{{- if .Values.kubeAutogradeExecutor.resolveImageName }}
33-
c.KubeAutogradeExecutor.resolve_image_name = {{ .Values.kubeAutogradeExecutor.resolveImageName }}
34-
{{- else }}
35-
36-
c.KubeAutogradeExecutor.resolve_image_name = lambda l, a: "{{ .Values.kubeAutogradeExecutor.image }}:{{ .Values.kubeAutogradeExecutor.tag | default .Chart.AppVersion }}"
37-
{{- end }}
21+
{{- end }}
3822
c.KubeAutogradeExecutor.volume = {"name": "data", {{- if .Values.hostpath -}}"hostPath": {"path": "{{ .Values.hostpath }}", "type": "DirectoryOrCreate"} {{- else -}} "persistentVolumeClaim": {"claimName": "{{ include "grader-service.fullname" . }}"}{{- end -}} }
3923
c.KubeAutogradeExecutor.extra_volumes = {{ .Values.kubeAutogradeExecutor.extraVolumes | default "[]" }}
4024
c.KubeAutogradeExecutor.extra_volume_mounts = {{ .Values.kubeAutogradeExecutor.extraVolumeMounts | default "[]" }}
25+
c.KubeAutogradeExecutor.labels = {{ .Values.kubeAutogradeExecutor.labels | toJson }}
26+
c.KubeAutogradeExecutor.image_pull_secrets = {{ .Values.kubeAutogradeExecutor.imagePullSecrets | toJson }}
27+
28+
{{- else }}
29+
from grader_service.autograding.local_grader import LocalAutogradeExecutor
30+
c.RequestHandlerConfig.autograde_executor_class = LocalAutogradeExecutor
31+
{{- end }}
32+
33+
{{- if .Values.requestHandlerConfig }}
34+
{{- if .Values.requestHandlerConfig.git_max_file_mb }}
35+
c.RequestHandlerConfig.git_max_file_size_mb = {{ .Values.requestHandlerConfig.git_max_file_mb }}
36+
{{- end }}
37+
{{- end }}
4138

39+
### Database
4240
c.GraderService.db_url = "{{ .Values.db.url }}"
4341
c.GraderService.max_buffer_size = {{ .Values.requestHandlerConfig.max_buffer_size | int }}
4442
c.GraderService.max_body_size = {{ .Values.requestHandlerConfig.max_body_size | int }}
4543

44+
### RabbitMQ
4645
import os
4746
broker_url=f'amqp://{os.getenv("RABBITMQ_GRADER_SERVICE_USERNAME")}:{os.getenv("RABBITMQ_GRADER_SERVICE_PASSWORD")}@rabbitmq-grader-service.{{.Release.Namespace}}.svc.cluster.local'
48-
4947
c.CeleryApp.conf = dict(
5048
broker_url=broker_url,
5149
result_backend='rpc://',
@@ -54,20 +52,21 @@ data:
5452
accept_content=['json'],
5553
broker_connection_retry_on_startup=True,
5654
)
57-
{{- if .Values.ltiSyncGrades.enabled }}
55+
{{- if .Values.ltiSyncGrades.enabled }}
56+
### LTI Grade Sync Plugin
5857
c.LTISyncGrades.enabled = True
59-
{{- if .Values.ltiSyncGrades.sync_on_feedback }}
58+
{{- if .Values.ltiSyncGrades.sync_on_feedback }}
6059
c.LTISyncGrades.sync_on_feedback = True
61-
{{- end }}
60+
{{- end }}
6261
c.LTISyncGrades.token_url = {{ .Values.ltiSyncGrades.token_url | quote }}
6362
c.LTISyncGrades.client_id = {{ .Values.ltiSyncGrades.client_id | quote }}
6463
c.LTISyncGrades.token_private_key = {{ .Values.ltiSyncGrades.token_private_key | quote }}
65-
c.LTISyncGrades.resolve_lti_urls = {{ .Values.ltiSyncGrades.resolve_lti_urls }}
66-
c.LTISyncGrades.username_match = {{ .Values.ltiSyncGrades.username_match | quote }}
67-
{{- end }}
68-
69-
c.GraderService.log_level = "{{ .Values.logLevel }}"
64+
{{- end }}
7065

66+
{{- if .Values.extraConfig }}
67+
### Extra Config
68+
{{ .Values.extraConfig | indent 4 }}
69+
{{- end }}
7170
.gitconfig: |
7271
[user]
7372
name = {{ .Values.gitConfig.gitUser }}

0 commit comments

Comments
 (0)