-
Notifications
You must be signed in to change notification settings - Fork 1
release: prepare SentinelAI v0.1.0 #24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,26 +1,126 @@ | ||
| name: Automated Release Engineering | ||
| name: SentinelAI Release | ||
|
|
||
| on: | ||
| push: | ||
| branches: | ||
| - main | ||
| tags: | ||
| - "v*.*.*" | ||
| pull_request: | ||
| paths: | ||
| - ".github/workflows/release.yml" | ||
| - "CHANGELOG.md" | ||
| - "RELEASE_NOTES_v0.1.0.md" | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: sentinelai-release-${{ github.ref }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| tagging-engine: | ||
| name: Construct Semantic Version Tags | ||
| validate: | ||
| name: Validate release candidate | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: Verify semantic-version tag and changelog | ||
| if: startsWith(github.ref, 'refs/tags/') | ||
| shell: bash | ||
| run: | | ||
| tag="${{ github.ref_name }}" | ||
| if [[ ! "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | ||
| echo "Invalid semantic-version tag: $tag" >&2 | ||
| exit 1 | ||
| fi | ||
| version="${tag#v}" | ||
| grep -Fq "## [$version]" CHANGELOG.md | ||
|
|
||
| - uses: actions/setup-python@v5 | ||
| with: | ||
| python-version: "3.11" | ||
| cache: pip | ||
|
|
||
| - name: Install Python test dependencies | ||
| run: | | ||
| python -m pip install --upgrade pip | ||
| pip install -r requirements-dev.txt | ||
|
|
||
| - name: Run Python test suite | ||
| env: | ||
| PYTHONPATH: . | ||
| run: pytest tests/ -q | ||
|
|
||
| - uses: actions/setup-go@v5 | ||
| with: | ||
| go-version: "1.21.x" | ||
| cache-dependency-path: ingestion-service/go.sum | ||
|
|
||
| - name: Run Go ingestion tests | ||
| working-directory: ingestion-service | ||
| run: go test ./... | ||
|
|
||
| - name: Build ingestion container | ||
| run: docker build -t sentinelai-ingestion:release ./ingestion-service | ||
|
|
||
| release: | ||
| name: Publish GitHub Release | ||
| if: startsWith(github.ref, 'refs/tags/') | ||
| needs: validate | ||
|
Comment on lines
+70
to
+71
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When a tag points to a commit that has not passed the Useful? React with 👍 / 👎. |
||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: write | ||
|
|
||
| steps: | ||
| - name: ⬇️ Checkout Repository | ||
| uses: actions/checkout@v4 | ||
| - uses: actions/checkout@v4 | ||
| with: | ||
| fetch-depth: 0 | ||
|
|
||
| - name: 🏷️ Calculate Release Version Alpha | ||
| uses: anothrNick/github-tag-action@1.64.0 | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| WITH_V: true | ||
| DEFAULT_BUMP: patch | ||
| - name: Build deterministic source archive and checksum | ||
| run: | | ||
| mkdir -p dist | ||
| git archive --format=tar --prefix="sentinelai-${{ github.ref_name }}/" "${{ github.sha }}" | gzip -n > "dist/sentinelai-${{ github.ref_name }}.tar.gz" | ||
| sha256sum "dist/sentinelai-${{ github.ref_name }}.tar.gz" > "dist/sentinelai-${{ github.ref_name }}.tar.gz.sha256" | ||
|
Comment on lines
+83
to
+84
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When users download the two release assets into one directory and run Useful? React with 👍 / 👎. |
||
|
|
||
| - name: Publish release | ||
| uses: softprops/action-gh-release@v2 | ||
| with: | ||
| body_path: RELEASE_NOTES_v0.1.0.md | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win Select release notes that match the published tag. The workflow accepts every semantic-version tag, but it always publishes Validate and use a tag-specific release-notes file, or generate the body from the matching Proposed fix version="${tag#v}"
grep -Fq "## [$version]" CHANGELOG.md
+ test -f "RELEASE_NOTES_${tag}.md"
...
- body_path: RELEASE_NOTES_v0.1.0.md
+ body_path: RELEASE_NOTES_${{ github.ref_name }}.md🤖 Prompt for AI Agents |
||
| generate_release_notes: false | ||
|
Comment on lines
+87
to
+90
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
For any later accepted tag such as Useful? React with 👍 / 👎. |
||
| files: | | ||
| dist/sentinelai-${{ github.ref_name }}.tar.gz | ||
| dist/sentinelai-${{ github.ref_name }}.tar.gz.sha256 | ||
|
|
||
| publish-container: | ||
| name: Publish GHCR ingestion image | ||
| if: startsWith(github.ref, 'refs/tags/') | ||
| needs: release | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| packages: write | ||
| steps: | ||
| - uses: actions/checkout@v4 | ||
|
|
||
| - uses: docker/login-action@v3 | ||
| with: | ||
| registry: ghcr.io | ||
| username: ${{ github.actor }} | ||
| password: ${{ secrets.GITHUB_TOKEN }} | ||
|
|
||
| - uses: docker/metadata-action@v5 | ||
| id: meta | ||
| with: | ||
| images: ghcr.io/coreyleath-code/sentinelai-ingestion | ||
| tags: | | ||
| type=semver,pattern={{version}} | ||
| type=semver,pattern={{major}}.{{minor}} | ||
| type=raw,value=latest | ||
|
|
||
| - uses: docker/build-push-action@v6 | ||
| with: | ||
| context: ./ingestion-service | ||
| push: true | ||
| tags: ${{ steps.meta.outputs.tags }} | ||
| labels: ${{ steps.meta.outputs.labels }} | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,36 @@ | ||||||||||||||||||||||||||||
| # SentinelAI v0.1.0 | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| SentinelAI v0.1.0 is the first formal portfolio release of the repository's reproducible drift-monitoring reference system. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## Release scope | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| The directly implemented statistical path compares expected and observed histograms with Population Stability Index (PSI) and a Kolmogorov-Smirnov CDF distance, then flags drift when the configured thresholds are crossed. The repository's benchmark evidence is synthetic and reproducible; it is not presented as production drift-detection accuracy, native C++ service latency, or fleet-scale throughput. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## Verified repository surface | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| The release candidate is gated by: | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| - the Python test suite; | ||||||||||||||||||||||||||||
| - Go tests for the ingestion service; | ||||||||||||||||||||||||||||
| - a container build for the ingestion service; | ||||||||||||||||||||||||||||
| - the repository's existing CI, benchmark, schema-validation, and security workflows. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| The existing CI also exercises the ingestion path behind NGINX with three replicas and verifies readiness survives loss of one backend. | ||||||||||||||||||||||||||||
|
Comment on lines
+11
to
+18
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win List only checks that gate release publication.
Remove these claims, or add the named checks as required release-job dependencies. Proposed documentation fix - the Python test suite;
- Go tests for the ingestion service;
- a container build for the ingestion service;
-- the repository's existing CI, benchmark, schema-validation, and security workflows.
-
-The existing CI also exercises the ingestion path behind NGINX with three replicas and verifies readiness survives loss of one backend.📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## Release artifacts | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| A successful `v0.1.0` tag publishes: | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| - a deterministic source archive and SHA-256 checksum on the GitHub Release; | ||||||||||||||||||||||||||||
| - the validated Go ingestion-service container at `ghcr.io/coreyleath-code/sentinelai-ingestion:0.1.0`; | ||||||||||||||||||||||||||||
| - additional GHCR tags for `0.1` and `latest`. | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ## Reproducibility | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| The statistical benchmark can be regenerated with: | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||
| python benchmarks/run_benchmark.py --output benchmarks/latest.json | ||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||
| The release does not add or imply production authorization, calibrated statistical significance, production model-quality guarantees, or cross-hardware performance guarantees. | ||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Do not expand
github.ref_namedirectly in the shell script.A tag name is interpolated before the semantic-version check runs. A crafted tag can execute shell syntax during assignment, even though line 34 later rejects the tag.
Proposed fix
- name: Verify semantic-version tag and changelog if: startsWith(github.ref, 'refs/tags/') shell: bash + env: + TAG: ${{ github.ref_name }} run: | - tag="${{ github.ref_name }}" + tag="$TAG" if [[ ! "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then📝 Committable suggestion
🧰 Tools
🪛 zizmor (1.29.0)
[error] 33-33: code injection via template expansion (template-injection): may expand into attacker-controllable code
(template-injection)
🤖 Prompt for AI Agents
Source: Linters/SAST tools