Acahti文档
EN中文GitHub自托管

文档构建

流水线与 pipe

在 .acahti/pipelines/ 中为 Acahti 编写 CI 和 CD,调用官方 pipe,并在不把密钥写进 git 的情况下传递密钥。

一条流水线就是一次运行。.acahti/pipelines/ 中的每个 YAML 文件是这次运行中的一个作业,每个作业包含若干具名步骤。pipe 是官方提供的可复用步骤:写作 pipe: <name>@v1,输入放在 with: 下。

在执行节点启动作业之前,网关会先展开它:pipe: 变成对 acahti-pipe <name> 的调用,映射的密钥变成步骤环境变量,每个步骤都会拿到本次运行的 Acahti 身份:ACAHTI_USER、ACAHTI_TOKEN、ACAHTI_ROOT_URL 和 ACAHTI_ORG。这个身份是头提交作者的 Acahti 账号(找不到时退回到启动这次运行的账号);步骤自己在 environment: 中设置的值优先。执行节点只会看到展开后的 YAML。

编写作业#

步骤要么是带 with: 的 pipe:,要么是用于一次性操作的普通 commands:。when、depends_on 和 labels 原样传递。不要把辅助脚本复制进仓库,也不要写 uses:。

steps:
  test:
    image: node:22
    commands:
      - npm ci
      - npm test

不同文件中的作业按 depends_on 排序,父作业在前。作业如果声明了 concurrency:,其 group 的作用范围是所在仓库,所以两个仓库中的 group: deploy 不会互相串行。不写 concurrency 则不受限制地运行。

在 commands: 中,用 $VAR 引用步骤环境变量。${VAR} 会在 shell 启动前插值,除非它是作业上下文(如 ${CI_COMMIT_SHA} 或 ${CI_COMMIT_TAG}),否则为空。

通过 git push、标签或 PR 触发运行。Git 标签格式为 vX.Y.Z;镜像标签去掉 v(${CI_COMMIT_TAG#v})。

密钥#

流水线密钥是访问 Acahti 之外系统的凭据:镜像仓库、集群、对象存储。管理员在网页端(「管理 → 组织密钥」,或仓库的「密钥」页面)或通过 secret_put 添加。名称使用小写 snake_case。密钥值永远不会被列出或返回。

步骤需要主动声明使用哪些密钥。密钥名就是 pipe 需要的变量名时直接列出;名称不同时做映射:

secrets:
  KUBECONFIG: kubeconfig_prod
  DOCKER_USERNAME: registry_username
  DOCKER_PASSWORD: registry_password

不要在 with: 中填写凭据文件的路径。Acahti 自带的 npm 和 PyPI 仓库源使用本次运行的身份,因此不要为它们创建令牌密钥。

官方 pipe#

docker-build#

Build images with BuildKit and push them, or build cache-only for CI.

Input Required Description
images yes One image per line. First field is the primary tag. Optional KEY=VAL: also extra tags (comma-separated), context (default .), file (Dockerfile), anything else is --build-arg. Job identity is written as BuildKit secrets id=npmrc and id=netrc (HTTP Basic from ACAHTI_USER / ACAHTI_TOKEN). Dockerfiles mount id=npmrc at /root/.npmrc and id=netrc at /root/.netrc. Default --network=host on buildx. CODEUP_NETRC, when set, is passed as id=codeup_netrc.
push true (default) is buildx --push; false is --output=type=cacheonly (CI)
network docker buildx --network (default host)
builder buildx builder name (default acahti, docker-container + host network)

docker-gc#

Bound shared BuildKit cache and report disk pressure. Runs every 15 minutes on the Runner.

docker-login#

Log in to a container registry for later steps in the job. Secret DOCKER_PASSWORD.

Input Required Description
registry yes Registry hostname. An http:// prefix is the same as http: true.
http true if the registry is HTTP/insecure (BuildKit). Default false (HTTPS).
username Registry user; password is DOCKER_PASSWORD (or DOCKER_USERNAME + DOCKER_PASSWORD)

helm#

Install or upgrade a Helm release. Secret KUBECONFIG holds the kubeconfig document.

Input Required Description
release yes
namespace yes
chart Chart path relative to the workspace (default chart)
files Extra -f values files, one per line, relative to the workspace
set Extra --set lines (foo=bar or --set foo=bar)
timeout Helm --timeout (default 5m)
take_ownership true to pass --take-ownership
jump SSH host, reachable from the Runner, that runs helm when the cluster API is private

npm-publish-acahti#

Build an npm package and publish it to this org's Acahti registry.

Input Required Description
path yes Package directory (package.json). Installs, builds, packs, and PUTs to this Acahti org's npm.
image Node image (default node:22-alpine). Private registry images need a prior docker-login.

oci-gc#

Prune old tags from OCI repositories, keeping latest and the newest few.

Input Required Description
repos yes OCI repositories to prune (no tag), one per line
keep Non-latest tags to keep (default 2). latest is always kept.

oss-put#

Upload files to Alibaba Cloud OSS. Secrets OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.

Input Required Description
endpoint yes
bucket yes
prefix yes Object key prefix (no oss://)
files yes Local files to upload, one per line (workspace-relative)

pypi-publish-acahti#

Build a Python package and publish it to this org's Acahti registry.

Input Required Description
path Directory with pyproject.toml (default .). Builds and PUTs to this Acahti org's PyPI.
image Python image (default python:3.12-slim-bookworm). uv is installed if missing. Private registry images need a prior docker-login.

uv#

Run commands in a job-local Python environment with uv.

Input Required Description
project Directory with pyproject.toml (default .)
run yes One command per line; each is uv run --project --

wait-http#

Wait until URLs stop answering 502, 503, 504, or nothing.

Input Required Description
urls yes URLs to poll, newline or semicolon separated
timeout Seconds to wait (default 180)
user_agent User-Agent header for the probes

示例#

构建镜像但不推送的 CI:

steps:
  build:
    pipe: docker-build@v1
    with:
      push: false
      images: |
        app:${CI_COMMIT_SHA}

构建、部署并清理旧标签的 CD,同一时间只运行一个部署:

concurrency:
  limit: 1
  group: deploy
steps:
  login:
    pipe: docker-login@v1
    with:
      registry: registry.example.com
    secrets:
      DOCKER_USERNAME: registry_username
      DOCKER_PASSWORD: registry_password
  build:
    depends_on: [login]
    pipe: docker-build@v1
    with:
      images: |
        registry.example.com/app:${CI_COMMIT_SHA} also=registry.example.com/app:latest
  deploy:
    depends_on: [build]
    pipe: helm@v1
    with:
      release: app
      namespace: default
      files: |
        chart/values.yaml
      set: |
        image.tag=${CI_COMMIT_SHA}
    secrets:
      KUBECONFIG: kubeconfig_prod
  gc:
    depends_on: [deploy]
    pipe: oci-gc@v1
    with:
      repos: |
        registry.example.com/app

打标签时把包发布到组织的仓库源:

when:
  event: tag
steps:
  publish:
    pipe: pypi-publish-acahti@v1

在名为 cd 的部署作业之后运行端到端测试:

depends_on: [cd]
steps:
  e2e:
    pipe: uv@v1
    with:
      run: |
        argos run all --env bj-test --dash

该步骤使用本次运行的 ACAHTI_ROOT_URL 和 ACAHTI_TOKEN 运行,因此 --dash 无需密钥即可把运行结果推送到 Argos。当作业或其某个步骤的名称包含 e2e 或 argos 时,流水线页面会把 CLI 报告的运行(argos <sid>)链接为「Argos」。

当流水线的提交信息、分支或 PR 标题提到某个待办或工单(todo#123、ticket#45、todo-123、todo/123、ticket/45、T-123)时,Acahti 会把这条流水线及其对应的 PR 关联到该工作项。PR 还会根据自身的标题、正文和头分支进行关联。之后,流水线会出现在该工作项追踪流程的 Build 下,PR 出现在 Review 下。

供 Agent 读取: pipelines.md编辑此页