dokku/ci-docker-image

GitHub: dokku/ci-docker-image

一个面向 CI/CD 流水线的 Docker 镜像,封装了向 Dokku 平台自动化部署和 unlock 应用所需的全部逻辑与环境检测。

Stars: 37 | Forks: 25

# ci-docker-image [![Docker Image Version](https://img.shields.io/docker/v/dokku/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, 内存分配, 安全防御评估, 开发工具, 特权提升, 网络安全研究, 自动化部署, 请求拦截