Repository navigation
Releases
Releases · latere-ai/ci
v1.38.0
Changed
- Breaking: a release now stops when any push run of the verify
workflow on the tagged commit failed, on any branch, even if another run
succeeded. A failed run that was re-run to a pass counts as passed. - Breaking: a commit that renames a file out of a code path is no
longer read as documentation only, so its parent's run no longer stands
in for its own. - Breaking:
image-build.ymlaccepts an image only when the version it
prints is the tag exactly, followed by whitespace or nothing, so
v1.2.30orv1.2.3-dirtyno longer passes forv1.2.3. - Breaking: the release tag is applied only to a reference written
<registry>/<path>@sha256:<64 hex digits>, with no tag. - Breaking: a
filesorevidenceline ofpublish-releaseis one
path or pattern, so a path may hold a space; a line that held several
patterns separated by spaces now names one that matches nothing. A file
name with#is refused, sinceghreads it as a label. - Breaking:
tools/repo-settings.shfails when the repository listing
fails partway, when the policy file or a repository answer is not JSON,
and when a write is refused with anything but the validation error
(HTTP 422) GitHub gives for open classic projects, which alone is
retried withouthas_projects. A repository left with projects enabled
is stillPARTIAL, counted apart in the summary, and leaves the exit
status 0. - A re-run of a publish over an existing release restates its title and
prerelease flag along with the notes. - Each attempt of an image deploy's smoke is stopped when
smoke_timeout
is up, and a failed smoke's lastOUTPUT_MDis appended to the step
summary. - An image namespace with
--or__, which a reference allows, is
accepted; one holding a newline is refused. - The starter callers name
ci.ymlas the workflow an image release
verifies, take theworkflow_dispatchthe pin move sends, pass smoke
evidence only when the deploy ran, and name an example service. - The runner policy in the README now reads hosted runners for every
repository: private repositories run only scheduled and hand-started jobs
there, and their push, release and deploy run from a workstation. - Breaking:
image-build.ymltakes an emptyverify_workflowby
default, which reads as the one workflow in.github/workflowsthat
callslateregate.yml, as the other pipelines do. It defaulted to
verify.yml, so a caller that passed nothing and has noverify.ymlwas
refused; a repository with several callers must now name the workflow. - Breaking:
service-release.ymlandimage-deploy.ymlrun the
rollback guard a second time right before the kubeconfig is written. An
older release that finishes late, after a newervX.Y.Zwas tagged, now
stops there instead of rolling production back; the build it paid for is
lost. - Pushing a
v1.MINOR.PATCHtag movesv1only after the tagged commit
passed this repository's owntest.ymlon its push, so a tag cut on a
red or unverified commit no longer reaches the callers that pin@v1. - Breaking: in
cli-release.ymltheverifiedjob holdscontents: readandactions: read, thetestjobcontents: read, and only the
goreleaserjobcontents: write. The consumer's tests no longer run
with a token that can write to the repository. A caller's
.goreleaser.yamlhook that read workflow runs from the release job
needs its own grant. - Breaking:
cli-release.ymlpublishes only when every leg of the
test_osmatrix succeeded. A canceled leg used to let the release
through; it now stops it. - Breaking:
service-release.ymlrefusesbuild_cli: truewith no
cli_build_cmdin its first step. It used to fail only at the publish,
after the build and the deploy had gone out. - A release on a commit whose verify workflow has no push run now counts a
successfulworkflow_dispatchrun of that workflow on the default branch
for the exact commit, as verified. This is the runci-gate-bump.yml
dispatches for its pin commit, which a push with the job's token does not
start, so a release on a pin commit is no longer blocked. A failed push
run of the commit, on any branch, still blocks the release, and so does a
dispatched run on another branch or one that did not succeed. - Breaking: the
testjob oflateregate.ymlis namedtest (<os>),
nottest on <os>, so it shows no raw${{ matrix.os }}when it is
skipped. A branch protection rule that requires a check by the old name
needs the new one.
Fixed
- A smoke script that passes without writing
OUTPUT_MDno longer fails
the deploy. - The digest check of an image deploy no longer reports that the overlay
names no image when the rendered overlay is large. - A
wait_minutessuch as08is read as eight minutes instead of failing. - A commented-out call to
lateregate.ymlno longer counts as a second
per-push workflow. ensure-kustomizeno longer takes an installedv5.8.30for the pinned
5.8.3.signed-checksumssums a file whose name starts with-.tools/repo-settings.sh --helpexits 0, and a repository it cannot read
is reported withgh's error instead of a list of drifted fields.- An image release passes
evidencetopublish-releaseonly when a.md
file was downloaded, so an evidence pattern that matched no Markdown no
longer fails the publish. - A backport tag such as
v1.5.1, pushed afterv1.6.0, no longer moves
v1backwards:v1moves only to the highestv1.MINOR.PATCHrelease
tag.
v1.37.0
Changed
ci-gate-bump.ymldispatches no per-push run in a repository that
ships from a workstation (ship:in.lateregate.yaml, ci-gate
v0.68.0) and has no workflow callinglateregate.yml: the bump has
already run the whole bar on the new pin. Every other repository still
needs exactly one caller.
v1.36.0
Added
service-release.ymltakes aplatformsinput, defaultlinux/amd64:
the platform the image is built for. A release now ships an x64 image
from an arm64 runner as well as from an x64 one. Pass another value
to build for a different cluster; insplitmode it must be exactly one
linux/<arch>entry (for examplelinux/arm64), which is also what the
binary is compiled for, and anything else fails the build step.
Changed
- The tools the shared steps fetch when the runner has none (
gh,
kubectl,kustomize) are the build for the runner's architecture, x64
or arm64, instead of always x64. Every checksum is still verified. A
runner of any other architecture fails with a message naming it.
Nothing to change in a caller. The "Ensure kubectl" step of
service-release.ymlis now the sharedensure-kubectlaction.
Removed
runner-health.yml, which movedCI_RUNNER_PRIVATEtoubuntu-latest
whilelinux-vmwas offline or a job had waited for it over 20 minutes.
Those hosted minutes billed against the organization's Actions budget,
and a spent budget fails every private repository's hosted jobs at zero
steps until the month ends. A private repository's job now waits for the
self-hosted runner.RUNNER_HEALTH_TOKENis no longer read, and
CI_RUNNER_SWITCHESis no longer written.
v1.35.0
Changed
- The shared workflows and actions pin the same commit of each third-party
action as every latere-ai repository:docker/login-actionv4.8.0,
actions/download-artifactv8.0.2,docker/setup-qemu-actionv4.4.0 and
sigstore/cosign-installerv4.1.3. The cosign that signs and verifies is
unchanged: it is still the versionactions/lib/versions.shnames.
v1.34.0
Changed
ci-gate-bump.ymlfinds the module that pinslatere.ai/x/ci-gatethe way
lateregate.ymldoes, so a repository that keeps the pin in a nested
module (internal/gate) can call it. The daily check, the pin move, the
gates, the commit and the issue's reproduce commands all use that module;
the commit holds itsgo.modandgo.sum. The new inputgate_module
names the directory and wins over detection. A repository with the pin in
its rootgo.modsees no difference.
v1.33.0
Changed
- The release check (
verified-commit, run byimage-build.yml,
service-release.yml,cli-release.ymlandnotes-release.yml) also
reads every other workflow the tagged commit's branch push ran. A check a
repository keeps in a workflow of its own, such as a device session under
a real sandbox, now blocks a release when it failed or was cancelled, and
is waited for while it runs, as the per-push gate is. A workflow whose run
skipped every job, or that did not run on the commit, has no say.
Fixed
lateregate.ymlruns every step of the test job in bash. On a Windows
runner a step without a shell runs in PowerShell, so awindows-latest
intest.osfailed at its first step.
v1.32.1
Fixed
lateregate.ymlno longer asks foractions: read. A reusable workflow
that asks for a permission its caller does not grant fails at startup with
no job, so since v1.32.0 every run of a caller that grants only
contents: readfailed before it began. The jobs now run with the
caller's token: a caller that grantsactions: readgets the plan from
the last green commit, and one that does not checks the whole tree.
v1.32.0
Changed
lateregate.ymlmeasures the plan from the last green commit. The job that
reads the plan runslateregate base -since greenand lists from the
commit it prints, naming it in the log and the step summary. When the pinned
lateregatehas nobasecommand, no run was green, or the API refuses,
the whole tree is checked and the log says why. The workflow now asks for
actions: read; a caller that grants onlycontents: readkeeps working and
checks the whole tree.- The tools a gate installs come from the plan's
needs: Node and Bun, and
Chromium in eachchromium:<dir>. A hosted gate job installs only what its
gate needs. A pinnedlateregatewithoutneedsgets the previous rule. - The test systems come from the
testentry'sos, elsetest_os. - The module that pins the tool is found by its
toolline when
gate_moduleis empty: the root, else the one trackedgo.modthat has it;
several nested ones fail the job and ask forgate_module. test_os,frontend_browser_packageandgate_moduleare still accepted and
documented as superseded by.lateregate.yamland auto-detection.
v1.31.0
Fixed
ci-gate-bump.ymlfinds the per-push caller by itsuses:line. A comment
or a header example that nameslateregate.yml@v1is no longer counted as a
second caller, so a repository that documents the pipeline in a comment no
longer fails the dispatch of the gate on the pin commit.
Added
image-deploy.yml, a stage a core calls betweenimage-build.ymland
image-publish.ymlto deploy its own release. It takes the build's
images(one to three<ref>@<digest>lines, or<name>=<ref>@<digest>
where the overlay names the image otherwise) and thedeploymentsto wait
for, sets each image by digest indeploy/prod'skustomization.yamlwith
kustomize edit set image, runskubectl apply -k, waits for each
Deployment, runsafter_roll, removes the kubeconfig, and runs the smoke
script, which it repeats forsmoke_timeoutseconds so a Deployment on the
Recreate strategy can come back. The job runs in theproduction
environment withurl, refuses once a newer tag exists, and uploads the
smoke evidence as the artifactsmoke-evidenceforimage-publish.yml's
evidence: '*-evidence'. The caller gates the job with its own repository
variable and maps its secret ontoDEPLOY_KUBECONFIG
(DEPLOY_KUBECONFIG: ${{ secrets.ARCA_KUBECONFIG }}), and grants
contents: read.examples/image-release.ymlshows the job and the
publishcondition that tolerates a skipped deploy.actions/ensure-kubectl,actions/ensure-kustomizeand
actions/deploy-by-digest, the shared steps behind it, and
KUBECTL_VERSIONandKUSTOMIZE_VERSIONinactions/lib/versions.sh
(kubectlandkustomizeoutputs).
v1.30.0
Added
service-release.ymlandnotes-release.ymlrefuse a tag whose commit did
not pass CI. Their first step is the sharedverified-commitcheck that
image-build.ymlandcli-release.ymlalready run: the tagged commit's
per-push gate run on its branch push must have succeeded, so a tag on a
commit whose CI failed, was cancelled or never ran builds, deploys and
publishes nothing. Both take the sameverify_workflow(empty: the
workflow that callslateregate.yml),wait_minutesandskip_paths
(specs/*,*.md) inputs. Anotes-release.ymlcaller
now grantsactions: readbesidecontents: write; without it the
release fails at startup.
Changed
wait_minutes, in every release pipeline that checks CI, defaults to
waiting 60 minutes on a GitHub-hosted runner and to refusing at once on
the self-hosted runner, where a waiting release held one of the two
slots the run it waited for needed. The refusal prints the command that
re-runs the release once CI is green. A caller that passes a number keeps
it.verified-commit, in a run started on a branch rather than a tag (a
manual rebuild frommain), reads that branch's own push run of the
commit. It used to set those runs apart as the tag push's and refuse.