diff --git a/.github/workflows/publish-static-artifacts.yml b/.github/workflows/publish-static-artifacts.yml index c9034a7..a806fb9 100644 --- a/.github/workflows/publish-static-artifacts.yml +++ b/.github/workflows/publish-static-artifacts.yml @@ -115,7 +115,8 @@ jobs: $FTPS_VERIFY_CERT_LINE set net:max-retries 2 set net:timeout 30 - mirror -R --delete --verbose dist/specgraph-public "$SFTP_REMOTE_ROOT" + lcd dist/specgraph-public + mirror -R --delete --verbose . "$SFTP_REMOTE_ROOT" bye EOF exit 0 @@ -133,7 +134,8 @@ jobs: set sftp:connect-program "ssh -a -x -i $HOME/.ssh/specgraph_publish_key -o UserKnownHostsFile=$HOME/.ssh/known_hosts" set net:max-retries 2 set net:timeout 30 - mirror -R --delete --verbose dist/specgraph-public "$SFTP_REMOTE_ROOT" + lcd dist/specgraph-public + mirror -R --delete --verbose . "$SFTP_REMOTE_ROOT" bye EOF else @@ -142,7 +144,8 @@ jobs: set sftp:connect-program "ssh -a -x -o UserKnownHostsFile=$HOME/.ssh/known_hosts" set net:max-retries 2 set net:timeout 30 - mirror -R --delete --verbose dist/specgraph-public "$SFTP_REMOTE_ROOT" + lcd dist/specgraph-public + mirror -R --delete --verbose . "$SFTP_REMOTE_ROOT" bye EOF fi diff --git a/docs/static_artifact_publish.md b/docs/static_artifact_publish.md index ef2d357..6ad3d65 100644 --- a/docs/static_artifact_publish.md +++ b/docs/static_artifact_publish.md @@ -33,6 +33,10 @@ The bundle includes: - `artifact_manifest.json` - `checksums.sha256` +Deployment mirrors the contents of `dist/specgraph-public/` into +`SFTP_REMOTE_ROOT`. It must not create a nested `specgraph-public/` directory on +the static host. + The source `runs/` directory remains local and unchanged. The publish bundle is a redacted mirror: local absolute paths such as `/Users/...` are replaced with `$LOCAL_PATH` in the copied files. diff --git a/tests/test_publish_static_artifacts_workflow.py b/tests/test_publish_static_artifacts_workflow.py index 10e11ce..53f7d90 100644 --- a/tests/test_publish_static_artifacts_workflow.py +++ b/tests/test_publish_static_artifacts_workflow.py @@ -60,6 +60,14 @@ def test_secret_bearing_jobs_do_not_run_on_pr_controlled_workflow() -> None: assert "ref: ${{ github.event.pull_request.base.sha }}" in connection_workflow +def test_deploy_upload_mirrors_bundle_contents_not_wrapper_directory() -> None: + workflow = _workflow_text() + + assert "lcd dist/specgraph-public" in workflow + assert 'mirror -R --delete --verbose . "$SFTP_REMOTE_ROOT"' in workflow + assert 'mirror -R --delete --verbose dist/specgraph-public "$SFTP_REMOTE_ROOT"' not in workflow + + def test_workflows_opt_into_node24_actions_runtime() -> None: workflow_dir = Path(__file__).resolve().parents[1] / ".github" / "workflows" workflow_paths = sorted(workflow_dir.glob("*.yml"))