mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 11:54:37 +00:00
Release v1.5.0: Restructure chapters and update for Docker v30.x
This commit is contained in:
6
14_cases/ci/drone/.env.example
Normal file
6
14_cases/ci/drone/.env.example
Normal file
@@ -0,0 +1,6 @@
|
||||
DRONE_SERVER_HOST=
|
||||
DRONE_SERVER_PROTO=
|
||||
DRONE_RPC_SECRET=
|
||||
HOSTNAME=
|
||||
DRONE_GITHUB_CLIENT_ID=
|
||||
DRONE_GITHUB_CLIENT_SECRET=
|
||||
2
14_cases/ci/drone/.gitignore
vendored
Normal file
2
14_cases/ci/drone/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
.env
|
||||
ssl/*
|
||||
99
14_cases/ci/drone/README.md
Normal file
99
14_cases/ci/drone/README.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# Drone
|
||||
|
||||
基于 `Docker` 的 `CI/CD` 工具 `Drone` 所有编译、测试的流程都在 `Docker` 容器中进行。
|
||||
|
||||
开发者只需在项目中包含 `.drone.yml` 文件,将代码推送到 git 仓库,`Drone` 就能够自动化的进行编译、测试、发布。
|
||||
|
||||
本小节以 `GitHub` + `Drone` 来演示 `Drone` 的工作流程。当然在实际开发过程中,你的代码也许不在 GitHub 托管,那么你可以尝试使用 `Gogs` + `Drone` 来进行 `CI/CD`。
|
||||
|
||||
## Drone 关联项目
|
||||
|
||||
在 Github 新建一个名为 `drone-demo` 的仓库。
|
||||
|
||||
打开我们已经 [部署好的 Drone 网站](install.md) 或者 [Drone Cloud](https://cloud.drone.io),使用 GitHub 账号登录,在界面中关联刚刚新建的 `drone-demo` 仓库。
|
||||
|
||||
## 编写项目源代码
|
||||
|
||||
初始化一个 git 仓库
|
||||
|
||||
```bash
|
||||
$ mkdir drone-demo
|
||||
|
||||
$ cd drone-demo
|
||||
|
||||
$ git init
|
||||
|
||||
$ git remote add origin git@github.com:username/drone-demo.git
|
||||
```
|
||||
|
||||
这里以一个简单的 `Go` 程序为例,该程序输出 `Hello World!`
|
||||
|
||||
编写 `app.go` 文件
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!\n");
|
||||
}
|
||||
```
|
||||
|
||||
编写 `.drone.yml` 文件
|
||||
|
||||
```yaml
|
||||
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
|
||||
```
|
||||
|
||||
现在目录结构如下
|
||||
|
||||
```bash
|
||||
.
|
||||
├── .drone.yml
|
||||
└── app.go
|
||||
```
|
||||
|
||||
## 推送项目源代码到 GitHub
|
||||
|
||||
```bash
|
||||
$ 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.yml) 文件。
|
||||
|
||||
## 参考链接
|
||||
|
||||
* [Drone Github](https://github.com/drone/drone)
|
||||
* [Drone 文档](https://docs.drone.io/)
|
||||
* [Drone 示例](https://github.com/docker-practice/drone-demo)
|
||||
BIN
14_cases/ci/drone/_images/drone-build.png
Normal file
BIN
14_cases/ci/drone/_images/drone-build.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
19
14_cases/ci/drone/demo/.drone.yml
Normal file
19
14_cases/ci/drone/demo/.drone.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
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
|
||||
22
14_cases/ci/drone/demo/README.md
Normal file
22
14_cases/ci/drone/demo/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Drone CI Demo 项目
|
||||
|
||||
这是一个基于 Go 语言编写的简单 Web 应用示例,用于演示 Drone CI 的持续集成流程。
|
||||
|
||||
## 目录结构
|
||||
|
||||
* `app.go`: 简单的 Go Web 服务器代码。
|
||||
* `.drone.yml`: Drone CI 的配置文件,定义了构建和测试流程。
|
||||
* `Dockerfile`: 定义了如何将该应用构建为 Docker 镜像。
|
||||
|
||||
## 如何运行
|
||||
|
||||
1. 确保本地已安装 Docker 环境。
|
||||
2. 进入本目录构建镜像:
|
||||
```bash
|
||||
docker build -t drone-demo-app .
|
||||
```
|
||||
3. 运行容器:
|
||||
```bash
|
||||
docker run -p 8080:8080 drone-demo-app
|
||||
```
|
||||
4. 访问 `http://localhost:8080` 查看效果。
|
||||
7
14_cases/ci/drone/demo/app.go
Normal file
7
14_cases/ci/drone/demo/app.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Printf("Hello World!\n");
|
||||
}
|
||||
38
14_cases/ci/drone/docker-compose.yml
Normal file
38
14_cases/ci/drone/docker-compose.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
|
||||
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:-drone.domain.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:
|
||||
86
14_cases/ci/drone/install.md
Normal file
86
14_cases/ci/drone/install.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# 部署 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` 文件。
|
||||
|
||||
```yaml
|
||||
|
||||
|
||||
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` 文件,输入变量及其值
|
||||
|
||||
```bash
|
||||
# 必填 服务器地址,例如 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
|
||||
|
||||
```bash
|
||||
$ docker-compose up -d
|
||||
```
|
||||
Reference in New Issue
Block a user