Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
3586c0d
chore(lint): restore ruff baseline
shinybrar Aug 17, 2026
905493d
chore(lint): align pre-commit ruff version
shinybrar Aug 17, 2026
9337225
test(ci): enforce pull request test policy
shinybrar Aug 17, 2026
e0ad198
docs(contributing): document CI test policy
shinybrar Aug 17, 2026
51750ff
Merge pull request #263 from opencadc/feat/ci-test-policy-262
shinybrar Aug 17, 2026
9a040b9
test(ci): cover trusted merged test contracts
shinybrar Aug 17, 2026
687545f
fix(ci): secure merged full test workflow
shinybrar Aug 17, 2026
4115da5
fix(server): preserve enrich annotation contract
shinybrar Aug 17, 2026
cf1b3fb
fix(ci): fail closed on missing test credentials
shinybrar Aug 17, 2026
31bcb06
Merge pull request #264 from opencadc/fix/wave0-review
shinybrar Aug 17, 2026
7e7aac4
feat(config): add bound configuration editor
shinybrar Aug 17, 2026
06a5045
Merge pull request #265 from opencadc/feat/config-editor-245
shinybrar Aug 17, 2026
e934698
test(auth): cover current cryptography certificate API
shinybrar Aug 17, 2026
3d72b9a
refactor(auth): use current cryptography certificate APIs
shinybrar Aug 17, 2026
70c8b36
build(deps): declare cryptography directly
shinybrar Aug 17, 2026
f019e09
Merge pull request #266 from opencadc/refactor/x509-247
shinybrar Aug 17, 2026
b2a14fb
test(sessions): cover sync async fetch parity
shinybrar Aug 17, 2026
321a1c9
refactor(sessions): share native transport policy
shinybrar Aug 17, 2026
a80d74a
refactor(sessions): centralize destroy failure policy
shinybrar Aug 17, 2026
0c9ea5b
Merge pull request #267 from opencadc/refactor/session-policy-246
shinybrar Aug 17, 2026
9ce7ae8
test(ci): cover reusable workflow contracts
shinybrar Aug 17, 2026
34095cf
refactor(ci): consolidate Python test workflows
shinybrar Aug 17, 2026
5199178
refactor(ci): consolidate container build workflows
shinybrar Aug 17, 2026
a394345
Merge pull request #268 from opencadc/ci/workflow-consolidation-248
shinybrar Aug 17, 2026
31ca84d
docs(alma): replace screenshot guides with text workflow
shinybrar Aug 17, 2026
4c9d3b2
Merge pull request #269 from opencadc/docs/alma-text-249
shinybrar Aug 17, 2026
1bcb8ad
refactor(sessions): inline request and response handling
shinybrar Aug 18, 2026
697a075
refactor(ci): simplify reusable test runner matrix
shinybrar Aug 18, 2026
19166d7
test(ci): remove duplicate workflow assertions
shinybrar Aug 18, 2026
8384e92
docs(alma): use glossary terminology
shinybrar Aug 18, 2026
69e29be
Merge pull request #270 from opencadc/fix/wave1-review
shinybrar Aug 18, 2026
ffb7aaf
test(auth): cover editor-owned authentication mutations
shinybrar Aug 18, 2026
3753b8e
refactor(auth): route mutations through configuration editor
shinybrar Aug 18, 2026
c984d29
style(auth): format editor boundary test
shinybrar Aug 18, 2026
d8bda81
Merge pull request #272 from opencadc/refactor/auth-editor-250
shinybrar Aug 18, 2026
9877a6d
refactor(server): move selection mutations behind editor
shinybrar Aug 18, 2026
5672246
refactor(auth): route selection activation through platform
shinybrar Aug 18, 2026
89e56a3
Merge pull request #271 from opencadc/refactor/server-selection-251
shinybrar Aug 18, 2026
0cf8d88
refactor(storage): make identifier resolution explicit
shinybrar Aug 18, 2026
4b54f7a
docs(storage): document explicit filesystem access
shinybrar Aug 18, 2026
ffbb4f4
style(storage): format identifier implementation
shinybrar Aug 18, 2026
bf99990
Merge pull request #273 from opencadc/refactor/storage-identifiers-252
shinybrar Aug 18, 2026
169a330
fix(test): isolate pytest home per run
shinybrar Aug 18, 2026
4b7f610
Merge pull request #275 from opencadc/fix/deterministic-test-home
shinybrar Aug 18, 2026
d379038
feat(cli): replace machine flags with output option
shinybrar Aug 18, 2026
a44ab5e
docs(cli): document output format option
shinybrar Aug 18, 2026
d892270
Merge pull request #274 from opencadc/feat/output-option-253
shinybrar Aug 18, 2026
85b0e6d
refactor(auth): remove unreachable selection helpers
shinybrar Aug 18, 2026
5be2af9
refactor(cli): simplify machine output mode handling
shinybrar Aug 18, 2026
27b13f7
test(cli): consolidate machine output contracts
shinybrar Aug 18, 2026
5463cc4
test: remove redundant pytest home hook
shinybrar Aug 18, 2026
12e5037
docs: correct machine output and storage API contracts
shinybrar Aug 18, 2026
7238833
fix(cli): satisfy output helper lint
shinybrar Aug 18, 2026
677f2b5
Merge pull request #277 from opencadc/fix/wave2-review
shinybrar Aug 18, 2026
c706141
test(client): cover shared async refresh lock
shinybrar Aug 18, 2026
cd89ba2
refactor(client): consolidate HTTP credential policy
shinybrar Aug 18, 2026
0bd7fc1
Merge pull request #278 from opencadc/refactor/http-policy-254
shinybrar Aug 18, 2026
0e5e647
refactor(cli): flatten canonical commands at root
shinybrar Aug 18, 2026
19d22b8
docs(cli): remove stale command aliases
shinybrar Aug 18, 2026
6431f4b
test(cli): normalize root help assertions
shinybrar Aug 18, 2026
0a96d97
style(cli): format root help test
shinybrar Aug 18, 2026
df69bd8
Merge pull request #279 from opencadc/refactor/cli-root-255
shinybrar Aug 18, 2026
8c3b6fd
fix(cli): infer setup output from leaf options
shinybrar Aug 18, 2026
04bca24
fix(client): ignore empty runtime tokens
shinybrar Aug 18, 2026
dd58965
refactor(client): share async OIDC refresh policy
shinybrar Aug 18, 2026
5df0969
refactor(cli): remove root leaf command shells
shinybrar Aug 18, 2026
e8bafc5
style(cli): satisfy type and formatting gates
shinybrar Aug 18, 2026
0c1fba7
test(client): cover empty-token hook parity
shinybrar Aug 18, 2026
3ee3537
style(cli): apply Ruff formatting
shinybrar Aug 18, 2026
f53f32a
test(cli): normalize prune help output
shinybrar Aug 18, 2026
88fa9d8
Merge pull request #280 from opencadc/fix/wave3-review
shinybrar Aug 18, 2026
e475db8
refactor(auth): inline sync refresh updates
shinybrar Aug 18, 2026
9daace8
Merge pull request #281 from opencadc/fix/wave3-review
shinybrar Aug 18, 2026
fa1abf3
refactor(logging): use stdlib module loggers
shinybrar Aug 18, 2026
40804e8
fix(logging): make handler setup idempotent
shinybrar Aug 18, 2026
89c2dc3
test(cli): preserve setup output cutoff
shinybrar Aug 18, 2026
61bd72f
refactor(logging): remove obsolete configuration state
shinybrar Aug 18, 2026
09776c0
fix(logging): retain configuration status compatibility
shinybrar Aug 18, 2026
4ed5804
Merge pull request #282 from opencadc/refactor/logging-257
shinybrar Aug 18, 2026
d4c8bd9
refactor(config): make editor the mutation boundary
shinybrar Aug 18, 2026
66c2050
refactor(config): migrate callers off legacy operations
shinybrar Aug 18, 2026
daca5b9
test(config): align callers with editor contract
shinybrar Aug 18, 2026
5732aa3
Merge pull request #283 from opencadc/refactor/configuration-258
shinybrar Aug 18, 2026
c256445
test(auth): cover native OIDC device login contracts
shinybrar Aug 18, 2026
d6f6ce9
feat(auth): expose native OIDC device login APIs
shinybrar Aug 18, 2026
4c157c7
docs(auth): document Python OIDC login
shinybrar Aug 18, 2026
79716f3
refactor(auth): share OIDC protocol policy helpers
shinybrar Aug 18, 2026
1f726f0
test(auth): align OIDC persistence assertions with config editor
shinybrar Aug 18, 2026
11a04be
Merge pull request #284 from opencadc/feat/oidc-login-256
shinybrar Aug 18, 2026
4138364
refactor(auth): deduplicate OIDC login seams
shinybrar Aug 18, 2026
ac9b616
refactor(config): remove private validation and logger state
shinybrar Aug 18, 2026
8813704
docs(auth): link Python login guidance
shinybrar Aug 18, 2026
7d40647
Merge pull request #285 from opencadc/fix/wave4-review
shinybrar Aug 18, 2026
9126c45
fix(config): preserve editor mapping validation
shinybrar Aug 18, 2026
b37fade
fix(config): preserve source-isolated editor validation
shinybrar Aug 18, 2026
1e47518
test(config): harden editor rejection evidence
shinybrar Aug 18, 2026
8bb7605
Merge pull request #286 from opencadc/fix/wave4-review
shinybrar Aug 18, 2026
aca8ca2
test(sessions): consolidate sync and async contract coverage
shinybrar Aug 18, 2026
4e70e73
test(cli): remove retired alias coverage
shinybrar Aug 18, 2026
a2fd0a2
test: use public transports and logger boundaries
shinybrar Aug 18, 2026
46001f7
Merge pull request #287 from opencadc/test/contract-consolidation
shinybrar Aug 18, 2026
183158f
test: tighten contract case tables
shinybrar Aug 18, 2026
a7a7afd
Merge pull request #288 from opencadc/fix/wave5-review
shinybrar Aug 18, 2026
4faab53
test: simplify shared create cases
shinybrar Aug 18, 2026
c314c11
Merge pull request #289 from opencadc/fix/wave5-case-data
shinybrar Aug 18, 2026
a0fca0e
chore(deps): remove unused dependencies and redundant quality config
shinybrar Aug 18, 2026
1e3221c
Merge pull request #290 from opencadc/cleanup/dependencies-260
shinybrar Aug 18, 2026
56c6c58
chore(quality): tighten dependency metadata checks
shinybrar Aug 18, 2026
89da3e4
Merge pull request #291 from opencadc/fix/wave6-review
shinybrar Aug 18, 2026
495a5b8
docs(client): audit Python API documentation
shinybrar Aug 18, 2026
85b5ac6
docs(cli): align command reference with shipped interface
shinybrar Aug 18, 2026
f8d7d28
Merge pull request #292 from opencadc/docs/client-api-261
shinybrar Aug 18, 2026
3171cb2
Merge pull request #293 from opencadc/docs/cli-261
shinybrar Aug 18, 2026
8bb5991
docs(storage): clarify explicit filesystem and staging workflows
shinybrar Aug 18, 2026
4cb6e1b
docs(site): align platform workflows and support guidance
shinybrar Aug 18, 2026
4fa4c68
docs(site): remove unreferenced legacy assets
shinybrar Aug 18, 2026
7117a75
fix(cli): document ps default status filter
shinybrar Aug 18, 2026
3a19541
docs(storage): correct filesystem lifecycle examples
shinybrar Aug 18, 2026
e749871
docs(platform): use deployment-neutral server examples
shinybrar Aug 18, 2026
7df7a18
docs(client): close filesystem examples
shinybrar Aug 18, 2026
2823d48
test(cli): normalize ps help output
shinybrar Aug 18, 2026
bb43e38
chore(docs): merge platform site audit
shinybrar Aug 18, 2026
60d3172
chore(cli): merge ps help correction
shinybrar Aug 18, 2026
efe5361
chore(docs): merge filesystem lifecycle corrections
shinybrar Aug 18, 2026
99dd809
docs: use Session terminology in user guides
shinybrar Aug 18, 2026
8312d28
docs: make client data guide canonical
shinybrar Aug 18, 2026
1930116
docs: clarify replica resource allocation
shinybrar Aug 18, 2026
c68d455
test: remove redundant ps help check
shinybrar Aug 18, 2026
72cf887
docs: close remote after cache setup failures
shinybrar Aug 18, 2026
79ad413
chore(docs): merge wave 7 review corrections
shinybrar Aug 18, 2026
97c5cf2
refactor(auth): share OIDC coordinator policy
shinybrar Aug 18, 2026
f06e1c8
fix(config): apply domain state transitions atomically
shinybrar Aug 18, 2026
f175c98
docs(platform): align IDP and server terms
shinybrar Aug 18, 2026
87d8f74
refactor(auth): share OIDC policy and align glossary
shinybrar Aug 18, 2026
78665d8
refactor(server): isolate discovery implementation
shinybrar Aug 18, 2026
8ceff8a
refactor(config): deepen state transitions and server discovery
shinybrar Aug 18, 2026
68007e3
test(client): exercise public HTTP request contracts
shinybrar Aug 18, 2026
4cd8482
test(client): exercise public HTTP request contracts
shinybrar Aug 18, 2026
f9ef5ce
fix(quality): resolve code-quality findings
shinybrar Aug 18, 2026
ee63dd8
fix(quality): resolve PR 276 analyzer findings
shinybrar Aug 18, 2026
3de6a9e
test(quality): simplify server export contract
shinybrar Aug 18, 2026
d4af2d9
test(server): use one public import style
shinybrar Aug 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
88 changes: 5 additions & 83 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ name: Continous Integration

on:
pull_request:
branches: [ main ]
paths-ignore:
- 'docs/**'
branches: [ main, feat/interfaces ]
push:
branches: [ main ]
paths-ignore:
Expand Down Expand Up @@ -41,84 +39,8 @@ jobs:

tests:
needs: pre-commit-checks
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 10
env:
CANFAR_BASEURL: ${{ secrets.CANFAR_BASEURL }}
CANFAR_USERNAME: ${{ secrets.CANFAR_USERNAME }}
CANFAR_PASSWORD: ${{ secrets.CANFAR_PASSWORD }}
uses: ./.github/workflows/reusable-tests.yml
with:
full-suite: false
secrets:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
steps:
- name: Harden Runner
timeout-minutes: 10
uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
egress-policy: audit

-
name: Setup code repository
timeout-minutes: 10
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1
-
name: Setup uv
timeout-minutes: 10
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
with:
enable-cache: true
-
name: Setup Python ${{ matrix.python-version }}
timeout-minutes: 10
run: |
uv python install ${{ matrix.python-version }}
uv venv --python ${{ matrix.python-version }}
uv sync --all-extras --dev
-
name: Login to CANFAR
timeout-minutes: 10
if: ${{ env.CANFAR_BASEURL != '' && env.CANFAR_USERNAME != '' && env.CANFAR_PASSWORD != '' }}
run: |
set -euo pipefail
printf "machine %s\n login %s\n password %s\n" "${CANFAR_BASEURL}" "${CANFAR_USERNAME}" "${CANFAR_PASSWORD}" > ~/.netrc
uv run cadc-get-cert --days-valid 1 --netrc-file ~/.netrc
rm ~/.netrc
test -f "${HOME}/.ssl/cadcproxy.pem"
-
name: Run tests
timeout-minutes: 10
run: |
set -euo pipefail
if [ -n "${CANFAR_BASEURL}" ] && [ -n "${CANFAR_USERNAME}" ] && [ -n "${CANFAR_PASSWORD}" ]; then
uv run pytest tests -m "not slow" --cov --cov-report=xml --junitxml=junit.xml -o junit_family=legacy
else
uv run pytest tests -m "not slow" --cov --cov-report=xml --junitxml=junit.xml -o junit_family=legacy
fi
-
name: Remove CANFAR Certificate
timeout-minutes: 10
if: always()
run: |
rm -rf ~/.ssl/
-
name: Upload coverage to Codecov
timeout-minutes: 10
if: ${{ !cancelled() && env.CODECOV_TOKEN != '' }}
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
fail_ci_if_error: true # Fail the CI if an error occurs during the upload
token: ${{ env.CODECOV_TOKEN }}
flags: ${{ matrix.python-version }}
verbose: true # optional (default = false)
-
name: Upload test results to Codecov
timeout-minutes: 10
if: ${{ !cancelled() && env.CODECOV_TOKEN != '' }}
uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1.2.1
with:
token: ${{ env.CODECOV_TOKEN }}
74 changes: 6 additions & 68 deletions .github/workflows/edge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,80 +4,18 @@ on:
repository_dispatch:
types: [edge-build]

env:
GHCR_REGISTRY: ghcr.io
IMAGE_NAME: opencadc/canfar
IMAGE_TAG: edge

permissions:
contents: read

jobs:
edge-build:
runs-on: ubuntu-latest
timeout-minutes: 10
uses: ./.github/workflows/reusable-container.yml
permissions:
packages: write
attestations: write
id-token: write
steps:
- name: Harden Runner
timeout-minutes: 10
uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
egress-policy: audit

-
name: Client Payload
timeout-minutes: 10
run: |
echo "Client Payload: ${{ toJson(github.event.client_payload) }}"
-
name: Checkout Code
timeout-minutes: 10
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
-
name: Setup Docker Buildx
timeout-minutes: 10
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
with:
install: true
-
name: Perform GHCR Login
timeout-minutes: 10
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Build & Push Docker Image
timeout-minutes: 10
id: build
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
target: production
file: Dockerfile
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: mode=max
sbom: true
push: true
labels: |
org.opencontainers.image.title=canfar
org.opencontainers.image.version=edge
org.opencontainers.image.description='Python Client for CANFAR Science Platform'
org.opencontainers.image.licenses=AGPL-3.0
org.opencontainers.image.source=https://github.com/opencadc/canfar
tags: |
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
-
name: Attest GHCR Container Image
timeout-minutes: 10
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
with:
subject-name: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
subject-digest: ${{ steps.build.outputs.digest }}
push-to-registry: true
with:
client-payload: ${{ toJson(github.event.client_payload) }}
image-description: Python Client for CANFAR Science Platform
image-tags: ghcr.io/opencadc/canfar:edge
image-version: edge
23 changes: 23 additions & 0 deletions .github/workflows/full-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Full Tests

on:
pull_request_target:
types: [closed]
branches: [ main ]
paths:
- 'canfar/**'
- 'tests/**'

permissions: read-all

jobs:
tests:
if: ${{ github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main' }}
uses: ./.github/workflows/reusable-tests.yml
with:
full-suite: true
secrets:
CANFAR_BASEURL: ${{ secrets.CANFAR_BASEURL }}
CANFAR_USERNAME: ${{ secrets.CANFAR_USERNAME }}
CANFAR_PASSWORD: ${{ secrets.CANFAR_PASSWORD }}
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
81 changes: 9 additions & 72 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,84 +4,21 @@ on:
repository_dispatch:
types: [release-build]

env:
GHCR_REGISTRY: ghcr.io
IMAGE_NAME: opencadc/canfar
IMAGE_TAG_LATEST: latest
IMAGE_TAG_RELEASE: ${{ github.event.client_payload.tag_name }}

permissions:
contents: read

jobs:
release-build:
runs-on: ubuntu-latest
timeout-minutes: 10
uses: ./.github/workflows/reusable-container.yml
permissions:
packages: write # Upload package to ghcr.io
attestations: write # Attest the build provenance
id-token: write # Genereate OIDC token for attestations
steps:
- name: Harden Runner
timeout-minutes: 10
uses: step-security/harden-runner@bf7454d06d71f1098171f2acdf0cd4708d7b5920 # v2.20.0
with:
egress-policy: audit

-
name: Client Payload
timeout-minutes: 10
run: |
echo "Client Payload: ${{ toJson(github.event.client_payload) }}"
-
name: Checkout Code
timeout-minutes: 10
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.client_payload.tag_name }}
-
name: Setup Docker Buildx
timeout-minutes: 10
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
with:
install: true
-
name: Perform GHCR Login
timeout-minutes: 10
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
-
name: Build & Push Docker Image
timeout-minutes: 10
id: build
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
target: production
file: Dockerfile
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
provenance: mode=max
sbom: true
push: true
labels: |
org.opencontainers.image.title=canfar
org.opencontainers.image.version=${{ env.IMAGE_TAG_RELEASE }}
org.opencontainers.image.description='Python Client for CANFAR Science Portal'
org.opencontainers.image.licenses=AGPL-3.0
org.opencontainers.image.source=https://github.com/opencadc/canfar
tags: |
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG_RELEASE }}
${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG_LATEST }}
-
name: Attest GHCR Container Image
timeout-minutes: 10
uses: actions/attest-build-provenance@0f67c3f4856b2e3261c31976d6725780e5e4c373 # v4.1.1
with:
subject-name: ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}
subject-digest: ${{ steps.build.outputs.digest }}
push-to-registry: true
with:
client-payload: ${{ toJson(github.event.client_payload) }}
checkout-ref: ${{ github.event.client_payload.tag_name }}
image-description: Python Client for CANFAR Science Portal
image-tags: |
ghcr.io/opencadc/canfar:${{ github.event.client_payload.tag_name }}
ghcr.io/opencadc/canfar:latest
image-version: ${{ github.event.client_payload.tag_name }}
Loading
Loading