上一期我们聊到了 使用 Github Actions 拉取 Infisical 机密,很明显,我们可以观察到越来越多的人正在逃离 Github,转而向类似 Forgejo 等自托管平台。本期文章我将介绍 Infisical/secrets-action 的 Forgejo 移植版。
配置 Infisical
现在让我们开始配置:
在 Infisical 中配置机密
确保工作流需要的机密存储在 Infisical 项目和环境中(例如 dev / prod)
例如,一个构建并推送 Docker 镜像的流水线可能需要:
- DOCKER_USERNAME
- DOCKER_PASSWORD
密钥的作用范围限定在某个环境中,请确保它们存在于你的工作流将要访问的环境中。
使用 OIDC 身份验证创建机器身份
一个机器身份代表一个非人类工作负载(例如 CI/CD 流水线、服务器或自动化任务),并定义了该工作负载在没有绑定用户账户的情况下被授权访问的内容。使用 OIDC 身份验证创建机器身份:
- 在 Infisical 中导航到您的项目
- 前往
项目 > 访问控制 > 机器身份 - 点击
将机器身份添加到项目 - 为身份提供一个名称
- 选择一个组织级别的角色,该角色定义了身份可以访问的内容,例如
Viewer - 点击 创建


默认情况下,身份将配置为使用 通用认证。对于 CI/CD 工作流,我们希望避免长期存在的凭证,因此将切换到 OIDC 认证。
配置 OIDC 身份验证
- 点击您的机器身份
- 移除默认的 Universal Auth 配置
- 点击 Add auth method,然后选择 OIDC Auth

配置以下字段:
- OIDC 发现 URL:
https://<YOUR_FORGEJO_URL>/api/actions - 颁发者:
https://<YOUR_FORGEJO_URL>/api/actions - Subject:JWT 的主体,预期的主体格式为:
repo:<owner>/<repo>:<context>
# eg.
# repo:liuzhen932/actions:ref:refs/heads/main
- Audience:预期的接收方列表。将其设置为您的 Forgejo 个人 URL,例如:
https://git.6l.ink/liuzhen932
通过仔细配置主题、受众和声明字段来限制访问。Audience 和 Subject 别配反了!
复制身份 ID
配置 OIDC 身份验证后,Infisical 会提供一个 身份 ID。我们需要在 Actions 工作流中引用此 ID。
配置工作流
与 Github Actions 不同的是,我们不能使用 permissions.id-token 让 Forgejo 签发 OIDC,而是使用 enable-openid-connect: true,为了安全,此设置对来自 Fork 的存储库的 pull_request 事件禁用。
所以我们应该这样写:
name: Build and Push Docker Image
on:
workflow_dispatch:
enable-openid-connect: true
jobs:
build:
runs-on: docker
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Fetch secrets from Infisical
uses: https://git.6l.ink/infra/infisical-secrets-action@main # 这是为了演示,实际上,你应该在你的 Forgejo 实例 Mirror 这个仓库然后 Pin SHA 以确保安全
with:
method: "oidc"
identity-id: "your-identity-id-here"
project-slug: "your-project-slug"
env-slug: "dev"
- name: Login to Docker Registry
run: |
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- name: Build and push Docker image
run: |
docker build -t my-image:latest .
docker push my-image:latest
请注意本示例中的 Actions 移植仓库,这里这样写是为了演示使用,在生产环境中,你应该在你的 Forgejo 实例 Mirror 这个仓库(以确保更新),然后 Pin SHA 以确保安全无篡改。
完成就推送远端,然后看看 Forgejo Actions 的反应。
报错退出
- 检查 Audience 和 Subject 是否正确
- 如果工作流日志报错 500,检查 identity-id 是否正确
- 如果工作流日志报错 400 和 Unknown Status 关键词,检查 WAF —— Infisical 请求不带 User-Agent,大概率是被 Block 了。
- 不是以上问题?留言/Issues 告诉我。
以上就是本文的内容,感谢您的阅读。如果您有任何问题,欢迎留言反馈。