36 Commits

Author SHA1 Message Date
f2aab5597d chore: Update Frontend dev tools
Some checks failed
CICD / Build and Push CICD Images (pull_request) Failing after 1m3s
CICD / Source Checks (pull_request) Has been skipped
CICD / Dependency Audits (Informational) (pull_request) Has been skipped
CICD / Build Release Images (pull_request) Has been skipped
CICD / Build Tester Images (pull_request) Has been skipped
CICD / CICD Tests Complete (pull_request) Failing after 9s
CICD / Build CICD Image Failure Postmortem (pull_request) Successful in 10s
CICD / Production Image Failures Postmortem (pull_request) Has been skipped
CICD / Source Lanes Failure Postmortem (pull_request) Has been skipped
CICD / Production Images Complete (pull_request) Failing after 6s
CICD / Runtime Black-Box Integration Tests (pull_request) Has been skipped
CICD / End-to-End Tests (pull_request) Has been skipped
CICD / Integration Tests Failure Postmortem (pull_request) Has been skipped
CICD / E2E Tests Failure Postmortem (pull_request) Has been skipped
CICD / Promote Staging Images To Release (pull_request) Has been skipped
2026-08-20 13:34:11 +00:00
copilotcoder
6db9232f1f ci: retrigger workflow run
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 18m37s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Successful in 2m29s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Build Tester Images (push) Successful in 4m29s
CICD / Dependency Audits (Informational) (push) Successful in 11m12s
CICD / CICD Tests Complete (push) Successful in 6s
CICD / Build Release Images (push) Failing after 17m29s
CICD / Production Images Complete (push) Failing after 9s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Successful in 17s
CICD / End-to-End Tests (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
Renovate Dependency Updates / Renovate Dependencies (push) Successful in 4m31s
2026-07-23 07:59:49 -04:00
copilotcoder
a93bd3c274 fix: continue node tarball case lines
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 43m19s
Renovate Dependency Updates / Renovate Dependencies (push) Successful in 3m52s
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
2026-07-22 23:39:45 -04:00
copilotcoder
ae0c0ac857 fix: install node from upstream tarball
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 1m39s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build CICD Image Failure Postmortem (push) Successful in 12s
CICD / CICD Tests Complete (push) Failing after 7s
CICD / Production Images Complete (push) Failing after 6s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
2026-07-22 23:06:48 -04:00
copilotcoder
a6180a187d fix: install npm in cicd base image
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 11m46s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Build CICD Image Failure Postmortem (push) Successful in 18s
CICD / CICD Tests Complete (push) Failing after 55s
CICD / Production Images Complete (push) Failing after 57s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
2026-07-22 22:37:31 -04:00
copilotcoder
28bfd275e0 chore: refresh gitea hook status
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 24m7s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Production Images Complete (push) Failing after 4s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Build CICD Image Failure Postmortem (push) Successful in 9s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / CICD Tests Complete (push) Failing after 46s
2026-07-22 19:31:25 -04:00
copilotcoder
06e5b2e6c2 Getting ubuntu version in the right place.
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-22 19:26:18 -04:00
copilotcoder
f937f6d3e5 Fixing handling of python version number.
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 12m14s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Build CICD Image Failure Postmortem (push) Successful in 16s
CICD / CICD Tests Complete (push) Failing after 38s
CICD / Production Images Complete (push) Failing after 46s
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-22 17:58:23 -04:00
copilotcoder
ab0ec0887d Getting rid of repeated version numbers.
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 39s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / CICD Tests Complete (push) Failing after 7s
CICD / Build CICD Image Failure Postmortem (push) Successful in 14s
CICD / Production Images Complete (push) Failing after 6s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-22 17:51:22 -04:00
copilotcoder
3db1b0676f chore(ci): centralize runtime and image version constants
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
2026-07-22 17:38:34 -04:00
copilotcoder
cd19d06680 ci(e2e): align Playwright runtime image to 1.61.1
Some checks failed
CICD / Production Images Complete (push) Blocked by required conditions
CICD / Production Image Failures Postmortem (push) Blocked by required conditions
CICD / Runtime Black-Box Integration Tests (push) Blocked by required conditions
CICD / Integration Tests Failure Postmortem (push) Blocked by required conditions
CICD / End-to-End Tests (push) Blocked by required conditions
CICD / E2E Tests Failure Postmortem (push) Blocked by required conditions
CICD / Promote Staging Images To Release (push) Blocked by required conditions
CICD / Build and Push CICD Images (push) Successful in 37m39s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Successful in 4m13s
CICD / Source Checks (push) Successful in 7m34s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / CICD Tests Complete (push) Successful in 5s
CICD / Build Release Images (push) Successful in 4m37s
CICD / Build Tester Images (push) Has been cancelled
2026-07-22 16:36:43 -04:00
copilotcoder
f71025ee1c fix(frontend-image): use repo-pinned yarn for immutable install
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 12m19s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Successful in 3m42s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Successful in 8m20s
CICD / CICD Tests Complete (push) Successful in 5s
CICD / Build Tester Images (push) Successful in 2m54s
CICD / Build Release Images (push) Successful in 11m7s
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Production Images Complete (push) Successful in 4s
CICD / Runtime Black-Box Integration Tests (push) Successful in 1m17s
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / End-to-End Tests (push) Failing after 5m14s
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Successful in 9s
2026-07-22 14:26:11 -04:00
copilotcoder
e61b70c4a0 fix(frontend): restore TS6-compatible lint and type checks
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 37m29s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Successful in 8m58s
CICD / Dependency Audits (Informational) (push) Successful in 1m26s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / CICD Tests Complete (push) Successful in 5s
CICD / Build Release Images (push) Failing after 5m45s
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
CICD / Build Tester Images (push) Has started running
2026-07-22 13:28:30 -04:00
copilotcoder
6c98ee7018 Trying to get all of the version updates in one go.
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 25m14s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Successful in 4m45s
CICD / Source Checks (push) Failing after 13m49s
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / CICD Tests Complete (push) Failing after 8s
CICD / Production Images Complete (push) Failing after 8s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Successful in 17s
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-22 11:10:05 -04:00
copilotcoder
87f977280c fix(frontend): align zod v4 typings and defaults
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
2026-07-22 10:59:55 -04:00
copilotcoder
ff53dec2c2 Trying to make the build and push base image for CICD work.
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 1h7m14s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Failing after 22m43s
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Successful in 17s
CICD / Production Images Complete (push) Failing after 31s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Successful in 31m23s
CICD / CICD Tests Complete (push) Failing after 9s
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-22 07:52:25 -04:00
2bb73a3f6b chore: Update zod to 4.4.3 (#109)
Some checks failed
CICD / Build and Push CICD Images (push) Failing after 2m8s
CICD / Source Checks (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Has been skipped
CICD / Build Release Images (push) Has been skipped
CICD / Build Tester Images (push) Has been skipped
CICD / Build CICD Image Failure Postmortem (push) Successful in 11s
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Production Images Complete (push) Failing after 26s
CICD / Runtime Black-Box Integration Tests (push) Has been skipped
CICD / End-to-End Tests (push) Has been skipped
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / CICD Tests Complete (push) Failing after 33s
CICD / Promote Staging Images To Release (push) Has been skipped
Renovate Dependency Updates / Renovate Dependencies (push) Successful in 22m18s
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJtYWpvci11cGRhdGUiXX0=-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #109
2026-07-21 22:20:46 -04:00
8ba9d5f5d0 chore: Update ubuntu Docker tag to v26 (#106)
Some checks failed
CICD / Build and Push CICD Images (push) Has started running
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJtYWpvci11cGRhdGUiXX0=-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #106
2026-07-21 22:20:21 -04:00
329663ccdf chore: Update @types/node to 24.13.3 (#101)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJtYWpvci11cGRhdGUiXX0=-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #101
2026-07-21 22:20:04 -04:00
1ba01171a1 chore: Update Yarn to 4.17.1 (#100)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #100
2026-07-21 22:19:47 -04:00
9d97f4bec8 Merge pull request 'chore: Update typescript to 5.9.3' (#99) from renovate/typescript-5.x into main
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
Reviewed-on: #99
2026-07-21 22:19:06 -04:00
81ff99fe59 chore: Update typescript to 5.9.3 2026-07-21 22:19:06 -04:00
a51bb70ba0 chore: Update @vue/tsconfig to 0.9.1 (#95)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #95
2026-07-21 22:18:42 -04:00
5fa44e2bec chore: Update @playwright/test to 1.61.1 (#94)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #94
2026-07-21 22:17:44 -04:00
640d3bb767 chore: Update vue to 3.5.40 (#93)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #93
2026-07-21 22:16:56 -04:00
75fdff75cf chore: Update Frontend dev tools (patch) (#91)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #91
2026-07-21 22:15:29 -04:00
4d1069767b chore: Update fastapi to 0.139.2 (#90)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has started running
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #90
2026-07-21 22:15:06 -04:00
9d4db9eaa4 chore: Update @vue/test-utils to 2.4.11 (#89)
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #89
2026-07-21 22:14:25 -04:00
0e76925c90 chore: Update @vitest/coverage-v8 to 3.2.7 (#88)
Some checks failed
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #88
2026-07-21 22:12:41 -04:00
c4f59e4d05 chore: Update @vitejs/plugin-vue to 6.0.8 (#87)
Some checks failed
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|

---

### Release Notes

### Configuration

📅 **Schedule**:

🚦 **Automerge**: Disabled

♻ **Rebasing**: Not rebasing

👥 **Reviewers**: None

---

*This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).*
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4xNzMuMSIsInVwZGF0ZWRJblZlciI6IjQxLjE3My4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJzZWN1cml0eSJdfQ==-->

Co-authored-by: Renovate Bot <renovate@darkhelm.org>
Reviewed-on: #87
2026-07-21 22:12:22 -04:00
copilotcoder
e4925e2023 ci(renovate): force manual runs outside schedule
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
2026-07-21 15:52:58 -04:00
copilotcoder
f037e7138d docs(dev): document Renovate manual dispatch behavior
All checks were successful
CICD / Build and Push CICD Images (push) Successful in 9m42s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Successful in 2m19s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Build Release Images (push) Successful in 9m52s
CICD / Build Tester Images (push) Successful in 12m17s
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Production Images Complete (push) Successful in 3s
CICD / Runtime Black-Box Integration Tests (push) Successful in 1m19s
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / End-to-End Tests (push) Successful in 2m12s
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Successful in 42s
CICD / Dependency Audits (Informational) (push) Successful in 18m45s
CICD / CICD Tests Complete (push) Successful in 4s
2026-07-21 15:04:09 -04:00
copilotcoder
93b4000b20 ci(renovate): run manual dispatch outside schedule in single pass
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
2026-07-21 14:24:45 -04:00
copilotcoder
996a018dad Working on debugging renovate, set log level back to debug.
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-21 13:46:45 -04:00
copilotcoder
b1055ba605 Updating psycopg to 3.3.4
Some checks failed
CICD / Build and Push CICD Images (push) Successful in 12m11s
CICD / Build CICD Image Failure Postmortem (push) Has been skipped
CICD / Source Checks (push) Successful in 2m36s
CICD / Source Lanes Failure Postmortem (push) Has been skipped
CICD / Dependency Audits (Informational) (push) Successful in 1m28s
CICD / CICD Tests Complete (push) Successful in 8s
CICD / Build Tester Images (push) Successful in 6m31s
CICD / Build Release Images (push) Successful in 27m10s
CICD / Production Image Failures Postmortem (push) Has been skipped
CICD / Production Images Complete (push) Successful in 4s
CICD / End-to-End Tests (push) Successful in 6m38s
CICD / E2E Tests Failure Postmortem (push) Has been skipped
CICD / Runtime Black-Box Integration Tests (push) Successful in 21m37s
CICD / Integration Tests Failure Postmortem (push) Has been skipped
CICD / Promote Staging Images To Release (push) Successful in 44s
Renovate Dependency Updates / Renovate Dependencies (push) Failing after 12m58s
Signed-off-by: copilotcoder <copilotcoder@darkhelm.org>
2026-07-20 20:50:10 -04:00
copilotcoder
5efe0446d5 Rename runtime images to explicit plex-playlist names
Some checks failed
CICD / Build CICD Image Failure Postmortem (push) Has been cancelled
CICD / Source Checks (push) Has been cancelled
CICD / Dependency Audits (Informational) (push) Has been cancelled
CICD / CICD Tests Complete (push) Has been cancelled
CICD / Build Release Images (push) Has been cancelled
CICD / Build Tester Images (push) Has been cancelled
CICD / Production Images Complete (push) Has been cancelled
CICD / Production Image Failures Postmortem (push) Has been cancelled
CICD / Build and Push CICD Images (push) Has been cancelled
CICD / Source Lanes Failure Postmortem (push) Has been cancelled
CICD / Runtime Black-Box Integration Tests (push) Has been cancelled
CICD / Integration Tests Failure Postmortem (push) Has been cancelled
CICD / End-to-End Tests (push) Has been cancelled
CICD / E2E Tests Failure Postmortem (push) Has been cancelled
CICD / Promote Staging Images To Release (push) Has been cancelled
2026-07-20 20:44:58 -04:00
22 changed files with 2346 additions and 2657 deletions

View File

@@ -135,9 +135,9 @@ jobs:
if retry_cmd 5 3 env GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" \ if retry_cmd 5 3 env GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" \
git fetch --depth 1 origin "${HEAD_SHA}" >/dev/null 2>&1; then git fetch --depth 1 origin "${HEAD_SHA}" >/dev/null 2>&1; then
git checkout FETCH_HEAD -- Dockerfile.cicd-base .dockerignore scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh git checkout FETCH_HEAD -- Dockerfile.cicd-base .dockerignore versions/ci.env backend/pyproject.toml frontend/package.json scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh
else else
git checkout HEAD -- Dockerfile.cicd-base .dockerignore scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh git checkout HEAD -- Dockerfile.cicd-base .dockerignore versions/ci.env backend/pyproject.toml frontend/package.json scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh
fi fi
chmod +x scripts/compute-cicd-base-hash.sh chmod +x scripts/compute-cicd-base-hash.sh
@@ -324,8 +324,17 @@ jobs:
docker_login_with_retry 5 3 docker_login_with_retry 5 3
PLAYWRIGHT_BROWSERS_MIRROR_TAG="${GITEA_REGISTRY}/darkhelm.org/playwright-browsers:v1.56.1-jammy" set -a
PLAYWRIGHT_BROWSERS_UPSTREAM_TAG="mcr.microsoft.com/playwright:v1.56.1-jammy" # shellcheck source=versions/ci.env
source versions/ci.env
set +a
PYTHON_VERSION="$(python3 -c "from pathlib import Path; import re, tomllib, sys; pyproject = tomllib.loads(Path('backend/pyproject.toml').read_text()); requires_python = pyproject['project']['requires-python']; match = re.search(r'([0-9]+[.][0-9]+)', requires_python); sys.exit('could not derive backend Python version') if not match else None; print(match.group(1))")"
NODE_MAJOR="$(node -p "const pkg = require('./frontend/package.json'); const match = String(pkg.engines?.node ?? '').match(/(\\d+)/); if (!match) throw new Error('could not derive frontend Node major'); match[1]")"
PLAYWRIGHT_BROWSERS_MIRROR_TAG="${GITEA_REGISTRY}/${PLAYWRIGHT_MIRROR_IMAGE}"
PLAYWRIGHT_BROWSERS_UPSTREAM_TAG="${PLAYWRIGHT_IMAGE}"
PLAYWRIGHT_BROWSERS_LOCAL_TAG="$(./scripts/resolve-mirrored-image.sh \ PLAYWRIGHT_BROWSERS_LOCAL_TAG="$(./scripts/resolve-mirrored-image.sh \
--image "${PLAYWRIGHT_BROWSERS_MIRROR_TAG}" \ --image "${PLAYWRIGHT_BROWSERS_MIRROR_TAG}" \
--mirror-image "${PLAYWRIGHT_BROWSERS_MIRROR_TAG}" \ --mirror-image "${PLAYWRIGHT_BROWSERS_MIRROR_TAG}" \
@@ -342,6 +351,10 @@ jobs:
docker build --progress=plain -f Dockerfile.cicd-base \ docker build --progress=plain -f Dockerfile.cicd-base \
--build-arg BASE_IMAGE_VERSION="v1.0.0-${BASE_HASH}" \ --build-arg BASE_IMAGE_VERSION="v1.0.0-${BASE_HASH}" \
--build-arg BASE_IMAGE_HASH="${BASE_HASH}" \ --build-arg BASE_IMAGE_HASH="${BASE_HASH}" \
--build-arg PYTHON_VERSION="${PYTHON_VERSION}" \
--build-arg NODE_MAJOR="${NODE_MAJOR}" \
--build-arg PLAYWRIGHT_VERSION="${PLAYWRIGHT_VERSION}" \
--build-arg PLAYWRIGHT_DISTRO="${PLAYWRIGHT_DISTRO}" \
--build-arg PLAYWRIGHT_BROWSERS_IMAGE="${PLAYWRIGHT_BROWSERS_IMAGE}" \ --build-arg PLAYWRIGHT_BROWSERS_IMAGE="${PLAYWRIGHT_BROWSERS_IMAGE}" \
-t cicd-base:latest . -t cicd-base:latest .
@@ -399,9 +412,9 @@ jobs:
if retry_cmd 5 3 env GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" \ if retry_cmd 5 3 env GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes -o StrictHostKeyChecking=no" \
git fetch --depth 1 origin "${HEAD_SHA}" >/dev/null 2>&1; then git fetch --depth 1 origin "${HEAD_SHA}" >/dev/null 2>&1; then
git checkout FETCH_HEAD -- .dockerignore Dockerfile.cicd Dockerfile.cicd-base scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh git checkout FETCH_HEAD -- .dockerignore Dockerfile.cicd Dockerfile.cicd-base versions/ci.env scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh
else else
git checkout HEAD -- .dockerignore Dockerfile.cicd Dockerfile.cicd-base scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh git checkout HEAD -- .dockerignore Dockerfile.cicd Dockerfile.cicd-base versions/ci.env scripts/compute-cicd-base-hash.sh scripts/resolve-mirrored-image.sh
fi fi
chmod +x scripts/compute-cicd-base-hash.sh chmod +x scripts/compute-cicd-base-hash.sh
chmod +x scripts/resolve-mirrored-image.sh chmod +x scripts/resolve-mirrored-image.sh
@@ -1094,11 +1107,16 @@ jobs:
FRONTEND_BASE_TAG_REF="${FRONTEND_BASE_REPO}:${HEAD_SHA}" FRONTEND_BASE_TAG_REF="${FRONTEND_BASE_REPO}:${HEAD_SHA}"
FRONTEND_BASE_CACHE_REF="${FRONTEND_BASE_REPO}:cache" FRONTEND_BASE_CACHE_REF="${FRONTEND_BASE_REPO}:cache"
NODE_ALPINE_TAG="$(node -p "const pkg = require('./frontend/package.json'); const match = String(pkg.engines?.node ?? '').match(/(\\d+)/); if (!match) throw new Error('could not derive frontend Node major'); match[1] + '-alpine'")"
YARN_VERSION="$(node -p "const pkg = require('./frontend/package.json'); const match = String(pkg.packageManager ?? '').match(/^yarn@(.*)$/); if (!match) throw new Error('could not derive frontend Yarn version'); match[1]")"
retry_registry_op pull "${FRONTEND_BASE_CACHE_REF}" 5 3 || true retry_registry_op pull "${FRONTEND_BASE_CACHE_REF}" 5 3 || true
BUILDKIT_NO_CLIENT_TOKEN=1 DOCKER_BUILDKIT=1 docker build -f Dockerfile.frontend \ BUILDKIT_NO_CLIENT_TOKEN=1 DOCKER_BUILDKIT=1 docker build -f Dockerfile.frontend \
--target deps \ --target deps \
--cache-from "${FRONTEND_BASE_CACHE_REF}" \ --cache-from "${FRONTEND_BASE_CACHE_REF}" \
--build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg NODE_ALPINE_TAG="${FRONTEND_NODE_ALPINE_TAG}" \
--build-arg YARN_VERSION="${FRONTEND_YARN_VERSION}" \
-t plex-playlist-frontend-base:"${HEAD_SHA}" . -t plex-playlist-frontend-base:"${HEAD_SHA}" .
docker tag plex-playlist-frontend-base:"${HEAD_SHA}" "${FRONTEND_BASE_TAG_REF}" docker tag plex-playlist-frontend-base:"${HEAD_SHA}" "${FRONTEND_BASE_TAG_REF}"
docker tag plex-playlist-frontend-base:"${HEAD_SHA}" "${FRONTEND_BASE_CACHE_REF}" docker tag plex-playlist-frontend-base:"${HEAD_SHA}" "${FRONTEND_BASE_CACHE_REF}"
@@ -1173,7 +1191,7 @@ jobs:
return 1 return 1
} }
DEPLOYABLE_BACKEND_REPO="${GITEA_REGISTRY}/darkhelm.org/deployable-backend-staging" DEPLOYABLE_BACKEND_REPO="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-backend-staging"
DEPLOYABLE_BACKEND_TAG_REF="${DEPLOYABLE_BACKEND_REPO}:${HEAD_SHA}" DEPLOYABLE_BACKEND_TAG_REF="${DEPLOYABLE_BACKEND_REPO}:${HEAD_SHA}"
DEPLOYABLE_BACKEND_CACHE_REF="${DEPLOYABLE_BACKEND_REPO}:cache" DEPLOYABLE_BACKEND_CACHE_REF="${DEPLOYABLE_BACKEND_REPO}:cache"
@@ -1182,11 +1200,11 @@ jobs:
DOCKER_BUILDKIT=1 docker build -f Dockerfile.backend \ DOCKER_BUILDKIT=1 docker build -f Dockerfile.backend \
--cache-from "${DEPLOYABLE_BACKEND_CACHE_REF}" \ --cache-from "${DEPLOYABLE_BACKEND_CACHE_REF}" \
--build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg BUILDKIT_INLINE_CACHE=1 \
-t deployable-backend:"${HEAD_SHA}" . -t plex-playlist-backend:"${HEAD_SHA}" .
bash ./scripts/verify-deployable-image-purity.sh --image deployable-backend:"${HEAD_SHA}" --profile backend bash ./scripts/verify-deployable-image-purity.sh --image plex-playlist-backend:"${HEAD_SHA}" --profile backend
docker tag "deployable-backend:${HEAD_SHA}" "${DEPLOYABLE_BACKEND_TAG_REF}" docker tag "plex-playlist-backend:${HEAD_SHA}" "${DEPLOYABLE_BACKEND_TAG_REF}"
docker tag "deployable-backend:${HEAD_SHA}" "${DEPLOYABLE_BACKEND_CACHE_REF}" docker tag "plex-playlist-backend:${HEAD_SHA}" "${DEPLOYABLE_BACKEND_CACHE_REF}"
retry_registry_op push "${DEPLOYABLE_BACKEND_TAG_REF}" 5 4 retry_registry_op push "${DEPLOYABLE_BACKEND_TAG_REF}" 5 4
retry_registry_op push "${DEPLOYABLE_BACKEND_CACHE_REF}" 5 4 retry_registry_op push "${DEPLOYABLE_BACKEND_CACHE_REF}" 5 4
@@ -1281,21 +1299,26 @@ jobs:
return 1 return 1
} }
DEPLOYABLE_FRONTEND_REPO="${GITEA_REGISTRY}/darkhelm.org/deployable-frontend-staging" DEPLOYABLE_FRONTEND_REPO="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-frontend-staging"
DEPLOYABLE_FRONTEND_TAG_REF="${DEPLOYABLE_FRONTEND_REPO}:${HEAD_SHA}" DEPLOYABLE_FRONTEND_TAG_REF="${DEPLOYABLE_FRONTEND_REPO}:${HEAD_SHA}"
DEPLOYABLE_FRONTEND_CACHE_REF="${DEPLOYABLE_FRONTEND_REPO}:cache" DEPLOYABLE_FRONTEND_CACHE_REF="${DEPLOYABLE_FRONTEND_REPO}:cache"
NODE_ALPINE_TAG="$(node -p "const pkg = require('./frontend/package.json'); const match = String(pkg.engines?.node ?? '').match(/(\\d+)/); if (!match) throw new Error('could not derive frontend Node major'); match[1] + '-alpine'")"
YARN_VERSION="$(node -p "const pkg = require('./frontend/package.json'); const match = String(pkg.packageManager ?? '').match(/^yarn@(.*)$/); if (!match) throw new Error('could not derive frontend Yarn version'); match[1]")"
docker_login_with_retry 5 3 docker_login_with_retry 5 3
retry_registry_op pull "${DEPLOYABLE_FRONTEND_CACHE_REF}" 5 3 || true retry_registry_op pull "${DEPLOYABLE_FRONTEND_CACHE_REF}" 5 3 || true
BUILDKIT_NO_CLIENT_TOKEN=1 DOCKER_BUILDKIT=1 docker build -f Dockerfile.frontend \ BUILDKIT_NO_CLIENT_TOKEN=1 DOCKER_BUILDKIT=1 docker build -f Dockerfile.frontend \
--target production \ --target production \
--cache-from "${DEPLOYABLE_FRONTEND_CACHE_REF}" \ --cache-from "${DEPLOYABLE_FRONTEND_CACHE_REF}" \
--build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg BUILDKIT_INLINE_CACHE=1 \
-t deployable-frontend:"${HEAD_SHA}" . --build-arg NODE_ALPINE_TAG="${FRONTEND_NODE_ALPINE_TAG}" \
bash ./scripts/verify-deployable-image-purity.sh --image deployable-frontend:"${HEAD_SHA}" --profile frontend --build-arg YARN_VERSION="${FRONTEND_YARN_VERSION}" \
-t plex-playlist-frontend:"${HEAD_SHA}" .
bash ./scripts/verify-deployable-image-purity.sh --image plex-playlist-frontend:"${HEAD_SHA}" --profile frontend
docker tag "deployable-frontend:${HEAD_SHA}" "${DEPLOYABLE_FRONTEND_TAG_REF}" docker tag "plex-playlist-frontend:${HEAD_SHA}" "${DEPLOYABLE_FRONTEND_TAG_REF}"
docker tag "deployable-frontend:${HEAD_SHA}" "${DEPLOYABLE_FRONTEND_CACHE_REF}" docker tag "plex-playlist-frontend:${HEAD_SHA}" "${DEPLOYABLE_FRONTEND_CACHE_REF}"
retry_registry_op push "${DEPLOYABLE_FRONTEND_TAG_REF}" 5 4 retry_registry_op push "${DEPLOYABLE_FRONTEND_TAG_REF}" 5 4
retry_registry_op push "${DEPLOYABLE_FRONTEND_CACHE_REF}" 5 4 retry_registry_op push "${DEPLOYABLE_FRONTEND_CACHE_REF}" 5 4
@@ -1442,8 +1465,13 @@ jobs:
run: | run: |
set -euo pipefail set -euo pipefail
PLAYWRIGHT_BASE_IMAGE_MIRROR="${GITEA_REGISTRY}/darkhelm.org/playwright-browsers:v1.56.1-jammy" set -a
PLAYWRIGHT_BASE_IMAGE_UPSTREAM="mcr.microsoft.com/playwright:v1.56.1-jammy" # shellcheck source=versions/ci.env
source versions/ci.env
set +a
PLAYWRIGHT_BASE_IMAGE_MIRROR="${GITEA_REGISTRY}/${PLAYWRIGHT_MIRROR_IMAGE}"
PLAYWRIGHT_BASE_IMAGE_UPSTREAM="${PLAYWRIGHT_IMAGE}"
docker_login_with_retry() { docker_login_with_retry() {
attempts="${1:-5}" attempts="${1:-5}"
@@ -1543,6 +1571,8 @@ jobs:
DOCKER_BUILDKIT=1 docker build --pull=false -f Dockerfile.e2e-tester \ DOCKER_BUILDKIT=1 docker build --pull=false -f Dockerfile.e2e-tester \
--cache-from "${E2E_TESTER_CACHE_REF}" \ --cache-from "${E2E_TESTER_CACHE_REF}" \
--build-arg BUILDKIT_INLINE_CACHE=1 \ --build-arg BUILDKIT_INLINE_CACHE=1 \
--build-arg PLAYWRIGHT_VERSION="${PLAYWRIGHT_VERSION}" \
--build-arg PLAYWRIGHT_DISTRO="${PLAYWRIGHT_DISTRO}" \
--build-arg PLAYWRIGHT_BASE_IMAGE="${PLAYWRIGHT_BASE_IMAGE}" \ --build-arg PLAYWRIGHT_BASE_IMAGE="${PLAYWRIGHT_BASE_IMAGE}" \
-t plex-playlist-e2e:"${HEAD_SHA}" . -t plex-playlist-e2e:"${HEAD_SHA}" .
docker tag plex-playlist-e2e:"${HEAD_SHA}" "${E2E_TESTER_TAG_REF}" docker tag plex-playlist-e2e:"${HEAD_SHA}" "${E2E_TESTER_TAG_REF}"
@@ -1806,8 +1836,7 @@ jobs:
COMPOSE_PROJECT_NAME="plex-int-${RUN_ID}-${RUN_ATTEMPT}" COMPOSE_PROJECT_NAME="plex-int-${RUN_ID}-${RUN_ATTEMPT}"
DB_PASSWORD="plex_password" DB_PASSWORD="plex_password"
DB_URL="postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist" DB_URL="postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist"
POSTGRES_IMAGE_MIRROR="${GITEA_REGISTRY}/darkhelm.org/postgres:16-alpine" VERSION_ENV_PATH="/tmp/ci.env"
POSTGRES_IMAGE_UPSTREAM="docker.io/library/postgres:16-alpine"
RESOLVER_PATH="/tmp/resolve-mirrored-image.sh" RESOLVER_PATH="/tmp/resolve-mirrored-image.sh"
if ! command -v docker >/dev/null 2>&1; then if ! command -v docker >/dev/null 2>&1; then
@@ -1839,9 +1868,18 @@ jobs:
RESOLVER_SOURCE_IMAGE="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-cicd:${HEAD_SHA}" RESOLVER_SOURCE_IMAGE="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-cicd:${HEAD_SHA}"
RESOLVER_CONTAINER="$(docker create "${RESOLVER_SOURCE_IMAGE}")" RESOLVER_CONTAINER="$(docker create "${RESOLVER_SOURCE_IMAGE}")"
docker cp "${RESOLVER_CONTAINER}:/workspace/scripts/resolve-mirrored-image.sh" "${RESOLVER_PATH}" docker cp "${RESOLVER_CONTAINER}:/workspace/scripts/resolve-mirrored-image.sh" "${RESOLVER_PATH}"
docker cp "${RESOLVER_CONTAINER}:/workspace/versions/ci.env" "${VERSION_ENV_PATH}"
docker rm -f "${RESOLVER_CONTAINER}" >/dev/null 2>&1 || true docker rm -f "${RESOLVER_CONTAINER}" >/dev/null 2>&1 || true
chmod +x "${RESOLVER_PATH}" chmod +x "${RESOLVER_PATH}"
set -a
# shellcheck source=/tmp/ci.env
source "${VERSION_ENV_PATH}"
set +a
POSTGRES_IMAGE_MIRROR="${GITEA_REGISTRY}/${POSTGRES_MIRROR_IMAGE}"
POSTGRES_IMAGE_UPSTREAM="${POSTGRES_UPSTREAM_IMAGE}"
POSTGRES_IMAGE="$(${RESOLVER_PATH} \ POSTGRES_IMAGE="$(${RESOLVER_PATH} \
--image "${POSTGRES_IMAGE_MIRROR}" \ --image "${POSTGRES_IMAGE_MIRROR}" \
--mirror-image "${POSTGRES_IMAGE_MIRROR}" \ --mirror-image "${POSTGRES_IMAGE_MIRROR}" \
@@ -2113,8 +2151,7 @@ jobs:
DB_PASSWORD="plex_password" DB_PASSWORD="plex_password"
DB_URL="postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist" DB_URL="postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist"
E2E_REPO_DIR="$(mktemp -d)" E2E_REPO_DIR="$(mktemp -d)"
POSTGRES_IMAGE_MIRROR="${GITEA_REGISTRY}/darkhelm.org/postgres:16-alpine" VERSION_ENV_PATH="/tmp/ci.env"
POSTGRES_IMAGE_UPSTREAM="docker.io/library/postgres:16-alpine"
RESOLVER_PATH="/tmp/resolve-mirrored-image.sh" RESOLVER_PATH="/tmp/resolve-mirrored-image.sh"
if ! command -v docker >/dev/null 2>&1; then if ! command -v docker >/dev/null 2>&1; then
@@ -2146,9 +2183,18 @@ jobs:
RESOLVER_SOURCE_IMAGE="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-cicd:${HEAD_SHA}" RESOLVER_SOURCE_IMAGE="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-cicd:${HEAD_SHA}"
RESOLVER_CONTAINER="$(docker create "${RESOLVER_SOURCE_IMAGE}")" RESOLVER_CONTAINER="$(docker create "${RESOLVER_SOURCE_IMAGE}")"
docker cp "${RESOLVER_CONTAINER}:/workspace/scripts/resolve-mirrored-image.sh" "${RESOLVER_PATH}" docker cp "${RESOLVER_CONTAINER}:/workspace/scripts/resolve-mirrored-image.sh" "${RESOLVER_PATH}"
docker cp "${RESOLVER_CONTAINER}:/workspace/versions/ci.env" "${VERSION_ENV_PATH}"
docker rm -f "${RESOLVER_CONTAINER}" >/dev/null 2>&1 || true docker rm -f "${RESOLVER_CONTAINER}" >/dev/null 2>&1 || true
chmod +x "${RESOLVER_PATH}" chmod +x "${RESOLVER_PATH}"
set -a
# shellcheck source=/tmp/ci.env
source "${VERSION_ENV_PATH}"
set +a
POSTGRES_IMAGE_MIRROR="${GITEA_REGISTRY}/${POSTGRES_MIRROR_IMAGE}"
POSTGRES_IMAGE_UPSTREAM="${POSTGRES_UPSTREAM_IMAGE}"
POSTGRES_IMAGE="$(${RESOLVER_PATH} \ POSTGRES_IMAGE="$(${RESOLVER_PATH} \
--image "${POSTGRES_IMAGE_MIRROR}" \ --image "${POSTGRES_IMAGE_MIRROR}" \
--mirror-image "${POSTGRES_IMAGE_MIRROR}" \ --mirror-image "${POSTGRES_IMAGE_MIRROR}" \
@@ -2617,12 +2663,12 @@ jobs:
if [ -z "${STAGING_BACKEND_DIGEST_REF}" ]; then if [ -z "${STAGING_BACKEND_DIGEST_REF}" ]; then
echo "Staging backend digest output missing; deriving from staging tag ${HEAD_SHA}" echo "Staging backend digest output missing; deriving from staging tag ${HEAD_SHA}"
STAGING_BACKEND_DIGEST_REF="$(resolve_staging_digest_from_tag "${GITEA_REGISTRY}/darkhelm.org/deployable-backend-staging" "${HEAD_SHA}")" STAGING_BACKEND_DIGEST_REF="$(resolve_staging_digest_from_tag "${GITEA_REGISTRY}/darkhelm.org/plex-playlist-backend-staging" "${HEAD_SHA}")"
fi fi
if [ -z "${STAGING_FRONTEND_DIGEST_REF}" ]; then if [ -z "${STAGING_FRONTEND_DIGEST_REF}" ]; then
echo "Staging frontend digest output missing; deriving from staging tag ${HEAD_SHA}" echo "Staging frontend digest output missing; deriving from staging tag ${HEAD_SHA}"
STAGING_FRONTEND_DIGEST_REF="$(resolve_staging_digest_from_tag "${GITEA_REGISTRY}/darkhelm.org/deployable-frontend-staging" "${HEAD_SHA}")" STAGING_FRONTEND_DIGEST_REF="$(resolve_staging_digest_from_tag "${GITEA_REGISTRY}/darkhelm.org/plex-playlist-frontend-staging" "${HEAD_SHA}")"
fi fi
if [ -z "${STAGING_BACKEND_DIGEST_REF}" ] || [ -z "${STAGING_FRONTEND_DIGEST_REF}" ]; then if [ -z "${STAGING_BACKEND_DIGEST_REF}" ] || [ -z "${STAGING_FRONTEND_DIGEST_REF}" ]; then
@@ -2683,8 +2729,8 @@ jobs:
PREVIOUS_RELEASE_VERSION="$(printf '%s\n' "${RELEASE_TAG_LIST}" | awk -v current="${RELEASE_VERSION}" 'NF {if ($0 == current) {print prev; found=1; exit} prev=$0} END {if (!found) print prev}')" PREVIOUS_RELEASE_VERSION="$(printf '%s\n' "${RELEASE_TAG_LIST}" | awk -v current="${RELEASE_VERSION}" 'NF {if ($0 == current) {print prev; found=1; exit} prev=$0} END {if (!found) print prev}')"
RELEASE_BACKEND_REPO="${GITEA_REGISTRY}/darkhelm.org/deployable-backend" RELEASE_BACKEND_REPO="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-backend"
RELEASE_FRONTEND_REPO="${GITEA_REGISTRY}/darkhelm.org/deployable-frontend" RELEASE_FRONTEND_REPO="${GITEA_REGISTRY}/darkhelm.org/plex-playlist-frontend"
BACKEND_RELEASE_VERSION_REF="${RELEASE_BACKEND_REPO}:${RELEASE_VERSION}" BACKEND_RELEASE_VERSION_REF="${RELEASE_BACKEND_REPO}:${RELEASE_VERSION}"
BACKEND_RELEASE_TAGGED_REF="${RELEASE_BACKEND_REPO}:${RELEASE_TAGGED_VERSION}" BACKEND_RELEASE_TAGGED_REF="${RELEASE_BACKEND_REPO}:${RELEASE_TAGGED_VERSION}"

View File

@@ -180,7 +180,7 @@ jobs:
RENOVATE_NODE_ARGS: --max-old-space-size=768 RENOVATE_NODE_ARGS: --max-old-space-size=768
RENOVATE_OSV_VULNERABILITY_ALERTS: "false" RENOVATE_OSV_VULNERABILITY_ALERTS: "false"
RENOVATE_FETCH_CHANGELOGS: "off" RENOVATE_FETCH_CHANGELOGS: "off"
LOG_LEVEL: info LOG_LEVEL: debug
run: | run: |
set -euo pipefail set -euo pipefail
@@ -400,10 +400,10 @@ jobs:
# Manual workflow dispatch should execute immediately, regardless of repository schedule windows. # Manual workflow dispatch should execute immediately, regardless of repository schedule windows.
if [ "${GITHUB_EVENT_NAME:-}" = "workflow_dispatch" ]; then if [ "${GITHUB_EVENT_NAME:-}" = "workflow_dispatch" ]; then
export RENOVATE_IGNORE_SCHEDULE="true" export RENOVATE_FORCE='{"schedule":["at any time"]}'
echo "✓ Manual run detected: ignoring Renovate schedule constraints" echo "✓ Manual run detected: forcing Renovate outside schedule windows"
else else
unset RENOVATE_IGNORE_SCHEDULE unset RENOVATE_FORCE
fi fi
# Multi-batch runs must not prune branches created by earlier batches. # Multi-batch runs must not prune branches created by earlier batches.
@@ -412,22 +412,16 @@ jobs:
run_renovate_with_endpoint() { run_renovate_with_endpoint() {
endpoint="$1" endpoint="$1"
enabled_managers="$2" enabled_managers="$2"
batch_label="$3"
batch_node_args="${RENOVATE_NODE_ARGS}"
batch_pr_limit="${RENOVATE_PR_CONCURRENT_LIMIT}"
batch_branch_limit="${RENOVATE_BRANCH_CONCURRENT_LIMIT}"
if [ "${batch_label}" = "npm" ]; then single_pass_node_args="${RENOVATE_NODE_ARGS}"
batch_node_args="--max-old-space-size=1536" single_pass_pr_limit="${RENOVATE_PR_CONCURRENT_LIMIT}"
batch_pr_limit="1" single_pass_branch_limit="${RENOVATE_BRANCH_CONCURRENT_LIMIT}"
batch_branch_limit="1"
fi
export RENOVATE_ENDPOINT="${endpoint}" export RENOVATE_ENDPOINT="${endpoint}"
echo "Running Renovate batch '${batch_label}' with endpoint: ${RENOVATE_ENDPOINT}" echo "Running Renovate single pass with endpoint: ${RENOVATE_ENDPOINT}"
echo "Enabled managers for '${batch_label}': ${enabled_managers}" echo "Enabled managers: ${enabled_managers}"
echo "Node args for '${batch_label}': ${batch_node_args}" echo "Node args: ${single_pass_node_args}"
echo "PR/branch limits for '${batch_label}': ${batch_pr_limit}/${batch_branch_limit}" echo "PR/branch limits: ${single_pass_pr_limit}/${single_pass_branch_limit}"
# shellcheck disable=SC2086 # shellcheck disable=SC2086
docker run --rm ${DOCKER_ADD_HOST_ARG} \ docker run --rm ${DOCKER_ADD_HOST_ARG} \
@@ -448,12 +442,12 @@ jobs:
-e RENOVATE_GIT_AUTHOR \ -e RENOVATE_GIT_AUTHOR \
-e RENOVATE_ONBOARDING \ -e RENOVATE_ONBOARDING \
-e RENOVATE_REQUIRE_CONFIG \ -e RENOVATE_REQUIRE_CONFIG \
-e RENOVATE_PR_CONCURRENT_LIMIT="${batch_pr_limit}" \ -e RENOVATE_PR_CONCURRENT_LIMIT="${single_pass_pr_limit}" \
-e RENOVATE_BRANCH_CONCURRENT_LIMIT="${batch_branch_limit}" \ -e RENOVATE_BRANCH_CONCURRENT_LIMIT="${single_pass_branch_limit}" \
-e RENOVATE_NODE_ARGS="${batch_node_args}" \ -e RENOVATE_NODE_ARGS="${single_pass_node_args}" \
-e RENOVATE_OSV_VULNERABILITY_ALERTS \ -e RENOVATE_OSV_VULNERABILITY_ALERTS \
-e RENOVATE_FETCH_CHANGELOGS \ -e RENOVATE_FETCH_CHANGELOGS \
-e RENOVATE_IGNORE_SCHEDULE \ -e RENOVATE_FORCE \
-e RENOVATE_PRUNE_STALE_BRANCHES \ -e RENOVATE_PRUNE_STALE_BRANCHES \
-e RENOVATE_ENABLED_MANAGERS="${enabled_managers}" \ -e RENOVATE_ENABLED_MANAGERS="${enabled_managers}" \
--entrypoint /bin/sh \ --entrypoint /bin/sh \
@@ -469,30 +463,27 @@ jobs:
renovate --platform "${RENOVATE_PLATFORM}" --endpoint "${RENOVATE_ENDPOINT}" --git-url "${RENOVATE_GIT_URL}" --git-author "${RENOVATE_GIT_AUTHOR}" --onboarding="${RENOVATE_ONBOARDING}" --pr-concurrent-limit "${RENOVATE_PR_CONCURRENT_LIMIT}" --branch-concurrent-limit "${RENOVATE_BRANCH_CONCURRENT_LIMIT}" --osv-vulnerability-alerts="${RENOVATE_OSV_VULNERABILITY_ALERTS}" --enabled-managers "${RENOVATE_ENABLED_MANAGERS}" DarkHelm.org/plex-playlist' renovate --platform "${RENOVATE_PLATFORM}" --endpoint "${RENOVATE_ENDPOINT}" --git-url "${RENOVATE_GIT_URL}" --git-author "${RENOVATE_GIT_AUTHOR}" --onboarding="${RENOVATE_ONBOARDING}" --pr-concurrent-limit "${RENOVATE_PR_CONCURRENT_LIMIT}" --branch-concurrent-limit "${RENOVATE_BRANCH_CONCURRENT_LIMIT}" --osv-vulnerability-alerts="${RENOVATE_OSV_VULNERABILITY_ALERTS}" --enabled-managers "${RENOVATE_ENABLED_MANAGERS}" DarkHelm.org/plex-playlist'
} }
run_batch_with_fallback() { run_single_pass_with_fallback() {
enabled_managers="$1" enabled_managers="$1"
batch_label="$2"
if run_renovate_with_endpoint "${BASE_ENDPOINT}" "${enabled_managers}" "${batch_label}" 2>&1 | tee -a /tmp/renovate.log; then if run_renovate_with_endpoint "${BASE_ENDPOINT}" "${enabled_managers}" 2>&1 | tee -a /tmp/renovate.log; then
return 0 return 0
fi fi
primary_status=$? primary_status=$?
if [ "${primary_status}" -eq 137 ] || tail -n 400 /tmp/renovate.log | grep -qE '(^|[[:space:]])Killed($|[[:space:]])|exitcode '\''137'\''' ; then if [ "${primary_status}" -eq 137 ] || tail -n 400 /tmp/renovate.log | grep -qE '(^|[[:space:]])Killed($|[[:space:]])|exitcode '\''137'\''' ; then
echo "❌ Renovate batch '${batch_label}' terminated by OOM/kill signal on primary endpoint; skipping endpoint retry" echo "❌ Renovate single pass terminated by OOM/kill signal on primary endpoint; skipping endpoint retry"
return "${primary_status}" return "${primary_status}"
fi fi
echo "⚠ Renovate batch '${batch_label}' failed with primary endpoint. Retrying with API endpoint form..." echo "⚠ Renovate single pass failed with primary endpoint. Retrying with API endpoint form..."
run_renovate_with_endpoint "${API_ENDPOINT}" "${enabled_managers}" "${batch_label}" 2>&1 | tee -a /tmp/renovate.log run_renovate_with_endpoint "${API_ENDPOINT}" "${enabled_managers}" 2>&1 | tee -a /tmp/renovate.log
} }
: > /tmp/renovate.log : > /tmp/renovate.log
# Run low-memory batches sequentially to keep peak usage below constrained runner limits. # Run Renovate once across all enabled managers.
run_batch_with_fallback "docker-compose,dockerfile" "containers" run_single_pass_with_fallback "docker-compose,dockerfile,github-actions,npm,pep621"
run_batch_with_fallback "github-actions,pep621" "python-and-actions"
run_batch_with_fallback "npm" "npm"
echo "✓ Renovate execution completed" echo "✓ Renovate execution completed"

View File

@@ -1,8 +1,20 @@
# CICD Base Setup - System dependencies and language runtimes only # CICD Base Setup - System dependencies and language runtimes only
ARG PLAYWRIGHT_BROWSERS_IMAGE=mcr.microsoft.com/playwright:v1.61.1-jammy ARG PLAYWRIGHT_VERSION=1.61.1
ARG PLAYWRIGHT_DISTRO=jammy
ARG PLAYWRIGHT_BROWSERS_IMAGE=mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-${PLAYWRIGHT_DISTRO}
ARG UBUNTU_VERSION=26.04
FROM ${PLAYWRIGHT_BROWSERS_IMAGE} AS playwright-browsers FROM ${PLAYWRIGHT_BROWSERS_IMAGE} AS playwright-browsers
FROM ubuntu:22.04 FROM ubuntu:${UBUNTU_VERSION}
ARG PLAYWRIGHT_VERSION
ARG PYTHON_VERSION=3.14
ARG NODE_MAJOR=24
ARG TYPESCRIPT_VERSION=5.3.3
ARG ESLINT_VERSION=9.33.0
ARG PRETTIER_VERSION=3.6.2
ARG VITE_VERSION=7.1.10
ARG NODE_TYPES_VERSION=20.16.0
# Build args for cache busting (base dependencies change rarely) # Build args for cache busting (base dependencies change rarely)
ARG BASE_IMAGE_VERSION=v1.0.0 ARG BASE_IMAGE_VERSION=v1.0.0
@@ -59,6 +71,11 @@ RUN set -eux; \
exit 1; \ exit 1; \
fi; \ fi; \
done; \ done; \
if apt-cache show libasound2t64 >/dev/null 2>&1; then \
asound_package=libasound2t64; \
else \
asound_package=libasound2; \
fi; \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
git \ git \
curl \ curl \
@@ -77,15 +94,15 @@ RUN set -eux; \
libxrandr2 \ libxrandr2 \
libgbm1 \ libgbm1 \
libxkbcommon0 \ libxkbcommon0 \
libasound2 \ "$asound_package" \
tzdata \ tzdata \
gnupg \ gnupg \
wget \ wget \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Install Python 3.14 with retry and fallback mechanisms # Install Python with retry and fallback mechanisms
RUN for i in 1 2 3; do \ RUN for i in 1 2 3; do \
echo "Attempt $i: Adding deadsnakes PPA..." && \ echo "Attempt $i: Adding deadsnakes PPA..." && \
add-apt-repository -y ppa:deadsnakes/ppa && \ add-apt-repository -y ppa:deadsnakes/ppa && \
find /etc/apt -type f \( -name 'sources.list' -o -name '*.sources' -o -name '*.list' \) -print0 | xargs -0 sed -i 's|http://|https://|g' && \ find /etc/apt -type f \( -name 'sources.list' -o -name '*.sources' -o -name '*.list' \) -print0 | xargs -0 sed -i 's|http://|https://|g' && \
apt-get update && \ apt-get update && \
@@ -94,28 +111,38 @@ RUN for i in 1 2 3; do \
done done
RUN for i in 1 2 3; do \ RUN for i in 1 2 3; do \
echo "Attempt $i: Installing Python 3.14..." && \ echo "Attempt $i: Installing Python ${PYTHON_VERSION}..." && \
timeout 300 apt-get install -y --no-install-recommends \ timeout 300 apt-get install -y --no-install-recommends \
python3.14 \ python${PYTHON_VERSION} \
python3.14-venv \ python${PYTHON_VERSION}-venv \
python3.14-dev && \ python${PYTHON_VERSION}-dev && \
break || \ break || \
(echo "Attempt $i failed, retrying in 15s..." && sleep 15); \ (echo "Attempt $i failed, retrying in 15s..." && sleep 15); \
done && \ done && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Install Node.js 24 with retry mechanism # Install Node.js with retry mechanism
RUN for i in 1 2 3; do \ RUN node_arch="$(dpkg --print-architecture)"; \
echo "Attempt $i: Installing Node.js 24..." && \ case "$node_arch" in \
curl -fsSL --connect-timeout 30 --max-time 300 \ amd64) node_tarball_arch=linux-x64 ;; \
https://deb.nodesource.com/setup_24.x | bash - && \ arm64) node_tarball_arch=linux-arm64 ;; \
find /etc/apt -type f \( -name 'sources.list' -o -name '*.sources' -o -name '*.list' \) -print0 | xargs -0 sed -i 's|http://|https://|g' && \ *) echo "unsupported architecture for Node.js tarball: $node_arch" >&2; exit 1 ;; \
apt-get update && \ esac; \
timeout 300 apt-get install -y --no-install-recommends nodejs && \ for i in 1 2 3; do \
break || \ echo "Attempt $i: Installing Node.js ${NODE_MAJOR}..."; \
(echo "Attempt $i failed, retrying in 15s..." && sleep 15); \ node_version="$(python3 -c "import json, urllib.request; versions = json.load(urllib.request.urlopen('https://nodejs.org/dist/index.json')); print(next(item['version'].lstrip('v') for item in versions if item['version'].startswith('v${NODE_MAJOR}.')))" )"; \
done && \ if curl -fsSLO "https://nodejs.org/dist/v${node_version}/node-v${node_version}-${node_tarball_arch}.tar.xz" && \
rm -rf /var/lib/apt/lists/* tar -xJf "node-v${node_version}-${node_tarball_arch}.tar.xz" -C /usr/local --strip-components=1 && \
rm -f "node-v${node_version}-${node_tarball_arch}.tar.xz"; then \
break; \
fi; \
if [ "$i" -lt 3 ]; then \
echo "Attempt $i failed, retrying in 15s..."; \
sleep 15; \
else \
exit 1; \
fi; \
done
# Enable corepack for yarn and set up Yarn Berry # Enable corepack for yarn and set up Yarn Berry
RUN corepack enable \ RUN corepack enable \
@@ -141,12 +168,12 @@ RUN set -eu && \
RUN echo "=== Installing Global Development Tools ===" && \ RUN echo "=== Installing Global Development Tools ===" && \
# Use npm for global installations (works better than yarn global in Berry) # Use npm for global installations (works better than yarn global in Berry)
npm install -g \ npm install -g \
@playwright/test@1.56.1 \ @playwright/test@${PLAYWRIGHT_VERSION} \
typescript@5.3.3 \ typescript@${TYPESCRIPT_VERSION} \
eslint@9.33.0 \ eslint@${ESLINT_VERSION} \
prettier@3.6.2 \ prettier@${PRETTIER_VERSION} \
vite@7.1.10 \ vite@${VITE_VERSION} \
@types/node@20.16.0 && \ @types/node@${NODE_TYPES_VERSION} && \
# Verify global tools are available # Verify global tools are available
which playwright && \ which playwright && \
which tsc && \ which tsc && \
@@ -207,7 +234,7 @@ RUN echo '#!/bin/bash' > /usr/local/bin/setup-ssh && \
# Verify that all base tools are working # Verify that all base tools are working
RUN echo "=== Base System Verification ===" && \ RUN echo "=== Base System Verification ===" && \
python3.14 --version && \ python${PYTHON_VERSION} --version && \
node --version && \ node --version && \
yarn --version && \ yarn --version && \
uv --version && \ uv --version && \

View File

@@ -1,4 +1,6 @@
ARG PLAYWRIGHT_BASE_IMAGE=mcr.microsoft.com/playwright:v1.61.1-jammy ARG PLAYWRIGHT_VERSION=1.61.1
ARG PLAYWRIGHT_DISTRO=jammy
ARG PLAYWRIGHT_BASE_IMAGE=mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-${PLAYWRIGHT_DISTRO}
FROM ${PLAYWRIGHT_BASE_IMAGE} FROM ${PLAYWRIGHT_BASE_IMAGE}
WORKDIR /workspace/frontend WORKDIR /workspace/frontend

View File

@@ -1,5 +1,9 @@
# Frontend Dockerfile for Vue/Vite TypeScript project # Frontend Dockerfile for Vue/Vite TypeScript project
FROM node:24-alpine AS deps ARG NODE_ALPINE_TAG=24-alpine
ARG YARN_VERSION=4.17.1
FROM node:${NODE_ALPINE_TAG} AS deps
ARG YARN_VERSION
WORKDIR /app WORKDIR /app
@@ -19,7 +23,8 @@ RUN set -eux; \
done; \ done; \
return 1; \ return 1; \
}; \ }; \
retry 5 npm install -g --force @yarnpkg/cli-dist@4.10.3; \ corepack enable; \
retry 5 corepack prepare yarn@${YARN_VERSION} --activate; \
retry 5 yarn install --immutable retry 5 yarn install --immutable
FROM deps AS build FROM deps AS build

View File

@@ -4,23 +4,23 @@ requires = ["hatchling"]
[dependency-groups] [dependency-groups]
dev = [ dev = [
"ruff==0.14.1", "ruff==0.15.22",
"pyright==1.1.410", "pyright==1.1.411",
"pydoclint==0.9.1", "pydoclint==0.9.1",
"pytest==9.1.1", "pytest==9.1.1",
"pytest-asyncio==1.4.0", "pytest-asyncio==1.4.0",
"pytest-cov==7.0.0", "pytest-cov==7.1.0",
"typeguard==4.4.4", "typeguard==4.5.2",
"httpx==0.28.1", # For testing async HTTP calls "httpx==0.28.1", # For testing async HTTP calls
"pytest-mock==3.15.1", "pytest-mock==3.15.1",
# File format and linting tools # File format and linting tools
"pre-commit==4.6.0", # For running pre-commit hooks in CI "pre-commit==4.6.1", # For running pre-commit hooks in CI
"pyyaml==6.0.3", "pyyaml==6.0.3",
"yamllint==1.37.1", "yamllint==1.38.0",
"toml-sort==0.24.3", "toml-sort==0.24.4",
"language-formatters-pre-commit-hooks==2.16.0", # For pretty-format-toml "language-formatters-pre-commit-hooks==2.16.0", # For pretty-format-toml
"xdoctest==1.3.0", # For doctest support # Task runner for unified development workflows "xdoctest==1.3.2", # For doctest support # Task runner for unified development workflows
"poethepoet==0.41.0", "poethepoet==0.48.0",
"bandit>=1.9.4", "bandit>=1.9.4",
"pip-audit>=2.9.0" "pip-audit>=2.9.0"
] ]
@@ -35,9 +35,9 @@ classifiers = [
"Programming Language :: Python :: 3.14" "Programming Language :: Python :: 3.14"
] ]
dependencies = [ dependencies = [
"fastapi==0.139.0", "fastapi==0.139.2",
"sqlalchemy==2.0.51", "sqlalchemy==2.0.51",
"psycopg[binary]==3.2.12", "psycopg[binary]==3.3.4",
"uvicorn==0.51.0" "uvicorn==0.51.0"
] ]
description = "Backend service for Plex playlist management" description = "Backend service for Plex playlist management"

1313
backend/uv.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,7 @@ services:
retries: 12 retries: 12
backend: backend:
image: ${DEPLOYABLE_BACKEND_IMAGE:-deployable-backend:local} image: ${DEPLOYABLE_BACKEND_IMAGE:-plex-playlist-backend:local}
environment: environment:
DATABASE_URL: ${DB_URL:-postgresql://plex_user:plex_password@database:5432/plex_playlist} DATABASE_URL: ${DB_URL:-postgresql://plex_user:plex_password@database:5432/plex_playlist}
ENVIRONMENT: production ENVIRONMENT: production
@@ -22,7 +22,7 @@ services:
condition: service_healthy condition: service_healthy
frontend: frontend:
image: ${DEPLOYABLE_FRONTEND_IMAGE:-deployable-frontend:local} image: ${DEPLOYABLE_FRONTEND_IMAGE:-plex-playlist-frontend:local}
depends_on: depends_on:
backend: backend:
condition: service_started condition: service_started

View File

@@ -13,7 +13,7 @@ services:
retries: 12 retries: 12
backend: backend:
image: ${DEPLOYABLE_BACKEND_IMAGE:-deployable-backend:local} image: ${DEPLOYABLE_BACKEND_IMAGE:-plex-playlist-backend:local}
environment: environment:
DATABASE_URL: ${DB_URL:-postgresql://plex_user:plex_password@database:5432/plex_playlist} DATABASE_URL: ${DB_URL:-postgresql://plex_user:plex_password@database:5432/plex_playlist}
ENVIRONMENT: production ENVIRONMENT: production

View File

@@ -72,12 +72,12 @@
### **Current Release Lifecycle (2026-07)** ### **Current Release Lifecycle (2026-07)**
- Runtime deployable images are published first to staging repositories: - Runtime deployable images are published first to staging repositories:
- `deployable-backend-staging` - `plex-playlist-backend-staging`
- `deployable-frontend-staging` - `plex-playlist-frontend-staging`
- Runtime validation (`Runtime Black-Box Integration Tests` and `End-to-End Tests`) must pass before release tagging. - Runtime validation (`Runtime Black-Box Integration Tests` and `End-to-End Tests`) must pass before release tagging.
- `Promote Release Images` retags validated staging artifacts to release repositories, but only on automated `push` runs to `main`: - `Promote Release Images` retags validated staging artifacts to release repositories, but only on automated `push` runs to `main`:
- `deployable-backend` - `plex-playlist-backend`
- `deployable-frontend` - `plex-playlist-frontend`
- Published release tags: - Published release tags:
- `latest` - `latest`
- `v<major>.<minor>.0` - `v<major>.<minor>.0`

View File

@@ -14,10 +14,10 @@ automation work under epic #66.
Lifecycle note: Lifecycle note:
- CI first builds deployable runtime artifacts in staging repositories - CI first builds deployable runtime artifacts in staging repositories
(`deployable-backend-staging`, `deployable-frontend-staging`). (`plex-playlist-backend-staging`, `plex-playlist-frontend-staging`).
- After integration and E2E validation pass, CI promotes those immutable - After integration and E2E validation pass, CI promotes those immutable
artifacts to release repositories (`deployable-backend`, artifacts to release repositories (`plex-playlist-backend`,
`deployable-frontend`) via tag promotion. `plex-playlist-frontend`) via tag promotion.
Included: Included:

View File

@@ -411,11 +411,11 @@ The pipeline is intentionally staged so expensive image jobs run only after sour
2. Source + audit lanes: 2. Source + audit lanes:
`Source Checks` and `Dependency Audits (Informational)` run after producer completion. Audit failures are intentionally non-blocking so both frontend and backend audits always report. `Source Checks` and `Dependency Audits (Informational)` run after producer completion. Audit failures are intentionally non-blocking so both frontend and backend audits always report.
3. Runtime image lanes: 3. Runtime image lanes:
`Build Release Images` publishes `deployable-backend-staging` and `deployable-frontend-staging`; `Build Tester Images` publishes integration/e2e tester images; then `Production Images Complete` gates downstream runtime tests. `Build Release Images` publishes `plex-playlist-backend-staging` and `plex-playlist-frontend-staging`; `Build Tester Images` publishes integration/e2e tester images; then `Production Images Complete` gates downstream runtime tests.
4. Runtime validation lanes: 4. Runtime validation lanes:
`Runtime Black-Box Integration Tests` and `End-to-End Tests` validate staged runtime artifacts. `Runtime Black-Box Integration Tests` and `End-to-End Tests` validate staged runtime artifacts.
5. Promotion lane: 5. Promotion lane:
`Promote Release Images` runs only for automated `push` events on `main`. It retags validated staging artifacts to release repos (`deployable-backend`, `deployable-frontend`) with `latest`, `v<major>.<minor>.0`, `v<major>.<minor>.<patch>`, and `v<major>.<minor>.<patch>-<7-char-short-sha>` tags. If the `main` commit is untagged, CI creates the next patch tag automatically; if no prior semver tag exists, the bootstrap baseline is `v0.0.0`. `Promote Release Images` runs only for automated `push` events on `main`. It retags validated staging artifacts to release repos (`plex-playlist-backend`, `plex-playlist-frontend`) with `latest`, `v<major>.<minor>.0`, `v<major>.<minor>.<patch>`, and `v<major>.<minor>.<patch>-<7-char-short-sha>` tags. If the `main` commit is untagged, CI creates the next patch tag automatically; if no prior semver tag exists, the bootstrap baseline is `v0.0.0`.
6. Postmortem lanes: 6. Postmortem lanes:
targeted postmortem jobs run when key lanes fail to capture diagnostics even when primary jobs fail early. targeted postmortem jobs run when key lanes fail to capture diagnostics even when primary jobs fail early.
@@ -433,6 +433,16 @@ Current workflow behavior includes:
For details of base/complete image build strategy, see [CI/CD Multi-Stage Build Architecture](CICD_MULTI_STAGE_BUILD.md). For details of base/complete image build strategy, see [CI/CD Multi-Stage Build Architecture](CICD_MULTI_STAGE_BUILD.md).
For incident handling, see [CI/CD Troubleshooting](CICD_TROUBLESHOOTING_GUIDE.md). For incident handling, see [CI/CD Troubleshooting](CICD_TROUBLESHOOTING_GUIDE.md).
### Renovate Manual Run Behavior
The Renovate workflow at `.gitea/workflows/renovate.yml` now treats manual dispatch as an explicit operator override:
- when triggered via `workflow_dispatch`, it forces out-of-window execution by setting `RENOVATE_IGNORE_SCHEDULE=true`
- it also sets `RENOVATE_SCHEDULE="at any time"` for the run
- it executes one single pass across enabled managers instead of splitting work into multiple manager batches
This keeps scheduled behavior unchanged while making manual runs deterministic and immediate.
### Operator Quick Reference ### Operator Quick Reference
Use workflow dispatch when you need deterministic reruns on a specific commit: Use workflow dispatch when you need deterministic reruns on a specific commit:

View File

@@ -94,7 +94,7 @@ export default [
security, security,
}, },
rules: { rules: {
...vue.configs['vue3-essential'].rules, ...vue.configs['essential'].rules,
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
...securityRules, ...securityRules,

View File

@@ -22,29 +22,29 @@
}, },
"dependencies": { "dependencies": {
"vue": "^3.4.0", "vue": "^3.4.0",
"zod": "^3.22.0" "zod": "^4.0.0"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.40.0", "@playwright/test": "^1.40.0",
"@types/node": "^20.0.0", "@types/node": "^24.0.0",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"@vitejs/plugin-vue": "^6.0.0", "@vitejs/plugin-vue": "^6.0.0",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^4.0.0",
"@vue/test-utils": "^2.4.0", "@vue/test-utils": "^2.4.0",
"@vue/tsconfig": "^0.5.0", "@vue/tsconfig": "^0.9.0",
"eslint": "^9.33.0", "eslint": "^10.0.0",
"eslint-plugin-jsdoc": "^50.0.0", "eslint-plugin-jsdoc": "^63.0.0",
"eslint-plugin-security": "^4.0.1", "eslint-plugin-security": "^4.0.1",
"eslint-plugin-tsdoc": "^0.3.0", "eslint-plugin-tsdoc": "^0.5.0",
"eslint-plugin-vue": "^9.28.0", "eslint-plugin-vue": "^10.0.0",
"jsdom": "^23.0.0", "jsdom": "^29.0.0",
"prettier": "3.6.2", "prettier": "3.9.6",
"typescript": "~5.3.0", "typescript": "~6.0.0",
"vite": "^7.1.10", "vite": "^8.0.0",
"vitest": "^3.2.4", "vitest": "^4.0.0",
"vue-eslint-parser": "^9.4.0", "vue-eslint-parser": "^10.0.0",
"vue-tsc": "^2.0.0" "vue-tsc": "^3.0.0"
}, },
"packageManager": "yarn@4.10.3" "packageManager": "yarn@4.17.1"
} }

View File

@@ -46,10 +46,7 @@ function enhancedParse<T>(this: z.ZodType<T>, data: unknown): T {
* @param data - The data to validate against the schema * @param data - The data to validate against the schema
* @returns Safe parse result with success flag and data or error * @returns Safe parse result with success flag and data or error
*/ */
function enhancedSafeParse<T>( function enhancedSafeParse<T>(this: z.ZodType<T>, data: unknown) {
this: z.ZodType<T>,
data: unknown
): z.SafeParseReturnType<unknown, T> {
const result = originalSafeParse.call(this, data); const result = originalSafeParse.call(this, data);
validationCount++; validationCount++;

View File

@@ -22,7 +22,7 @@ export const UserSchema = z.object({
theme: z.enum(['light', 'dark']).default('light'), theme: z.enum(['light', 'dark']).default('light'),
notifications: z.boolean().default(true), notifications: z.boolean().default(true),
}) })
.default({}), .default({ theme: 'light', notifications: true }),
}); });
// Inferred types (no manual type definitions needed) // Inferred types (no manual type definitions needed)

View File

@@ -4,6 +4,7 @@
"exclude": ["src/**/__tests__/*"], "exclude": ["src/**/__tests__/*"],
"compilerOptions": { "compilerOptions": {
"composite": true, "composite": true,
"ignoreDeprecations": "6.0",
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]
@@ -12,6 +13,7 @@
"target": "ES2020", "target": "ES2020",
"module": "ESNext", "module": "ESNext",
"moduleResolution": "bundler", "moduleResolution": "bundler",
"types": ["node", "vite/client", "vitest/globals"],
"strict": true, "strict": true,
"noUnusedLocals": true, "noUnusedLocals": true,
"noUnusedParameters": true, "noUnusedParameters": true,

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,23 @@
#!/usr/bin/env xonsh #!/usr/bin/env xonsh
from pathlib import Path
def load_ci_versions():
env_path = Path(__file__).resolve().parents[2] / "versions" / "ci.env"
values = {}
for raw_line in env_path.read_text().splitlines():
line = raw_line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
key, value = line.split("=", 1)
values[key.strip()] = value.strip()
return values
ci_versions = load_ci_versions()
playwright_tag = ci_versions["PLAYWRIGHT_IMAGE_TAG"]
hosts = [ hosts = [
"kankali.darkhelm.lan", "kankali.darkhelm.lan",
"zhokq.darkhelm.lan", "zhokq.darkhelm.lan",
@@ -14,7 +32,7 @@ remote_code_template = """
mirror_pairs = [ mirror_pairs = [
("ACT_UBUNTU", "ghcr.io/catthehacker/ubuntu:act-latest", "kankali.darkhelm.lan:3001/darkhelm.org/act-ubuntu:act-latest"), ("ACT_UBUNTU", "ghcr.io/catthehacker/ubuntu:act-latest", "kankali.darkhelm.lan:3001/darkhelm.org/act-ubuntu:act-latest"),
("RENOVATE", "ghcr.io/renovatebot/renovate:41", "kankali.darkhelm.lan:3001/darkhelm.org/renovate:41"), ("RENOVATE", "ghcr.io/renovatebot/renovate:41", "kankali.darkhelm.lan:3001/darkhelm.org/renovate:41"),
("PLAYWRIGHT", "mcr.microsoft.com/playwright:v1.56.1-jammy", "kankali.darkhelm.lan:3001/darkhelm.org/playwright-browsers:v1.56.1-jammy"), ("PLAYWRIGHT", "mcr.microsoft.com/playwright:" + __PLAYWRIGHT_TAG__, "kankali.darkhelm.lan:3001/darkhelm.org/playwright-browsers:" + __PLAYWRIGHT_TAG__),
] ]
is_publisher = __IS_PUBLISHER__ is_publisher = __IS_PUBLISHER__
@@ -94,5 +112,10 @@ for label, source_image, mirror_image in mirror_pairs:
for host in hosts: for host in hosts:
print(f"\n=== {host} ===") print(f"\n=== {host} ===")
remote_code = remote_code_template.replace("__IS_PUBLISHER__", "True" if host == publisher_host else "False") quoted_playwright_tag = repr(playwright_tag)
remote_code = (
remote_code_template
.replace("__IS_PUBLISHER__", "True" if host == publisher_host else "False")
.replace("__PLAYWRIGHT_TAG__", quoted_playwright_tag)
)
ssh @(host) @(remote_code) ssh @(host) @(remote_code)

View File

@@ -4,14 +4,26 @@ set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
COMPOSE_FILE="${ROOT_DIR}/compose.ci.e2e.yml" COMPOSE_FILE="${ROOT_DIR}/compose.ci.e2e.yml"
PROJECT_NAME="${COMPOSE_PROJECT_NAME:-plex-e2e-local}" PROJECT_NAME="${COMPOSE_PROJECT_NAME:-plex-e2e-local}"
VERSION_ENV_FILE="${ROOT_DIR}/versions/ci.env"
if [ ! -f "${VERSION_ENV_FILE}" ]; then
echo "❌ Missing version source file: ${VERSION_ENV_FILE}"
exit 1
fi
set -a
# shellcheck source=../versions/ci.env
source "${VERSION_ENV_FILE}"
set +a
mkdir -p "${ROOT_DIR}/frontend/.playwright-artifacts" mkdir -p "${ROOT_DIR}/frontend/.playwright-artifacts"
export DEPLOYABLE_BACKEND_IMAGE="${DEPLOYABLE_BACKEND_IMAGE:-deployable-backend:local}" export DEPLOYABLE_BACKEND_IMAGE="${DEPLOYABLE_BACKEND_IMAGE:-plex-playlist-backend:local}"
export DEPLOYABLE_FRONTEND_IMAGE="${DEPLOYABLE_FRONTEND_IMAGE:-deployable-frontend:local}" export DEPLOYABLE_FRONTEND_IMAGE="${DEPLOYABLE_FRONTEND_IMAGE:-plex-playlist-frontend:local}"
export DB_PASSWORD="${DB_PASSWORD:-plex_password}" export DB_PASSWORD="${DB_PASSWORD:-plex_password}"
export DB_URL="${DB_URL:-postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist}" export DB_URL="${DB_URL:-postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist}"
export E2E_ARTIFACT_DIR="${E2E_ARTIFACT_DIR:-${ROOT_DIR}/frontend/.playwright-artifacts}" export E2E_ARTIFACT_DIR="${E2E_ARTIFACT_DIR:-${ROOT_DIR}/frontend/.playwright-artifacts}"
export PLAYWRIGHT_E2E_IMAGE="${PLAYWRIGHT_E2E_IMAGE:-${PLAYWRIGHT_IMAGE}}"
cleanup() { cleanup() {
docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" down -v --remove-orphans >/dev/null 2>&1 || true docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" down -v --remove-orphans >/dev/null 2>&1 || true
@@ -23,6 +35,7 @@ echo "Running E2E tests against runtime backend/frontend images via compose"
echo "DEPLOYABLE_BACKEND_IMAGE=${DEPLOYABLE_BACKEND_IMAGE}" echo "DEPLOYABLE_BACKEND_IMAGE=${DEPLOYABLE_BACKEND_IMAGE}"
echo "DEPLOYABLE_FRONTEND_IMAGE=${DEPLOYABLE_FRONTEND_IMAGE}" echo "DEPLOYABLE_FRONTEND_IMAGE=${DEPLOYABLE_FRONTEND_IMAGE}"
echo "E2E_ARTIFACT_DIR=${E2E_ARTIFACT_DIR}" echo "E2E_ARTIFACT_DIR=${E2E_ARTIFACT_DIR}"
echo "PLAYWRIGHT_E2E_IMAGE=${PLAYWRIGHT_E2E_IMAGE}"
docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" up -d database backend frontend docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" up -d database backend frontend
@@ -34,5 +47,5 @@ docker run --rm \
-e PLAYWRIGHT_JUNIT_OUTPUT_FILE=/tmp/playwright-artifacts/playwright-results.xml \ -e PLAYWRIGHT_JUNIT_OUTPUT_FILE=/tmp/playwright-artifacts/playwright-results.xml \
-v "${ROOT_DIR}/frontend:/workspace/frontend" \ -v "${ROOT_DIR}/frontend:/workspace/frontend" \
-v "${E2E_ARTIFACT_DIR}:/tmp/playwright-artifacts" \ -v "${E2E_ARTIFACT_DIR}:/tmp/playwright-artifacts" \
mcr.microsoft.com/playwright:v1.56.1-jammy \ "${PLAYWRIGHT_E2E_IMAGE}" \
bash -lc "cd /workspace/frontend && corepack enable && yarn install --immutable && yarn test:e2e --reporter=list --timeout=90000" bash -lc "cd /workspace/frontend && corepack enable && yarn install --immutable && yarn test:e2e --reporter=list --timeout=90000"

View File

@@ -5,7 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
COMPOSE_FILE="${ROOT_DIR}/compose.ci.integration.yml" COMPOSE_FILE="${ROOT_DIR}/compose.ci.integration.yml"
PROJECT_NAME="${COMPOSE_PROJECT_NAME:-plex-int-local}" PROJECT_NAME="${COMPOSE_PROJECT_NAME:-plex-int-local}"
export DEPLOYABLE_BACKEND_IMAGE="${DEPLOYABLE_BACKEND_IMAGE:-deployable-backend:local}" export DEPLOYABLE_BACKEND_IMAGE="${DEPLOYABLE_BACKEND_IMAGE:-plex-playlist-backend:local}"
export DB_PASSWORD="${DB_PASSWORD:-plex_password}" export DB_PASSWORD="${DB_PASSWORD:-plex_password}"
export DB_URL="${DB_URL:-postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist}" export DB_URL="${DB_URL:-postgresql://plex_user:${DB_PASSWORD}@database:5432/plex_playlist}"
@@ -15,7 +15,7 @@ cleanup() {
trap cleanup EXIT trap cleanup EXIT
echo "Running runtime integration checks against deployable backend image via compose" echo "Running runtime integration checks against plex-playlist backend image via compose"
echo "DEPLOYABLE_BACKEND_IMAGE=${DEPLOYABLE_BACKEND_IMAGE}" echo "DEPLOYABLE_BACKEND_IMAGE=${DEPLOYABLE_BACKEND_IMAGE}"
docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" up -d database backend docker compose -p "${PROJECT_NAME}" -f "${COMPOSE_FILE}" up -d database backend

12
versions/ci.env Normal file
View File

@@ -0,0 +1,12 @@
# CI/runtime version source of truth for scripts and docker build args.
# shellcheck disable=SC2034
PLAYWRIGHT_VERSION=1.61.1
PLAYWRIGHT_DISTRO=jammy
PLAYWRIGHT_IMAGE_TAG=v1.61.1-jammy
PLAYWRIGHT_IMAGE=mcr.microsoft.com/playwright:${PLAYWRIGHT_IMAGE_TAG}
PLAYWRIGHT_MIRROR_IMAGE=darkhelm.org/playwright-browsers:${PLAYWRIGHT_IMAGE_TAG}
POSTGRES_IMAGE_TAG=16-alpine
POSTGRES_MIRROR_IMAGE=darkhelm.org/postgres:${POSTGRES_IMAGE_TAG}
POSTGRES_UPSTREAM_IMAGE=docker.io/library/postgres:${POSTGRES_IMAGE_TAG}
UBUNTU_CICD_BASE_VERSION=26.04