-
Notifications
You must be signed in to change notification settings - Fork 0
Operationalization Release P0: release integrity and trust hardening #30
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
base: main
Are you sure you want to change the base?
Changes from all commits
1ba015d
678bc1b
4a9d604
3a95f39
412f6ed
d7c65af
2a13004
57f3b37
bda9028
696bd23
ca68325
a050254
65455d0
a3ac6e5
58b9624
0d1eca2
e15d647
cb374e7
1979e5f
7c861c2
0f80fa9
7748185
3ae6188
a60a9fb
73be113
b8b4f54
78f3ef9
2b87bd9
f31c234
2f894af
b6869e3
0a28f0a
95817a8
2f57909
fff86da
cc7c37b
d24368a
b911f86
540edac
7f23ada
a152243
28c12c7
9c3aea4
30c139f
8e348a1
265e116
b03d07f
36fdc34
a0a19be
238574c
7baa783
010c4d7
694fcbf
fdb6a18
7af0d8b
52e3cfb
674ef66
836b7d5
3cf7cf2
5d3f05c
c24ac30
49daef2
56722b0
536c298
b680c68
b78fb10
bdc91e1
0e8714f
0e30874
6449be4
482a35a
089debb
e2422a2
86ef973
a7a7ec9
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,7 +1,4 @@ | ||
| /specs/ @program-governance @scientific-review | ||
| /schemas/ @data-architecture | ||
| /src/weather_platform/scientific/ @probabilistic-modeling @independent-verification | ||
| /deploy/ @platform-sre @security-architecture | ||
| /apps/operator-console/ @platform-sre @product-security | ||
| /.github/workflows/ @platform-sre @product-security | ||
| /docs/NETWORK_BOUNDARY.md @security-architecture | ||
| # The repository is currently owned by a personal account, so organization | ||
| # team handles cannot enforce reviews here. Replace this fallback with real | ||
| # organization teams after repository migration. | ||
| * @Protonmatter |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,6 +2,9 @@ | |
|
|
||
| ## Requirement IDs | ||
|
|
||
| - Specifications: | ||
| - Requirements: | ||
|
|
||
| ## Scientific impact | ||
|
|
||
| - Baseline: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| version: 2 | ||
| updates: | ||
| - package-ecosystem: pip | ||
| directory: / | ||
| schedule: | ||
| interval: weekly | ||
| day: monday | ||
| time: "04:00" | ||
| timezone: America/New_York | ||
| open-pull-requests-limit: 10 | ||
| groups: | ||
| python-production: | ||
| dependency-type: production | ||
| update-types: [minor, patch] | ||
| python-development: | ||
| dependency-type: development | ||
| update-types: [minor, patch] | ||
| ignore: | ||
| - dependency-name: "*" | ||
| update-types: [version-update:semver-major] | ||
|
|
||
| - package-ecosystem: npm | ||
| directory: /apps/operator-console | ||
| schedule: | ||
| interval: weekly | ||
| day: monday | ||
| time: "04:20" | ||
| timezone: America/New_York | ||
| open-pull-requests-limit: 10 | ||
| groups: | ||
| operator-console-production: | ||
| dependency-type: production | ||
| update-types: [minor, patch] | ||
| operator-console-development: | ||
| dependency-type: development | ||
| update-types: [minor, patch] | ||
| ignore: | ||
| - dependency-name: "*" | ||
| update-types: [version-update:semver-major] | ||
|
|
||
| - package-ecosystem: github-actions | ||
| directory: / | ||
| schedule: | ||
| interval: weekly | ||
| day: monday | ||
| time: "04:40" | ||
| timezone: America/New_York | ||
| groups: | ||
| github-actions: | ||
| patterns: ["*"] | ||
|
|
||
| - package-ecosystem: docker | ||
| directory: /deploy/docker | ||
| schedule: | ||
| interval: weekly | ||
| day: monday | ||
| time: "05:00" | ||
| timezone: America/New_York | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,34 +1,65 @@ | ||
| name: build-image | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| tags: ['v*'] | ||
| workflow_dispatch: | ||
| workflow_call: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: release-image-${{ github.ref }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| build: | ||
| runs-on: [self-hosted, linux, weather-build] | ||
| environment: release | ||
| timeout-minutes: 30 | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 | ||
| - name: Require internal registry configuration | ||
| - name: Require internal release configuration | ||
| run: | | ||
| test -n "${{ vars.INTERNAL_REGISTRY }}" | ||
| test -n "${{ vars.PYTHON_BASE_IMAGE }}" | ||
| test -n "${{ vars.PYPI_MIRROR_URL }}" | ||
| test -n "${{ vars.PYPI_MIRROR_ORIGIN }}" | ||
| test -n "${INTERNAL_RELEASE_ATTEST_COMMAND:-}" | ||
| test -f requirements/production.lock | ||
| test -f requirements/ci.lock | ||
| - name: Build wheelhouse from the internal mirror | ||
| env: | ||
| PIP_INDEX_URL: ${{ vars.PYPI_MIRROR_URL }} | ||
| PYPI_MIRROR_ORIGIN: ${{ vars.PYPI_MIRROR_ORIGIN }} | ||
| IMAGE: ${{ vars.INTERNAL_REGISTRY }}/weather/platform:${{ github.sha }} | ||
| BASE_IMAGE: ${{ vars.PYTHON_BASE_IMAGE }} | ||
| INTERNAL_REGISTRY: ${{ vars.INTERNAL_REGISTRY }} | ||
| run: ./scripts/build_image.sh | ||
| - name: Run internal artifact policy and signing | ||
| - name: Push, scan, sign, and attest internally | ||
| env: | ||
| IMAGE: ${{ vars.INTERNAL_REGISTRY }}/weather/platform:${{ github.sha }} | ||
| RELEASE_IMAGE_REF_FILE: release/image-ref.txt | ||
| run: | | ||
| test -n "${INTERNAL_RELEASE_ATTEST_COMMAND:-}" | ||
| mkdir -p release | ||
| bash -lc "$INTERNAL_RELEASE_ATTEST_COMMAND" | ||
| test -s "$RELEASE_IMAGE_REF_FILE" | ||
| - name: Render immutable release evidence | ||
| run: | | ||
| PYTHONPATH=src python -m scripts.render_release_manifest \ | ||
| --source deploy/k8s/weather-acquisition.yaml \ | ||
| --output release/weather-acquisition.yaml \ | ||
|
Comment on lines
+46
to
+50
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.
In the checked Useful? React with 👍 / 👎. |
||
| --image-reference-file release/image-ref.txt \ | ||
| --expected-repository "${{ vars.INTERNAL_REGISTRY }}/weather/platform" \ | ||
| --metadata release/release-metadata.json \ | ||
|
Protonmatter marked this conversation as resolved.
|
||
| --git-sha "${GITHUB_SHA}" \ | ||
| --production-lock requirements/production.lock \ | ||
| --ci-lock requirements/ci.lock | ||
| ! grep -q 'sha256:0000000000000000000000000000000000000000000000000000000000000000' \ | ||
| release/weather-acquisition.yaml | ||
| - name: Upload release evidence | ||
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 | ||
| with: | ||
| name: weather-release-${{ github.sha }} | ||
| path: release/ | ||
| if-no-files-found: error | ||
| retention-days: 90 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| name: continuous-delivery | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main] | ||
| tags: ['v*'] | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: continuous-delivery-${{ github.ref }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| continuous-integration: | ||
| uses: ./.github/workflows/continuous-integration.yml | ||
| immutable-release: | ||
| needs: continuous-integration | ||
| uses: ./.github/workflows/build-image.yml | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| name: continuous-integration | ||
|
|
||
| on: | ||
| workflow_call: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| specification: | ||
| uses: ./.github/workflows/spec-validation.yml | ||
| dependency-locks: | ||
| uses: ./.github/workflows/python-lock.yml | ||
| python-quality: | ||
| uses: ./.github/workflows/ci-bootstrap.yml | ||
| python-fast: | ||
| uses: ./.github/workflows/pr-fast.yml | ||
| schema-contract: | ||
| uses: ./.github/workflows/schema-contract.yml | ||
| weather-contract: | ||
| uses: ./.github/workflows/weather-contract.yml | ||
| scientific-validation: | ||
| uses: ./.github/workflows/scientific-validation.yml | ||
| weather-integration: | ||
| uses: ./.github/workflows/weather-integration.yml | ||
| operator-console: | ||
| uses: ./.github/workflows/operator-console.yml | ||
| end-to-end: | ||
| uses: ./.github/workflows/end-to-end.yml | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,80 @@ | ||
| name: end-to-end | ||
|
|
||
| on: | ||
| workflow_call: | ||
| pull_request: | ||
| paths: | ||
| - 'src/**' | ||
| - 'apps/operator-console/**' | ||
| - 'requirements/ci.lock' | ||
| - 'pyproject.toml' | ||
| - 'specs/**' | ||
| - 'scripts/validate_dependency_policy.py' | ||
| - '.github/dependabot.yml' | ||
| - '.github/workflows/end-to-end.yml' | ||
| - '.github/workflows/continuous-integration.yml' | ||
| - '.github/workflows/continuous-delivery.yml' | ||
| - '.github/workflows/build-image.yml' | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: end-to-end-${{ github.event.pull_request.number || github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| jobs: | ||
| verify: | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 25 | ||
| steps: | ||
| - name: Checkout | ||
| uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 | ||
| - name: Install Python | ||
| uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 | ||
| with: | ||
| python-version-file: '.python-version' | ||
| cache: pip | ||
| cache-dependency-path: requirements/ci.lock | ||
| - name: Install hash-pinned Python graph | ||
| run: | | ||
| python -m venv .venv | ||
| .venv/bin/python -m pip install \ | ||
| --disable-pip-version-check \ | ||
| --require-hashes \ | ||
| --requirement requirements/ci.lock | ||
| .venv/bin/python -m pip install \ | ||
| --disable-pip-version-check \ | ||
| --no-build-isolation \ | ||
| --no-deps \ | ||
| --editable . | ||
| - name: Validate specifications and dependency policy | ||
| run: PATH="$PWD/.venv/bin:$PATH" make validate | ||
| - name: Install Node.js | ||
| uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 | ||
| with: | ||
| node-version-file: apps/operator-console/.nvmrc | ||
| cache: npm | ||
| cache-dependency-path: apps/operator-console/package-lock.json | ||
| - name: Install locked operator-console graph | ||
| working-directory: apps/operator-console | ||
| run: npm run install:ci | ||
| - name: Build deployable operator-console worker | ||
| working-directory: apps/operator-console | ||
| run: npm run build | ||
| - name: Run process-boundary end-to-end verification | ||
| working-directory: apps/operator-console | ||
| env: | ||
| PYTHON_BIN: ${{ github.workspace }}/.venv/bin/python | ||
| run: | | ||
| mkdir -p ../../artifacts | ||
| node --test --test-reporter=junit tests/control-plane.e2e.test.mjs \ | ||
| > ../../artifacts/end-to-end-junit.xml | ||
| - name: Upload end-to-end evidence | ||
| if: always() | ||
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 | ||
| with: | ||
| name: end-to-end-${{ github.sha }} | ||
| path: artifacts/end-to-end-junit.xml | ||
| if-no-files-found: error | ||
| retention-days: 30 |
Uh oh!
There was an error while loading. Please reload this page.