omneval-devloop 0.0.3__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/build-image.yml +27 -8
- omneval_devloop-0.0.4/.github/workflows/publish-devloop-chart.yml +50 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/PKG-INFO +1 -1
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/poller-deployment.yaml +6 -4
- omneval_devloop-0.0.4/charts/devloop/tests/discord-bot_test.yaml +43 -0
- omneval_devloop-0.0.4/charts/devloop/tests/poller_test.yaml +120 -0
- omneval_devloop-0.0.4/charts/devloop/tests/temporal-worker_test.yaml +74 -0
- omneval_devloop-0.0.3/.github/workflows/publish-devloop-chart.yml +0 -30
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/build-agent-base-image.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/ci.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/publish-discord-bot-image.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/publish-poller-image.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/publish-temporal-worker-image.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/release.yml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.gitignore +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/CODEOWNERS +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/CONTEXT.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/LICENSE +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/README.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/Chart.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/NOTES.txt +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/_helpers.tpl +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/discord-bot-deployment.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/temporal-worker-deployment.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/temporal-worker-service.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/test-values.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/values.yaml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/docs/getting-started.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/docs/temporal-prerequisites.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/Dockerfile +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/entrypoint.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/prompts/diagnosis.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/prompts/implement.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/prompts/merge.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/prompts/plan.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/prompts/review.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/pyproject.toml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/pytest.ini +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/test_entrypoint.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/test_human_question.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/test_project_tests.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/agent-base/test_run_agent.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/Dockerfile +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/activities.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/discord_client.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/main.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/pyproject.toml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/pytest.ini +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/test_text_utils.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/test_thread_store.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/text_utils.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/thread_store.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/discord-bot/uv.lock +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/Dockerfile +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/poll.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/pyproject.toml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/pytest.ini +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/test_poll.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/poller/uv.lock +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/temporal-worker/Dockerfile +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/images/temporal-worker/pyproject.toml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/plan.md +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/pyproject.toml +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/__init__.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/cluster.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/dev_loop.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/dev_loop_logic.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/github_ops.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/k8s_jobs.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/projects.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/schedules.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/shared.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/summarization.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/summarize_activities.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/webhook.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/worker.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/src/devloop/workflows.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_cluster.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_dev_loop.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_docs.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_github_ops.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_github_webhook.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_k8s_jobs.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_projects.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_pure_logic.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_stub_roundtrip.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_summarization.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/tests/test_worker.py +0 -0
- {omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/uv.lock +0 -0
|
@@ -62,24 +62,43 @@ jobs:
|
|
|
62
62
|
username: ${{ github.actor }}
|
|
63
63
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
64
64
|
|
|
65
|
-
- name: Wait for the pinned SDK to
|
|
65
|
+
- name: Wait for the pinned SDK to be downloadable from PyPI
|
|
66
66
|
if: inputs.wait_for_pypi != ''
|
|
67
67
|
run: |
|
|
68
68
|
pkg_ver='${{ inputs.wait_for_pypi }}'
|
|
69
69
|
name="${pkg_ver%%==*}"
|
|
70
70
|
ver="${pkg_ver##*==}"
|
|
71
71
|
url="https://pypi.org/pypi/${name}/${ver}/json"
|
|
72
|
-
echo "Waiting for ${pkg_ver} at ${url}"
|
|
72
|
+
echo "Waiting for ${pkg_ver} files to be downloadable (metadata at ${url})"
|
|
73
|
+
# The JSON metadata endpoint flips to 200 the instant the release is
|
|
74
|
+
# registered, but the wheel/sdist files on files.pythonhosted.org lag a
|
|
75
|
+
# few seconds behind. Polling the metadata alone let the build start in
|
|
76
|
+
# that window, where uv saw the version, failed to download the file,
|
|
77
|
+
# and exited 1 (see v0.0.3). So wait until every published file actually
|
|
78
|
+
# HEADs 200 — the same CDN uv pulls from — not just until metadata exists.
|
|
73
79
|
for i in $(seq 1 40); do
|
|
74
|
-
|
|
75
|
-
if [ "$
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
file_urls=$(curl -s "$url" | jq -r '.urls[].url')
|
|
81
|
+
if [ -n "$file_urls" ]; then
|
|
82
|
+
all_ok=1
|
|
83
|
+
for fu in $file_urls; do
|
|
84
|
+
code=$(curl -s -o /dev/null -w '%{http_code}' --head "$fu")
|
|
85
|
+
if [ "$code" != "200" ]; then
|
|
86
|
+
all_ok=0
|
|
87
|
+
echo "Attempt $i/40: ${fu##*/} not downloadable yet (HTTP $code)"
|
|
88
|
+
break
|
|
89
|
+
fi
|
|
90
|
+
done
|
|
91
|
+
if [ "$all_ok" = "1" ]; then
|
|
92
|
+
echo "Found all ${pkg_ver} files downloadable (attempt $i)"
|
|
93
|
+
exit 0
|
|
94
|
+
fi
|
|
95
|
+
else
|
|
96
|
+
echo "Attempt $i/40: ${pkg_ver} metadata not on PyPI yet"
|
|
78
97
|
fi
|
|
79
|
-
echo "
|
|
98
|
+
echo "Retrying in 15s"
|
|
80
99
|
sleep 15
|
|
81
100
|
done
|
|
82
|
-
echo "ERROR: ${pkg_ver} did not
|
|
101
|
+
echo "ERROR: ${pkg_ver} files did not become downloadable within ~10 minutes"
|
|
83
102
|
exit 1
|
|
84
103
|
|
|
85
104
|
- name: Compute sha-<short>-<epoch> tag
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Test & Lint Devloop Helm Chart
|
|
2
|
+
|
|
3
|
+
# Validates the devloop Helm chart on pull requests: unit tests (helm-unittest)
|
|
4
|
+
# plus packaging + lint. Packaging and publishing the chart as an OCI artifact to
|
|
5
|
+
# ghcr.io/omneval/charts/devloop happens in release.yml on a v* tag.
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
pull_request:
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
unittest:
|
|
12
|
+
name: Unit test chart
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Check out the repo
|
|
16
|
+
uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Set up Helm
|
|
19
|
+
uses: azure/setup-helm@v4
|
|
20
|
+
with:
|
|
21
|
+
# helm-unittest's plugin.yaml uses platformHooks, which requires Helm
|
|
22
|
+
# >= 3.15; this tracks the Helm 4 line used for local development.
|
|
23
|
+
version: v4.2.0
|
|
24
|
+
|
|
25
|
+
- name: Install helm-unittest plugin
|
|
26
|
+
run: helm plugin install https://github.com/helm-unittest/helm-unittest --verify=false
|
|
27
|
+
|
|
28
|
+
- name: Run chart unit tests
|
|
29
|
+
run: helm unittest charts/devloop
|
|
30
|
+
|
|
31
|
+
lint:
|
|
32
|
+
name: Package and lint chart
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
steps:
|
|
35
|
+
- name: Check out the repo
|
|
36
|
+
uses: actions/checkout@v4
|
|
37
|
+
|
|
38
|
+
- name: Set up Helm
|
|
39
|
+
uses: azure/setup-helm@v4
|
|
40
|
+
with:
|
|
41
|
+
version: v4.2.0
|
|
42
|
+
|
|
43
|
+
- name: Package chart
|
|
44
|
+
id: package
|
|
45
|
+
run: |
|
|
46
|
+
helm package charts/devloop/ -u -d .cr-release-packages
|
|
47
|
+
echo "chart=$(ls .cr-release-packages/devloop-*.tgz)" >> "$GITHUB_OUTPUT"
|
|
48
|
+
|
|
49
|
+
- name: Lint chart
|
|
50
|
+
run: helm lint ${{ steps.package.outputs.chart }}
|
{omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/poller-deployment.yaml
RENAMED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
{{- if and .Values.poller.enabled .Values.poller.projects }}
|
|
3
3
|
{{- range $idx, $project := .Values.poller.projects }}
|
|
4
4
|
{{- $sanitizedRepoName := regexReplaceAll "[^a-zA-Z0-9]" .repo "" | lower | trunc 52 -}}
|
|
5
|
+
{{- /* A Kubernetes label value cannot contain "/" (as in owner/name), so derive a valid value. */ -}}
|
|
6
|
+
{{- $projectLabel := .repo | replace "/" "." | trunc 63 | trimSuffix "." -}}
|
|
5
7
|
{{- if $.Values.poller.persistence.enabled }}
|
|
6
8
|
---
|
|
7
9
|
apiVersion: v1
|
|
@@ -11,7 +13,7 @@ metadata:
|
|
|
11
13
|
labels:
|
|
12
14
|
{{- include "devloop.labels" $ | nindent 4 }}
|
|
13
15
|
app.kubernetes.io/component: poller
|
|
14
|
-
app.kubernetes.io/project: {{
|
|
16
|
+
app.kubernetes.io/project: {{ $projectLabel | quote }}
|
|
15
17
|
spec:
|
|
16
18
|
accessModes:
|
|
17
19
|
- {{ $.Values.poller.persistence.accessMode }}
|
|
@@ -30,20 +32,20 @@ metadata:
|
|
|
30
32
|
labels:
|
|
31
33
|
{{- include "devloop.labels" $ | nindent 4 }}
|
|
32
34
|
app.kubernetes.io/component: poller
|
|
33
|
-
app.kubernetes.io/project: {{
|
|
35
|
+
app.kubernetes.io/project: {{ $projectLabel | quote }}
|
|
34
36
|
spec:
|
|
35
37
|
replicas: 1
|
|
36
38
|
selector:
|
|
37
39
|
matchLabels:
|
|
38
40
|
app.kubernetes.io/component: poller
|
|
39
41
|
app.kubernetes.io/instance: {{ $.Release.Name }}
|
|
40
|
-
app.kubernetes.io/project: {{
|
|
42
|
+
app.kubernetes.io/project: {{ $projectLabel | quote }}
|
|
41
43
|
template:
|
|
42
44
|
metadata:
|
|
43
45
|
labels:
|
|
44
46
|
app.kubernetes.io/component: poller
|
|
45
47
|
app.kubernetes.io/instance: {{ $.Release.Name }}
|
|
46
|
-
app.kubernetes.io/project: {{
|
|
48
|
+
app.kubernetes.io/project: {{ $projectLabel | quote }}
|
|
47
49
|
spec:
|
|
48
50
|
{{- with $.Values.poller.imagePullSecrets }}
|
|
49
51
|
imagePullSecrets:
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
suite: discord bot deployment
|
|
2
|
+
templates:
|
|
3
|
+
- templates/discord-bot-deployment.yaml
|
|
4
|
+
tests:
|
|
5
|
+
- it: renders nothing when the bot is disabled
|
|
6
|
+
set:
|
|
7
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
8
|
+
discordBot.enabled: false
|
|
9
|
+
asserts:
|
|
10
|
+
- hasDocuments:
|
|
11
|
+
count: 0
|
|
12
|
+
|
|
13
|
+
- it: sources the token from a Secret when tokenSecret is set
|
|
14
|
+
set:
|
|
15
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
16
|
+
discordBot.tokenSecret:
|
|
17
|
+
name: discord-homelab-agent-bot
|
|
18
|
+
key: TOKEN
|
|
19
|
+
asserts:
|
|
20
|
+
- containsDocument:
|
|
21
|
+
kind: Deployment
|
|
22
|
+
apiVersion: apps/v1
|
|
23
|
+
name: RELEASE-NAME-discord-bot
|
|
24
|
+
- contains:
|
|
25
|
+
path: spec.template.spec.containers[0].env
|
|
26
|
+
content:
|
|
27
|
+
name: DISCORD_TOKEN
|
|
28
|
+
valueFrom:
|
|
29
|
+
secretKeyRef:
|
|
30
|
+
name: discord-homelab-agent-bot
|
|
31
|
+
key: TOKEN
|
|
32
|
+
|
|
33
|
+
- it: falls back to a plain token value when no secret is given
|
|
34
|
+
set:
|
|
35
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
36
|
+
discordBot.tokenSecret: {}
|
|
37
|
+
discordBot.token: "plain-token"
|
|
38
|
+
asserts:
|
|
39
|
+
- contains:
|
|
40
|
+
path: spec.template.spec.containers[0].env
|
|
41
|
+
content:
|
|
42
|
+
name: DISCORD_TOKEN
|
|
43
|
+
value: "plain-token"
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
suite: poller deployment and PVC
|
|
2
|
+
templates:
|
|
3
|
+
- templates/poller-deployment.yaml
|
|
4
|
+
tests:
|
|
5
|
+
- it: renders nothing when the poller is disabled
|
|
6
|
+
set:
|
|
7
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
8
|
+
poller.enabled: false
|
|
9
|
+
poller.projects:
|
|
10
|
+
- repo: "omneval/omneval"
|
|
11
|
+
webhookUrl: "http://x"
|
|
12
|
+
asserts:
|
|
13
|
+
- hasDocuments:
|
|
14
|
+
count: 0
|
|
15
|
+
|
|
16
|
+
- it: renders nothing when no projects are configured
|
|
17
|
+
set:
|
|
18
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
19
|
+
poller.enabled: true
|
|
20
|
+
poller.projects: []
|
|
21
|
+
asserts:
|
|
22
|
+
- hasDocuments:
|
|
23
|
+
count: 0
|
|
24
|
+
|
|
25
|
+
- it: creates one Deployment per project (no PVC when persistence is off)
|
|
26
|
+
set:
|
|
27
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
28
|
+
poller.enabled: true
|
|
29
|
+
poller.persistence.enabled: false
|
|
30
|
+
poller.projects:
|
|
31
|
+
- repo: "omneval/omneval"
|
|
32
|
+
webhookUrl: "http://x"
|
|
33
|
+
- repo: "omneval/devloop"
|
|
34
|
+
webhookUrl: "http://x"
|
|
35
|
+
asserts:
|
|
36
|
+
- hasDocuments:
|
|
37
|
+
count: 2
|
|
38
|
+
- containsDocument:
|
|
39
|
+
kind: Deployment
|
|
40
|
+
apiVersion: apps/v1
|
|
41
|
+
name: RELEASE-NAME-poller-omnevalomneval
|
|
42
|
+
documentIndex: 0
|
|
43
|
+
- containsDocument:
|
|
44
|
+
kind: Deployment
|
|
45
|
+
apiVersion: apps/v1
|
|
46
|
+
name: RELEASE-NAME-poller-omnevaldevloop
|
|
47
|
+
documentIndex: 1
|
|
48
|
+
|
|
49
|
+
# --- Regression guard for the bug that blocked install: an owner/name repo
|
|
50
|
+
# was used verbatim as a label value, which Kubernetes rejects (no "/"). ---
|
|
51
|
+
- it: derives a label-safe project value (never contains a slash)
|
|
52
|
+
set:
|
|
53
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
54
|
+
poller.enabled: true
|
|
55
|
+
poller.persistence.enabled: true
|
|
56
|
+
poller.projects:
|
|
57
|
+
- repo: "omneval/omneval"
|
|
58
|
+
webhookUrl: "http://x"
|
|
59
|
+
documentIndex: 0
|
|
60
|
+
asserts:
|
|
61
|
+
- isKind:
|
|
62
|
+
of: PersistentVolumeClaim
|
|
63
|
+
- equal:
|
|
64
|
+
path: metadata.labels["app.kubernetes.io/project"]
|
|
65
|
+
value: omneval.omneval
|
|
66
|
+
- notMatchRegex:
|
|
67
|
+
path: metadata.labels["app.kubernetes.io/project"]
|
|
68
|
+
pattern: "/"
|
|
69
|
+
# Must satisfy the Kubernetes label-value grammar.
|
|
70
|
+
- matchRegex:
|
|
71
|
+
path: metadata.labels["app.kubernetes.io/project"]
|
|
72
|
+
pattern: "^[A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])?$"
|
|
73
|
+
|
|
74
|
+
- it: keeps the PVC and its claimName name in sync with the Deployment
|
|
75
|
+
set:
|
|
76
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
77
|
+
poller.enabled: true
|
|
78
|
+
poller.persistence.enabled: true
|
|
79
|
+
poller.persistence.storageClassName: longhorn
|
|
80
|
+
poller.persistence.size: 100Mi
|
|
81
|
+
poller.projects:
|
|
82
|
+
- repo: "omneval/omneval"
|
|
83
|
+
webhookUrl: "http://x"
|
|
84
|
+
asserts:
|
|
85
|
+
- hasDocuments:
|
|
86
|
+
count: 2
|
|
87
|
+
- containsDocument:
|
|
88
|
+
kind: PersistentVolumeClaim
|
|
89
|
+
apiVersion: v1
|
|
90
|
+
name: RELEASE-NAME-poller-omnevalomneval-state
|
|
91
|
+
documentIndex: 0
|
|
92
|
+
- equal:
|
|
93
|
+
path: spec.storageClassName
|
|
94
|
+
value: longhorn
|
|
95
|
+
documentIndex: 0
|
|
96
|
+
- equal:
|
|
97
|
+
path: spec.template.spec.volumes[0].persistentVolumeClaim.claimName
|
|
98
|
+
value: RELEASE-NAME-poller-omnevalomneval-state
|
|
99
|
+
documentIndex: 1
|
|
100
|
+
|
|
101
|
+
- it: passes the full repo to GITHUB_REPO and defaults the agent label
|
|
102
|
+
set:
|
|
103
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
104
|
+
poller.enabled: true
|
|
105
|
+
poller.persistence.enabled: false
|
|
106
|
+
poller.projects:
|
|
107
|
+
- repo: "omneval/omneval"
|
|
108
|
+
webhookUrl: "http://hook"
|
|
109
|
+
documentIndex: 0
|
|
110
|
+
asserts:
|
|
111
|
+
- contains:
|
|
112
|
+
path: spec.template.spec.containers[0].env
|
|
113
|
+
content:
|
|
114
|
+
name: GITHUB_REPO
|
|
115
|
+
value: "omneval/omneval"
|
|
116
|
+
- contains:
|
|
117
|
+
path: spec.template.spec.containers[0].env
|
|
118
|
+
content:
|
|
119
|
+
name: AGENT_LABEL
|
|
120
|
+
value: "agent-ready"
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
suite: temporal worker deployment and service
|
|
2
|
+
templates:
|
|
3
|
+
- templates/temporal-worker-deployment.yaml
|
|
4
|
+
- templates/temporal-worker-service.yaml
|
|
5
|
+
tests:
|
|
6
|
+
- it: fails when temporalHost is not provided
|
|
7
|
+
# The validation helper is included in every template; helm aborts the whole
|
|
8
|
+
# render at the first fail() call, which it attributes to this template.
|
|
9
|
+
template: templates/temporal-worker-service.yaml
|
|
10
|
+
set:
|
|
11
|
+
temporalHost: ""
|
|
12
|
+
asserts:
|
|
13
|
+
- failedTemplate:
|
|
14
|
+
errorMessage: "temporalHost is required but was not set. Provide a value like 'temporal-frontend.agents.svc:7233'"
|
|
15
|
+
|
|
16
|
+
- it: renders nothing when the worker is disabled
|
|
17
|
+
set:
|
|
18
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
19
|
+
temporalWorker.enabled: false
|
|
20
|
+
asserts:
|
|
21
|
+
- hasDocuments:
|
|
22
|
+
count: 0
|
|
23
|
+
|
|
24
|
+
- it: names the workload and wires the temporal host
|
|
25
|
+
template: templates/temporal-worker-deployment.yaml
|
|
26
|
+
set:
|
|
27
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
28
|
+
asserts:
|
|
29
|
+
- containsDocument:
|
|
30
|
+
kind: Deployment
|
|
31
|
+
apiVersion: apps/v1
|
|
32
|
+
name: RELEASE-NAME-temporal-worker
|
|
33
|
+
- contains:
|
|
34
|
+
path: spec.template.spec.containers[0].env
|
|
35
|
+
content:
|
|
36
|
+
name: TEMPORAL_HOST
|
|
37
|
+
value: "temporal-frontend.agents.svc:7233"
|
|
38
|
+
|
|
39
|
+
- it: appends extraEnv verbatim and sets the service account
|
|
40
|
+
template: templates/temporal-worker-deployment.yaml
|
|
41
|
+
set:
|
|
42
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
43
|
+
temporalWorker.serviceAccountName: orchestration-worker
|
|
44
|
+
temporalWorker.extraEnv:
|
|
45
|
+
- name: ORCHESTRATION_QUEUE
|
|
46
|
+
value: homelab-orchestration
|
|
47
|
+
asserts:
|
|
48
|
+
- equal:
|
|
49
|
+
path: spec.template.spec.serviceAccountName
|
|
50
|
+
value: orchestration-worker
|
|
51
|
+
- contains:
|
|
52
|
+
path: spec.template.spec.containers[0].env
|
|
53
|
+
content:
|
|
54
|
+
name: ORCHESTRATION_QUEUE
|
|
55
|
+
value: homelab-orchestration
|
|
56
|
+
|
|
57
|
+
- it: exposes webhook and health ports on the service
|
|
58
|
+
template: templates/temporal-worker-service.yaml
|
|
59
|
+
set:
|
|
60
|
+
temporalHost: "temporal-frontend.agents.svc:7233"
|
|
61
|
+
temporalWorker.webhookPort: 8088
|
|
62
|
+
temporalWorker.healthPort: 8080
|
|
63
|
+
asserts:
|
|
64
|
+
- containsDocument:
|
|
65
|
+
kind: Service
|
|
66
|
+
apiVersion: v1
|
|
67
|
+
name: RELEASE-NAME-temporal-worker
|
|
68
|
+
- contains:
|
|
69
|
+
path: spec.ports
|
|
70
|
+
content:
|
|
71
|
+
name: webhook
|
|
72
|
+
port: 8088
|
|
73
|
+
targetPort: webhook
|
|
74
|
+
protocol: TCP
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
name: Lint Devloop Helm Chart
|
|
2
|
-
|
|
3
|
-
# Validates the devloop Helm chart on pull requests. Packaging and publishing the
|
|
4
|
-
# chart as an OCI artifact to ghcr.io/omneval/charts/devloop happens in
|
|
5
|
-
# release.yml on a v* tag.
|
|
6
|
-
|
|
7
|
-
on:
|
|
8
|
-
pull_request:
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
lint:
|
|
12
|
-
name: Package and lint chart
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
steps:
|
|
15
|
-
- name: Check out the repo
|
|
16
|
-
uses: actions/checkout@v4
|
|
17
|
-
|
|
18
|
-
- name: Set up Helm
|
|
19
|
-
uses: azure/setup-helm@v4
|
|
20
|
-
with:
|
|
21
|
-
version: v3.14.0
|
|
22
|
-
|
|
23
|
-
- name: Package chart
|
|
24
|
-
id: package
|
|
25
|
-
run: |
|
|
26
|
-
helm package charts/devloop/ -u -d .cr-release-packages
|
|
27
|
-
echo "chart=$(ls .cr-release-packages/devloop-*.tgz)" >> "$GITHUB_OUTPUT"
|
|
28
|
-
|
|
29
|
-
- name: Lint chart
|
|
30
|
-
run: helm lint ${{ steps.package.outputs.chart }}
|
{omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/build-agent-base-image.yml
RENAMED
|
File without changes
|
|
File without changes
|
{omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/publish-discord-bot-image.yml
RENAMED
|
File without changes
|
|
File without changes
|
{omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/.github/workflows/publish-temporal-worker-image.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{omneval_devloop-0.0.3 → omneval_devloop-0.0.4}/charts/devloop/templates/discord-bot-deployment.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|