Drone 官方示例 - Example Go project

用 Docker 部署 Go 服务器

Golang 官方示例 - outyet

一个生产环境的例子

用 rsync 复制文件的方式进行部署的例子

实际的 DevOps 项目中,在 pipeline 流水线中包含下载代码、测试、构建、发布、部署、通知等步骤。基本流程如下,当然不同的语言或不同的需求下流程会有所差异:

clone -> test -> build -> publish -> deploy -> notify

包含开发的完整流程为:

  1. 开发项目代码,包括 .drone.yml 文件和 Dockerfile 文件
  2. 上传代码至 Gogs,通过 Gogs 的 webhook 触发 Drone 的 Pipeline
  3. Drone 开始 Pipeline 的执行
    1. clone 代码至容器
    2. 测试
    3. 编译代码,构建可执行文件(Java、Golang 等编译型语言需要,PHP 之类的脚本语言则不需要)
    4. 将项目和运行环境打包成镜像,发布到 Registry(当然也可以使用 rsync 将编译后的文件(Golang 等)或源码(PHP 等)部署到服务器,此时需要在目标服务器提前安装运行环境)
    5. 部署至生产环境
    6. 发送邮件等通知信息

Drone 的文档挺差劲,不过 Drone 用起来还是挺简单的,比 Jenkins 简单到无法描述。

打通 Gogs 和 Drone

创建 Git 项目

登录 Gogs 后,从 Web 页面创建项目。我的 Gogs 项目地址是 https://gogs.kikakika.com

创建完成后,可以在 Web 页面添加文件,但是比较麻烦。这里把仓库添加到本地:

git clone https://gogs.kikakika.com/lihongfeng/first.git

然后,在仓库中创建 .drone.ymlhello.gohello_test.go 三个文件。

编写 .drone.yml 文件

这里直接使用 Go 的官方镜像

workspace:
base: /go
path: src/gogs.kikakika.com/lihongfeng/first pipeline:
build:
image: golang:1.10.2
commands:
- go test
- go build

其中,workspace 定义了可以在构建步骤之间共享的 volume 和工作目录。建议设置 workspace 以使用所需的 GOPATH。其中:

  • base 定义了一个可用于所有 pipeline 步骤的共享的 volume。这可确保源代码、依赖项和编译的二进制文件在步骤之间持久保存和共享。
  • path 定义了用于构建的工作目录。代码会克隆到这个位置,并且构建过程中每个步骤都会使用这个工作目录作为默认的工作目录。path 必须是相对路径,并且可以与 base 相结合。

编写 Golang 代码

main.go

package main

import (
"fmt"
) func main() {
fmt.Printf("hello world");
} func hello() string {
return "hello world";
}

main_test.go

package main

import "testing"

func TestHello(t *testing.T) {
if hello() != "hello world" {
t.Error("Testing error")
}
}

提交代码

$ git add ./
$ git commit -m "try drone with golang demo"
[master f8a6927] try drone with golang demo
3 files changed, 33 insertions(+)
create mode 100644 .drone.yml
create mode 100644 main.go
create mode 100644 main_test.go
$ git push
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 696 bytes | 696.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://gogs.kikakika.com/lihongfeng/first.git
b8c5bdd..f8a6927 master -> master

查看 Drone 的 web 端是否成功触发

可以看到成功触发了 CI。具体页面截图如下。

  • 项目主页:

  • clone 阶段:

+ git init
Initialized empty Git repository in /go/src/gogs.kikakika.com/lihongfeng/first/.git/
+ git remote add origin https://gogs.kikakika.com/lihongfeng/first.git
+ git fetch --no-tags origin +refs/heads/master:
From https://gogs.kikakika.com/lihongfeng/first
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
+ git reset --hard -q fbcf4d02a0294c943269634edd517c977ea03cfb
+ git submodule update --init --recursive
  • build 阶段:
+ go test
PASS
ok gogs.kikakika.com/lihongfeng/first 0.002s
+ go build

实现 CI/CD

上面的例子只是构建项目及运行测试,并没有构建镜像及将镜像发布到 Registry,更没有操作生产环境服务器更新镜像。

构建镜像需要用到 Docker 插件.

通过更新上面的 .drone.yml 文件实现这几个步骤:

workspace:
base: /go
path: src/gogs.kikakika.com/lihongfeng/first pipeline:
test:
image: golang:1.10.2
commands:
- go test
build:
image: golang:1.10.2
commands:
- go build
publish:
image: plugins/docker
repo: kikajack/first
dockerfile: ./Dockerfile
tags: latest
# registry: https://harbor.kikakika.com # 如果使用自建的镜像仓库,例如 Harbor,这里可以通过 registry 指定
secrets: [ docker_username, docker_password ] # 这里的用户名和密码在 web 界面指定 # 如果需要自动部署容器到服务器,可以打开下面这部分代码
# deploy:
# image: appleboy/drone-ssh # 用于连接服务器
# host:
# - your_host
# username: your_name
# password: your_pass
# port: 22
# command_timeout: 300 # ssh命令行执行超时时间,300秒
# script:
# - docker pull repo_url:latest
# - docker rm -f docker-demo || true # 这里这样是因为如果不存在docker-demo,rm会报错
# - docker run -d -p 8065:8065 --name docker-demo repo_url

其中 secrets: [ docker_username, docker_password ] 中指定的用户名密码,需要在 Drone 的 Web 页面设置。这样可以避免在配置文件中出现密码,安全。

Dockerfile 文件

需要在项目根目录中创建 Dockerfile 文件,用于构建镜像。可以参考 通过 Docker 部署 Go 服务器,这里有完整的示例。这个文件支持两种方式构建镜像:容器外编译后复制二进制文件到容器,或复制源代码到容器后在容器中编译得到二进制文件。

复制源代码到容器后在容器内编译:

# 官方的 Golang 镜像基于 Debian,且 workspace(GOPATH)配置为 /go
FROM golang:1.10.2 # 将本地的 Go 文件复制到容器中的 workspace
ADD . /go/src/gogs.kikakika.com/lihongfeng/first # 在容器内编译构建应用。可以在这里获取或管理依赖关系,可以手动或使用诸如“godep”之类的工具
RUN go install gogs.kikakika.com/lihongfeng/first # 容器启动时,默认运行 first 应用
ENTRYPOINT /go/bin/first # 监听 8080 端口
EXPOSE 8080

容器外编译后复制二进制文件到容器

可以参考 这个例子

  • Dockerfile 文件:
FROM plugins/base:multiarch

LABEL maintainer="Bo-Yi Wu <appleboy.tw@gmail.com>" \
org.label-schema.name="Drone Workshop" \
org.label-schema.vendor="Bo-Yi Wu" \
org.label-schema.schema-version="1.0" ADD release/linux/amd64/helloworld /bin/ HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD [ "/bin/helloworld", "-ping" ] ENTRYPOINT ["/bin/helloworld"]
  • .drone.yml 文件:
workspace:
base: /go
path: src/github.com/go-training/drone-golang-example clone:
git:
image: plugins/git
depth: 50
tags: true pipeline:
testing:
image: golang:1.10.0
commands:
- go test -v .
- go vet build_linux_amd64:
image: golang:1.10.0
group: build
commands:
- make build_linux_amd64 build_linux_i386:
image: golang:1.10.0
group: build
commands:
- make build_linux_i386 publish_linux_amd64:
image: plugins/docker:17.05
pull: true
secrets: [ docker_username, docker_password ]
group: release
repo: appleboy/test
auto_tag: true
dockerfile: Dockerfile
when:
event: [ push, tag ]
local: false publish_alpine:
image: plugins/docker
group: release
pull: true
dockerfile: Dockerfile.alpine
secrets: [ docker_username, docker_password ]
default_tags: true
default_suffix: alpine
repo: appleboy/test
when:
event: [ push, tag ]
local: false

验证镜像是否上传成功

  • 登录官方镜像仓库 https://hub.docker.com/r/kikajack/first,可以看到镜像上传成功了。

  • 执行一下,会成功的输出“hello world”:
[root@VM_139_74_centos ~]# docker run kikajack/first
Unable to find image 'kikajack/first:latest' locally
latest: Pulling from kikajack/first
cc1a78bfd46b: Already exists
6861473222a6: Already exists
7e0b9c3b5ae0: Already exists
3ec98735f56f: Already exists
32ecd1fcfe1a: Already exists
9889d58a42e5: Already exists
337bad6698be: Already exists
831eeb459358: Pull complete
d4438c00f9db: Pull complete
Digest: sha256:9caf567d796deead445606f56892f843f8869aef92d27bb8ff20985cd8a82169
Status: Downloaded newer image for kikajack/first:latest
hello world[root@VM_139_74_centos ~]#

Drone 持续集成实践 - 基于 Gogs,以 Golang 为例的更多相关文章

  1. 持续集成实践---基于ant+jmeter+jenkins接口CI

    背景: 大纲: jmeter入门教程 jenkins入门教程 ant介绍 jmeter+ant脚本自动执行实践 接口测试CI实践

  2. 基于Jenkins的开发测试全流程持续集成实践

    今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...

  3. 入门系列之在Ubuntu上安装Drone持续集成环境

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小铁匠米兰的v 发表于云+社区专栏 介绍 Drone是一个流行的持续集成和交付平台.它集成了许多流行的版本控制存储库服务,如GitHu ...

  4. 「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点

    1. 前言 随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率.特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催促之下,对于企业研发团队所需 ...

  5. 「持续集成实践系列 」Jenkins 2.x 构建CI自动化流水线常见技巧

    在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法.原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要 ...

  6. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  7. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  8. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

  9. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

随机推荐

  1. opencv中画圆circle函数和椭圆ellipse函数

    1.      void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, ...

  2. Docker实战部署应用——MySQL5.7

    MySQL 部署 拉取MySQL镜像 拉取命令: docker pull mysql:5.7 查看镜像 docker images 创建 MySQL 容器 docker run -id --name= ...

  3. 【python】pyenv与virtualenv安装,实现python多版本多项目管理

    踩了很多坑,记录一下这次试验,本次测试环境:Linux centos7 64位. pyenv是一个python版本管理工具,它能够进行全局的python版本切换,也可以为单个项目提供对应的python ...

  4. opencv windows源码编译

    WITH_QT//H:\software\programming\qt\5.12.3\mingw73_32\lib\cmake  5.6的路径要改这样 WITH_OPENGL 编译器mingw32-m ...

  5. 新特性2-lambda表达式

    最近几天学习了一下lambda表达式,看了不少博客,感觉有一篇博客总结的一句话总结的很好:lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为.其实以前也有传递行为 ...

  6. Redis安装配置以及开机启动

    1.下载源码,解压缩后编译源码.  $ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ .tar.gz $ cd redis- ...

  7. Zabbix分布式监控系统实践

    https://www.zabbix.com/wiki/howto/install/Ubuntu/ubuntuinstall 环境介绍OS: Ubuntu 10.10 Server 64-bitSer ...

  8. man arch

    ARCH(1)   Linux Programmer?. Manual/Linux程序员手册       ARCH(1) NAME/名称       arch - print machine arch ...

  9. tar解压命令

    解压 tar –xvf file.tar //解压 tar包 tar -xzvf file.tar.gz //解压tar.gz tar -xjvf file.tar.bz2 //解压 tar.bz2 ...

  10. OPTIONS请求后台处理 跨域Filter

    import cn.hutool.http.Method; import org.springframework.web.filter.OncePerRequestFilter; import jav ...