dokku/ci-docker-image
GitHub: dokku/ci-docker-image
一个面向 CI/CD 流水线的 Docker 镜像,封装了向 Dokku 平台自动化部署和 unlock 应用所需的全部逻辑与环境检测。
Stars: 37 | Forks: 25
# ci-docker-image
[](https://registry.hub.docker.com/r/dokku/ci-docker-image)
一个用于 CI/CD pipeline 的 Docker image
## 支持的 CI 系统
假设 Docker image 可以作为注入了环境变量的 CI 任务运行,以下 CI 系统的变量将被自动检测:
- [circleci](https://circleci.com/)
- [cloudbees](https://www.cloudbees.com/)
- [drone](https://www.drone.io/)
- [github actions](https://github.com/features/actions)
- [gitlab-ci](https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/)
- [semaphoreci](https://semaphoreci.com/)
- [travisci](https://travis-ci.com/)
- [woodpecker ci](https://woodpecker-ci.org/)
## 用法
此 image 提供了两个可供外部使用的二进制文件:
- `dokku-deploy`:在配置的 `GIT_REMOTE_URL` 处触发应用部署
- `dokku-unlock`:在配置的 `GIT_REMOTE_URL` 处解锁应用部署
要运行其中任一二进制文件,可以在包含正在部署的仓库的非浅克隆(non-shallow clone)目录中使用以下 `docker` 命令:
```
# 其中 `.env` 文件包含 `GIT_REMOTE_URL` 和 `SSH_PRIVATE_KEY`
# 部署
docker run --rm -v="$PWD:/app" --env-file=.env dokku/ci-docker-image dokku-deploy
# 解锁
docker run --rm -v="$PWD:/app" --env-file=.env dokku/ci-docker-image dokku-unlock
```
### 配置
支持以下环境变量:
- `BRANCH`:
- 描述:推送到 Dokku 时要部署的分支
- 必需:false
- 默认值:''master
- `CI_BRANCH_NAME`
- 描述:触发部署的分支名称。如果不可用,则会被自动插值。
- 必需:false
- 默认值:''
- `CI_COMMIT`
- 描述:将要推送的 commit sha。如果不可用,则会被自动插值。
- 必需:false
- 默认值:''
- `COMMAND`:
- 描述:要为该操作运行的命令
- 必需:false
- 默认值:''
- `DEPLOY_DOCKER_IMAGE`:
- 描述:要通过 `git:from-image` 部署的 docker image
- 必需:false
- 默认值:''
- `DEPLOY_USER_NAME`:
- 描述:部署 docker image 时要使用的用户名
- 必需:false
- 默认值:''
- `DEPLOY_USER_EMAIL`:
- 描述:部署 docker image 时要使用的电子邮件
- 必需:false
- 默认值:''
- `GIT_REMOTE_URL:`
- 描述:dokku 应用的 git 仓库 url(采用 SSH 格式,见下文)
- 必需:true
- `GIT_PUSH_FLAGS:`
- 描述:一个包含要在 push 时设置的一系列 flag 的字符串
- 必需:false
- `REVIEW_APP_NAME`:
- 描述:要创建或销毁的 review app 名称
- 必需:false
- 默认值:'review-$APP_NAME-$CI_BRANCH_NAME'
- `SSH_HOST_KEY`:
- 描述:运行 `ssh-keyscan -t rsa $HOST` 的结果
- 必需:false
- 默认值:''
- `SSH_PRIVATE_KEY`:
- 描述:一个对您的 Dokku 实例具有 push 权限的私有 SSH key。优先于 `SSH_PRIVATE_KEY_BASE64`。
- 必需:true
- `SSH_PRIVATE_KEY_BASE64`:
- 描述:一个对您的 Dokku 实例具有 push 权限的、经 base64 编码的私有 SSH key
- 必需:true
- `SSH_PASSPHRASE`:
- 描述:如果设置,在与带有 passphrase 的 SSH key 交互时要使用的 passphrase
- 必需:false
- 默认值:''
- `TRACE`:
- 描述:允许用户通过启用 shell trace 模式来调试该操作正在执行的任务
- 必需:false
- 默认值:''
### `GIT_REMOTE_URL` SSH 格式
`GIT_REMOTE_URL` 值应以 SSH 格式指定,如下所示:
```
# 未指定 port
ssh://dokku@dokku.me/node-js-app
# 指定了可选的 port
ssh://dokku@dokku.me:22/node-js-app
# 通用形式
ssh://dokku@HOSTNAME:PORT/APP_NAME
```
此格式模仿了 DSN 格式。它类似于普通 `git push dokku main` 命令所使用的格式,不过应用名称与主机名其余部分的分隔符改为了斜杠。port 是完全可选的,但允许用户根据需要将 SSH server 重新绑定到另一个端口。
### Hooks
此 image 允许在应用部署过程中触发各种基于文件的 hook。这些 hook 应该是相对于执行 `dokku-deploy` 脚本的当前工作目录(通常是您的仓库根目录)的可执行文件。
脚本中可以使用以下环境变量:
- `APP_NAME`:将要部署的远程应用的名称。这考虑了解析后的 `GIT_REMOTE_URL` 和 `REVIEW_APP_NAME`。
- `IS_REVIEW_APP`:如果正在部署 review app,则为 `true`,否则为 `false`。
- `SSH_REMOTE`:解析后的 ssh remote url。
最简单的 hook 是如下的 shell 脚本:
```
#!/bin/sh -l
echo "hello world"
```
要执行远程的 dokku 命令,可以像这样执行 `ssh` 二进制文件:
```
#!/bin/sh -l
ssh "$SSH_REMOTE" -- version
```
此外,如果某个 Dokku 命令_仅_应在 review app 中执行,可以检查 `IS_REVIEW_APP` 变量的值是否为 `true`,以包裹 review app 特定的逻辑:
```
#!/bin/sh -l
if [ "$IS_REVIEW_APP" = "true" ]; then
ssh "$SSH_REMOTE" -- config:set "$APP_NAME" "DOMAIN=$APP_NAME.dokku.me"
echo "configured the review app domain"
fi
```
以下 hook 可用:
- `bin/ci-pre-deploy`:在任何应用设置完成之后、应用部署之前触发
- `bin/ci-post-deploy`:在应用部署之后触发
- `bin/ci-pre-review-app-destroy`:在 review app 被销毁之前触发
- `bin/ci-post-review-app-destroy`:在 review app 被销毁之后触发
## 构建
```
docker build dokku/ci-docker-image .
```
标签:Cutter, Docker, Dokku, SOC Prime, 内存分配, 安全防御评估, 开发工具, 特权提升, 网络安全研究, 自动化部署, 请求拦截