Migrating to v2¶
v1 is the docs-only action. v2 is one action covering six targets, so the input surface had to grow a selector and the docs inputs had to move out of the way of it.
@v1 is frozen at v1.0.18 and keeps working. It is not deprecated by this. Migrate
when you want another target, or when you want the input validation.
That sentence used to read "@v1 keeps working exactly as it does today", and for a day
it was false. The release job moves the floating major tag onto every stable release, and
GitVersion cut both breaking changes as patches, so v1 was force-moved onto v1.0.19 and
then v1.0.23: every consumer pinned to @v1 received the v2 contract without asking for
it, and nine repositories went red on unknown target 'none'. v1 now points at
v1.0.18, the last release that actually speaks the v1 contract, and GitVersion.yml
makes a breaking change bump the major so the tag can never wander again.
What changed, and why¶
target at v1 meant where the built site goes. At v2 it means what to deploy, which is
the collision that forced a major:
# v1
- uses: MagmaMoose/tremvok@v1
with:
target: github-pages
toolchain: uv
strict: true
# v2
- uses: MagmaMoose/tremvok@v2
with:
target: github-pages
pages-toolchain: uv
pages-strict: true
The docs target is now named for the one place it publishes, so target says both things at
once and there is no second destination input under it. Every other docs input gained a
pages- prefix: with six targets in one action, a bare toolchain or strict cannot say
whose it is. The prefix is also what the validator keys on, so a misplaced input is caught
rather than ignored.
Renames¶
| v1 | v2 |
|---|---|
target: github-pages |
target: github-pages, and it now selects the deploy target itself |
toolchain |
pages-toolchain |
docs-group |
pages-dependency-group |
requirements |
pages-requirements |
python-version |
pages-python-version |
strict |
pages-strict |
site-dir |
pages-site-dir |
lint |
pages-lint |
profile |
pages-profile |
readme-budget |
pages-readme-budget |
markdownlint |
pages-markdownlint |
target: cloudflare-pages |
removed: publish a built site with target: cloudflare-workers |
cloudflare-project, cloudflare-account-id, cloudflare-api-token, cloudflare-branch |
removed with it. The Workers target takes cloudflare-api-token and cloudflare-account-id of its own, and reads the rest from your Wrangler config |
require-access |
removed with it |
stage-pages |
removed: it was already a deprecated alias, and staging is no longer a choice |
There is no docs-target at v2, and nothing replaces it. GitHub Pages is one site with no
preview destination, so a pull request (mode: preview) and a dry run build without staging
an artifact, and a push to the default branch stages one. The mode decides, which is what the
mode means for every other target too.
If you tracked a docs-* prefixed pre-release of v2 rather than @v1, the rename is
mechanical: docs- becomes pages-, target: docs becomes target: github-pages, and
docs-target comes out. An input that no longer exists is a hard error naming the target, so
a missed one fails the run before the checkout rather than being ignored.
working-directory and checkout are unchanged: they genuinely apply to every target.
Outputs¶
| v1 | v2 |
|---|---|
toolchain |
pages-toolchain |
target |
target, now the selector you passed in, not the docs destination |
site-dir |
unchanged |
page-url, deployment-url |
removed: the Pages URL comes from your own deploy-pages step, and any other target's published URL is url |
The reusable workflows are gone¶
.github/workflows/docs.yml and docs-github-pages.yml were the v1 quickstart. They are
removed at v2: one action is the whole product, and a second callable surface for one target
only was a place for the two to disagree.
The half they carried that the action cannot is the Pages deploy: actions/deploy-pages
needs pages: write and the github-pages environment, and a composite action can declare
neither. That becomes a job in your own workflow, the shape is in Setup, and it
is about ten lines. It is the only place in the action where an environment: is
load-bearing; the Terragrunt apply gate is the action's own logic and needs none.
Callers who used docs.yml for Cloudflare Pages need a different target: cloudflare-workers
publishes a built directory with Wrangler, needs no GitHub permission, and completes inside the
action. Setup has the job.
The subdirectory entrypoint is gone¶
MagmaMoose/tremvok/deploy@v1 no longer exists. Its three targets are target:
s3-cloudfront, target: lambda-zip and target: terragrunt on the root action, with these
renames:
deploy/ |
v2 |
|---|---|
role-to-assume |
aws-role-to-assume |
role-duration-seconds |
aws-role-duration-seconds |
bucket |
s3-bucket |
key-prefix |
s3-key-prefix |
delete-orphans |
s3-delete-orphans |
distribution-id |
cloudfront-distribution-id |
site-url |
cloudfront-site-url |
function-name |
lambda-function-name |
function-alias |
lambda-function-alias |
version-label |
lambda-version-label |
terraform-root |
terragrunt-root |
check-name |
terragrunt-check-name |
It never appeared in a release note, and the three files in examples/ that pointed at it
were pointing at the root action anyway, which is a large part of why the surfaces merged.
Behaviour changes worth knowing¶
- A wrong input now fails the run. At v1 an input the action did not declare produced a warning and was ignored. At v2 an input belonging to another target is an error naming both, raised before the checkout.
- The Terragrunt apply uses the saved plan. Plan writes
-out, apply applies that file. When the saved plan has gone stale the run says so in the log and re-plans rather than refusing,PLAN SOURCE:in the log names which one ran. - A plan-only Terragrunt run reports success, not failure. It deployed nothing on purpose. At v1 the notification called that a failed deploy.
scheduleandpull_request_reviewresolve.mode: autoused to fail on both, which broke the Terragrunt drift run on its own cron.