Skip to content

Publishing boundary

The published package should contain runtime JavaScript, TypeScript declarations, package metadata, and the README.

It should not contain examples, tests, Vitest config, or TypeScript source.

Dependency boundary

Hollywood keeps the direct runtime dependency list small:

Dependency Why it exists
@actions/core Official GitHub Actions input/output and logging.
@actions/exec Official GitHub Actions process execution.
@actions/expressions GitHub expression parsing and validation.
@actions/workflow-parser GitHub workflow schema parsing and validation.
@octokit/openapi-types GitHub REST request and response types.
esbuild Local TypeScript source loading for the CLI.
yaml Rendering generated action and workflow files.
zod Runtime validation for external structured data.

Keep new runtime dependencies rare. Every dependency expands the install graph that users have to trust when they run CI/CD automation from npm.

Desired package boundary

{
    "bin": {
        "hollywood": "./dist/cli.js"
    },
    "exports": {
        ".": {
            "types": "./dist/index.d.ts",
            "import": "./dist/index.js"
        },
        "./action-runtime": {
            "types": "./dist/action-runtime.d.ts",
            "import": "./dist/action-runtime.js"
        },
        "./expr": {
            "types": "./dist/expr.d.ts",
            "import": "./dist/expr.js"
        }
    },
    "types": "./dist/index.d.ts",
    "files": ["dist", "README.md", "package.json"]
}

With that boundary:

Path Published? Reason
dist/index.js yes Runtime entrypoint.
dist/cli.js yes Bundled hollywood command.
dist/runner-launch.js yes Connected runner container entrypoint.
dist/index.d.ts yes Public types.
dist/expr.js yes Expression helper subpath.
README.md yes Package landing page.
LICENSE yes License file included by npm.
examples/* no Repository examples, not runtime files.
src/*.test.ts no Tests are not runtime files.
vitest.config.ts no Local test configuration.

npm pack --dry-run is the source of truth for what would publish. The package uses prepack to build dist/ before the tarball is assembled.

Release flow

Hollywood releases from main through Release Please. Normal PRs merge into main first. On each push, Release Please reads the Conventional Commit history and opens or updates separate release PRs for these components:

Component Version source Git tag Publication
Hollywood package.json vX.Y.Z npm and GitHub Releases
Runner image runner/version.txt runner-vX.Y.Z GHCR and GitHub Releases

Release Please creates runner/version.txt and runner/CHANGELOG.md in the first runner release PR. Until that PR merges, the manifest omits the runner component and no runner release exists.

Merging a release PR into main creates a pending deployment for the protected release environment. A maintainer must approve that deployment before the workflow can publish npm packages, GitHub Releases, or runner images. The publication workflow compares the previous and current Release Please manifests. It fails when the manifest changes without changing a configured component version.

Required CI also compares each manifest version with the published immutable GitHub Releases. The first stable component release must use 0.0.1. Later stable releases must apply one major, minor, or patch increment. This check prevents a release PR from skipping an unpublished version.

For a Hollywood release, the workflow reruns lint, typecheck, tests, and the build before publishing the package with npm provenance. It creates the GitHub tag and release only after npm accepts the package. A failed npm publish cannot leave behind a release tag.

For a runner image release, the workflow creates the runner-vX.Y.Z GitHub release without running npm publication. The release event starts the runner image workflow. That workflow verifies the image on Linux amd64 and arm64, then publishes the multi-platform image to GHCR.

Stable releases publish with the latest npm dist-tag. Prereleases use their prerelease identifier, such as alpha. Release Please owns package.json, CHANGELOG.md, and .release-please-manifest.json during normal releases.

The runner GitHub release tag must exactly match runner/version.txt before GHCR receives version tags. Stable images publish the exact version, compatible minor version, exact and compatible Ubuntu 24.04 variants, latest, and ubuntu-24.04. Prereleases publish only the immutable source tag, exact prerelease version, and exact prerelease Ubuntu 24.04 variant.

The image is native on Linux amd64 and arm64, carries an SBOM and BuildKit provenance, and receives a GitHub artifact attestation. Publication verifies the attestation and an anonymous digest pull before succeeding. Consumers should pin the resulting manifest digest even when they discover it through a version tag.

GitHub creates the first GHCR package with private visibility. An organization owner must change hollywood/runner to Public once. The publication workflow fails until an anonymous digest pull succeeds.