CI/CD是持续性集交和持续性部署,简单来讲就是自动化构建和自动化部署。目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行。

目前很多源代码都集成了CI/CD功能,drone也是目前比较流行的一个方案,简单易用,高性能。

前提条件

已经使用Gitea部署作用源码管理,使用gitea搭建源码管理 。

已经使用Harbor部署私库,harbor 搭建和部署。

已经使用Portainer部署,portainer安装,配置,使用。

准备工作

拉取我们接下来CI/CD工作有可能会用到的docker镜像,后面会继续解释这些镜像的作用。

#自动构建
docker pull drone/drone
docker pull drone/drone-runner-docker #自动部署
docker pull drone/drone-runner-ssh
docker pull docker
docker pull plugins/docker
docker pull curlimages/curl

自动构建

drone是服务中心或者理解成任务中心,Git的webhook会通知到这里。

drone-runner-docker相当于实际参于构建工作的作业容器,drone-runner-docker定时与drone通讯获取构建任务,然后按规定的流程执行相应工作。这个流程的设计由.drone.yml配置文件决定,所以编写.drone.yml也是主要核心。

步骤一,设置Gitea的OAuth2登陆,因为drone采用OAuth2登陆方案。

登陆Gitea -> 右上角 -> 管理后台 -> 管理设置 -> 集成 -> 应用。创建应用,重定向 URI地址填写你部署的dron域名,例如:htts://drone.xxxx.com/login

步骤二,启动容器,可以单个容器启动,这里使用docker-compose进行管理。

version: "3"

services:
drone-server:
image: drone:latest
container_name: drone
environment:
- DRONE_GITEA_SERVER=https://gitea.xxxx.com #你部署的源码地址
- DRONE_GITEA_CLIENT_ID=dadda5f7-a951-4e8a-a2de-ebf737a5bef5 #Oauth2登陆,客户端Id
- DRONE_GITEA_CLIENT_SECRET=******************************** #Oauth2登陆,客户端密钥
- DRONE_RPC_SECRET=aaaaaaaaaaaaaaaaaaa #与drone-runner通讯的凭据,随便填写
- DRONE_SERVER_HOST=drone.xxxxx.com #绑定你的drone域名,用IP也行
- DRONE_SERVER_PROTO=https #http,https 都可以
- DRONE_TLS_CERT=/SSL/SSL.crt #HTTPS证书
- DRONE_TLS_KEY=/SSL/SSL.key #HTTPS证书
- DRONE_USER_CREATE=username:giteauser,admin:true #创建账号,这里需要填写你的gitea账号,默认管理员
- DRONE_USER_FILTER=giteauser #限制指定账号登陆
restart: always
volumes:
- /SSL:/SSL #挂载证书
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "443:443" drone-runner:
image: drone-runner-docker:latest
container_name: drone-runner
environment:
- DRONE_RPC_PROTO=https
- DRONE_RPC_HOST=drone.xxxxx.com:443 #drone的域名或IP
- DRONE_RPC_SECRET=aaaaaaaaaaaaaaaaaaa #drone通讯的凭据,填写上面的凭据
- DRONE_RUNNER_CAPACITY=2 #工作线程数
- DRONE_RUNNER_NAME=my-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock #挂载docker.sock,必需
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro

启动容器之后,访问drone域名就可以看到登陆页面,点击“CONTINUE”,就会跳转Gitea登陆,登陆就会授权成功返回drone界面。

步骤三,设置webhook。

进入drone界面之后,点击右上角的"SYNC"按钮,就会把Gitea项目同步过来,点击项目 -> Settings -> ACTIVATE REPOSITORY ,就自动在gitea相应的项目上面添加webhook。

查看Gitea的webhook。

在drone界面,设置项目的“Trusted”,这点非常重要,否则在后续构建中尽管挂载了docker.sock,仍然会提示如下错误,如果没有这个选项,是由于启动drone容器没有填写DRONE_USER_CREATE的原因。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
exit status 1

步骤四,至此自动构建就算搭建成功,接下来就是编写.drone.yml文件,需要将/var/run/docker.sock挂载进去,drone-runner实际上使用母机的docker在构建制品,也就是说构建成功之后镜像在母机上通过docker images就能查询出来。

下面示例使用Dockerfile文件进行构建,plugins/docker:latest镜像是预先设置好,具有基于dockerfile构建和推送功能的镜像。

kind: pipeline
type: docker
name: default steps:
- name: 构建&推送 #管道名称
image: plugins/docker:latest
volumes:
- name: dockersock
path: /var/run/docker.sock
settings:
registry: harbor.xxxxx.com #你部署的docker私库地址
repo: harbor.xxxxx.com/project/web
tags: latest
dockerfile: ./Dockerfile
pull_image: false #构建的时候是否强制拉取最新镜像
username: abc
password: 123 volumes: #挂载
- name: dockersock
host:
path: /var/run/docker.sock

也可以使用docker镜像,自行编写命令进行构建。

kind: pipeline
type: docker
name: default steps:
- name: 构建&推送 #管道名称
image: docker:latest
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker build -t web:latest .
- docker image tag web:latest harbor.xxxxx.com/project/web:latest
- docker push web:latest harbor.xxxxx.com/project/web:latest volumes: #挂载
- name: dockersock
host:
path: /var/run/docker.sock

步骤五,至此自动构建和推送到私库,基本就搭建完成。每次打包制品之后镜像都不会主动删除,所以我们可以增加多一个流程来删除剩余的镜像。

kind: pipeline
type: docker
name: default steps:
- name: 清理镜像 #管道名称
image: docker:latest
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {} volumes: #挂载
- name: dockersock
host:
path: /var/run/docker.sock

自部部署

方式一,SSH远程登陆,拉取镜像,重新部署。

kind: pipeline
type: docker
name: default steps:
- name: SSH部署 #管道名称
image: drone/drone-runner-ssh:latest
settings:
host: 192.168.3.78
username: root
password: 123
port: 22
script: #部署执行动的命令
- echo ====开始部署=======
- docker pull harbor.xxxxx.com/project/web:latest
- docker stop web
- docker rm web
- docker run -d --name web -p 80:8080 harbor.xxxxx.com/project/web:latest
- echo ====部署成功======

方式二,通过Portainer的webhook进行更新。

进入portainer管理界面,进入容器详情页,开启容器的webhook,复制通地址。

kind: pipeline
type: docker
name: default steps:
- name: Portainer部署 #管道名称
image: curlimages/curl:latest
commands:
- curl -X POST "https://portainer.xxxx.com/api/webhooks/983DB2D1-34B8-4527-087B-08D76FE58AE5"

部署完成通知

部署完成之后,开发者可以通过drone管理界面查看进度,或者通过webhook通知推送成功消息到微信,短信,邮件,钉钉等。

kind: pipeline
type: docker
name: default steps:
- name: 部署完成通知 #管道名称
image: curlimages/curl:latest
commands:
- curl -X POST "通知的webhook地址"

一个完整的示例如下:

kind: pipeline
type: docker
name: default steps:
- name: 构建&推送 #管道名称
image: plugins/docker:latest
volumes:
- name: dockersock
path: /var/run/docker.sock
settings:
registry: harbor.xxxxx.com #你部署的docker私库地址
repo: harbor.xxxxx.com/project/web
tags: latest
dockerfile: ./Dockerfile
pull_image: false #构建的时候是否强制拉取最新镜像
username: abc
password: 123 - name: 清理镜像 #管道名称
image: docker:latest
volumes:
- name: dockersock
path: /var/run/docker.sock
commands:
- docker images --filter=reference='harbor.xxxxx.com/project/web:*' --format '{{.ID}}' | xargs -I {} docker rmi -f {} - name: Portainer部署 #管道名称
image: curlimages/curl:latest
commands:
- curl -X POST "https://portainer.xxxx.com/api/webhooks/983DB2D1-34B8-4527-087B-08D76FE58AE5" - name: 部署完成通知 #管道名称
image: curlimages/curl:latest
commands:
- curl -X POST "通知的webhook地址" volumes: #挂载点,共用
- name: dockersock
host:
path: /var/run/docker.sock

运行效果:

基于Drone实现CI/CD【0到1架构系列】的更多相关文章

  1. 基于ASP.NET Core 6.0的整洁架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ...

  2. Gogs + Drone 实现CI/CD(CD)

    前文已经实现CI部分,本文继续以Asp.Net Core实现CD部分. 创建gogs仓库 首先在gogs创建一个空项目drone-ci-demo,本地新建一个asp.net core项目,并且在与.c ...

  3. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(三)

    从最基础镜像到业务容器 构建 [为gitlab项目部署做铺垫] 业务镜像设计规划 目录结构 # pwd /data/k8s/app/myapp # tree . . ├── dockerfile │  ...

  4. Gogs+Drone搭建CI/CD平台

    Gogs 是由 Go 语言编写的 Git 服务器,由中国人主导开发的一款开源项目,搭建方便并且拥有完善的中文文档,配合 Drone 可以实现持续集成/持续部署.本文介绍如何通过 Docker 搭建 G ...

  5. Gogs + Drone 实现CI/CD(CI)

    本文通过docker-compose方式安装运行drone,先将drone的server和agent镜像拉取到本地,这样docker-compose脚本执行速度会快一点.当然,不是必须先拉取drone ...

  6. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(一)

    注:这部分的学习还是要靠自己多点点 多尝试尝试 这部分19年3月份我是玩的很溜的,一年没用,基本忘光光了. 学习要温故而知新! 流程拓扑图 前提准备 部署应用服务 部署kubernetes 集群:ht ...

  7. 基于k8s的CI/CD的实现

    综述 首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里. 在微服务.DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情.虽然市面上目前已经存在了比较成熟的自动化 ...

  8. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(四)

    前景提要 jenkins与gitlab结合,实现代码自动拉取:https://www.cnblogs.com/zisefeizhu/p/12548662.html jenkins与kubernetes ...

  9. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(二)

    一张网图 因为我们使用了Docker in Docker技术,就是把jenkins部署在k8s里.jenkins master会动态创建slave pod,使用slave pod运行代码克隆,项目构建 ...

  10. Jenkins自动化CI CD流水线之4--Master-Slave架构

    一.介绍 jenkins的Master-slave分布式架构主要是为了解决jenkins单点构建任务多.负载较高.性能不足的场景. Master/Slave相当于Server和agent的概念.Mas ...

随机推荐

  1. 在Rainbond上部署高可用Apollo集群

    一.背景信息 当前文档描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 Apollo 集群.这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kube ...

  2. ReplayKit2 有线投屏项目-反向Socket实现

    一.需求 我们在使用RTMP协议进行推流的时候,底层仍然采用的是TCP协议或者QUICK协议,有客户端主动发起请求.但是在有线投屏中,需要PC端向手机发起请求建立连接 二.实现 在客户端主动发起请求之 ...

  3. 我用docker搭建的第一个博客

    其实很早就听说了docker这个东西,一直以来想玩不知道拿什么下手,再加上前段时间听了一个思科的年度网络报告讲解里面稍微提了一下docker的优势以及网络即服务的概念.想通了,不是每一步都得亲历亲为, ...

  4. 初学go语言

    for(int a = 0; a<10 ; a++){ // c语言的循环 } for a := 0 ; a<10 ; a++ {     // go语言的循环 } // for二边的括号 ...

  5. Chapter1 p1 Output Image

    由于本文章是对TinyRenderer的模仿,所以并不打算引入外部库. 那么我们第一步需要解决的就是图形输出的问题,毕竟,如果连渲染的结果都看不到,那还叫什么Renderer嘛. 由于不引入外部库,所 ...

  6. vue bus传参

    新建一个js文件,命名为bus.js.bus.js文件的内容为: import Vue from 'vue' const bus = new Vue() export default bus 页面de ...

  7. Mysql性能优化(详解)

    引言 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操 ...

  8. linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档

    linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档 1.解压缩压缩命令 zip -p -r mymail-1026.zip mymail/ 解压命令 unzip mymai ...

  9. 有点儿神奇,原来vue3的setup语法糖中组件无需注册因为这个

    前言 众所周知,在vue2的时候使用一个vue组件要么全局注册,要么局部注册.但是在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?注:本文中使用的vue版本为3. ...

  10. python _XMLParser.__init__()初始化失败,提示“takes 1 positional argument but 4 were given”

    问题: 在一个新的环境下,执行openpyxl相关的操作,初始化时,逐步执行,需要调到 ElementTree.py _XMLParser.__init__(self, html, target, e ...