作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!
CI/CD
持续集成(Continuous integration) 是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续部署(continuous deployment) 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。
与 Jenkins
不同的是,基于 Docker 的 CI/CD 每一步都运行在 Docker 容器中,所以理论上支持所有的编程语言。
一、GitHub Actions
GitHub Actions 是 GitHub 推出的一款 CI/CD 工具。
我们可以在每个 job
的 step
中使用 Docker 执行构建步骤。
on: push
name: CI
jobs:
my-job:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: 2
- name: run docker container
uses: docker://golang:alpine
with:
args: go version
参考资料
- Actions Docs
二、Drone
基于 Docker
的 CI/CD
工具 Drone
所有编译、测试的流程都在 Docker
容器中进行。
开发者只需在项目中包含 .drone.yml
文件,将代码推送到 git 仓库,Drone
就能够自动化的进行编译、测试、发布。
本小节以 GitHub
+ Drone
来演示 Drone
的工作流程。当然在实际开发过程中,你的代码也许不在 GitHub 托管,那么你可以尝试使用 Gogs
+ Drone
来进行 CI/CD
。
Drone 关联项目
在 Github 新建一个名为 drone-demo
的仓库。
打开我们已经 部署好的 Drone 网站 或者 Drone Cloud,使用 GitHub 账号登录,在界面中关联刚刚新建的 drone-demo
仓库。
编写项目源代码
初始化一个 git 仓库
$ mkdir drone-demo
$ cd drone-demo
$ git init
$ git remote add origin git@github.com:username/drone-demo.git
这里以一个简单的 Go
程序为例,该程序输出 Hello World!
编写 app.go
文件
package main
import "fmt"
func main(){
fmt.Printf("Hello World!\n");
}
编写 .drone.yml
文件
kind: pipeline
type: docker
name: build
steps:
- name: build
image: golang:alpine
pull: if-not-exists # always never
environment:
KEY: VALUE
commands:
- echo $KEY
- pwd
- ls
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
- ./app
trigger:
branch:
- master
现在目录结构如下
.
├── .drone.yml
└── app.go
推送项目源代码到 GitHub
$ git add .
$ git commit -m "test drone ci"
$ git push origin master
查看项目构建过程及结果
打开我们部署好的 Drone
网站或者 Drone Cloud,即可看到构建结果。
当然我们也可以把构建结果上传到 GitHub,Docker Registry,云服务商提供的对象存储,或者生产环境中。
本书 GitBook 也使用 Drone 进行 CI/CD,具体配置信息请查看本书根目录 .drone.yml
文件。
参考链接
- Drone Github
- Drone 文档
- Drone 示例
三、部署 Drone
要求
-
拥有公网 IP、域名 (如果你不满足要求,可以尝试在本地使用 Gogs + Drone)
-
域名 SSL 证书 (目前国内有很多云服务商提供免费证书)
-
熟悉
Docker
以及Docker Compose
-
熟悉
Git
基本命令 -
对
CI/CD
有一定了解
新建 GitHub 应用
登录 GitHub,在 https://github.com/settings/applications/new 新建一个应用。
接下来查看这个应用的详情,记录 Client ID
和 Client Secret
,之后配置 Drone 会用到。
配置 Drone
我们通过使用 Docker Compose
来启动 Drone
,编写 docker-compose.yml
文件。
version: '3'
services:
drone-server:
image: drone/drone:2.3.1
ports:
- 443:443
- 80:80
volumes:
- drone-data:/data:rw
- ./ssl:/etc/certs
restart: always
environment:
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-https://drone.yeasy.com}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID}
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET}
drone-agent:
image: drone/drone-runner-docker:1
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret}
- DRONE_RUNNER_NAME=${HOSTNAME:-demo}
- DRONE_RUNNER_CAPACITY=2
dns: 114.114.114.114
volumes:
drone-data:
新建 .env
文件,输入变量及其值
# 必填 服务器地址,例如 drone.domain.com
DRONE_SERVER_HOST=
DRONE_SERVER_PROTO=https
DRONE_RPC_SECRET=secret
HOSTNAME=demo
# 必填 在 GitHub 应用页面查看
DRONE_GITHUB_CLIENT_ID=
# 必填 在 GitHub 应用页面查看
DRONE_GITHUB_CLIENT_SECRET=
启动 Drone
$ docker-compose up -d
作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!