• Post author:
  • Post category:运维
  • Post comments:2评论
  • Reading time:4 mins read

CI/CD整体来说就是自动构建和自动部署,以容器化项目来说,CI包含了拉取代码,然后使用dockerfile进行项目依赖的重建和对源码的编译,最后打包成docker镜像,push到镜像仓库,本期我们将了解如何使用Drone进行CI,而Drone的CD步骤则放到下期再讲。

本文假设您已按照前几期的文章部署好了drone和runner。

前言

k8s使用drone进行CI分为几个步骤:

  • 注册镜像仓库账号密码或搭建私人仓库
  • 编写.drone.yml流水线配置文件
  • 在drone里开启要进行cicd的仓库
  • 准备好仓库机密或使用k8s的Secret

关于k8s使用镜像私仓的方式可以参考这篇文章,本文使用了阿里云容器镜像仓库个人版。

开启要cicd的仓库,点右上角的sync后可以看到你gitea或者是你登录drone用的其他仓库的用户的仓库列表,点击进去后选择active,激活该仓库的cicd,drone会自动去该仓库配置webhook。

仓库机密可以在drone的仓库设置内进行设置:

当然你也可以通过安装drone-secret插件来实现直接引用k8sSecret的方式,本文也将使用这种方式,具体参考下文。

编写.drone.yml

.drone.yml就是drone的流水线文件,一般新建在项目根目录就可以,如果你需要放在其他目录,要记得更改drone的项目配置:

注意drone.yml的位置要正确

废话不多说,先直接上一份例子,这里我以一个vue3项目来演示,先看dockerfile:

FROM node:14-alpine as build

WORKDIR /app
COPY . .
WORKDIR /app/trank
RUN npm install && npm run build

FROM nginx
RUN mkdir /app
COPY --from=build /app/trank/dist /app
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

没很么好说的,接下来看.drone.yml:

kind: pipeline
type: kubernetes
name: hulu-project

steps:
- name: docker
  image: plugins/docker
  settings:
    mirror: https://xxxxx.mirror.aliyuncs.com
    username:
      from_secret: username
    password:
      from_secret: password
    repo: registry-vpc.cn-shanghai.aliyuncs.com/hulu0811/whatsfordinner
    registry: registry-vpc.cn-shanghai.aliyuncs.com
    tags:
      - latest
      - ${DRONE_COMMIT}



---
kind: secret
name: username
get:
  path: docker-secret
  name: DOCKER_USERNAME

---
kind: secret
name: password
get:
  path: docker-secret
  name: DOCKER_PASSWORD

具体的配置项和标记语法我这里就不赘述了,建议直接去drone的官方文档查阅,这里只简单介绍下重要的地方。

首先要说的是Drone是docker in docker环境(dind),它的每个step实际上是起一个docker容器来跑任务的,理论上讲,你自己写一个命令行程序打成镜像,也可以在step的image中引用 ,本系列文章使用的drone的插件文档你都可以在官方插件文档库找到相关文档。

先看type字段,这里的值可以是 kubernetes 、ssh 、docker、aws、exec等,以k8s和docker举例,如果你的drone是跑在k8s内的,那么你就选择使用k8s的type,runner在跑step的时候就是在你的集群内创建pod,有几个step,pod里面就有几个container,它会按顺序执行。

同样的,如果你使用docker类型,它就是启动docker容器来运行任务,而exec和ssh比较特殊,exec是直接在服务器裸机上执行命令,而ssh则是在远程服务器执行命令。

接下来看name为docker的step,这里的image引用的是插件名称,这个插件是一个docker插件,也就是说,这个插件镜像内是一个docker环境,没错,是不是有点套娃?CI整个步骤都是在这里进行完成的。

再看settings,这里是该步骤插件的一些变量,实际上对于插件来说就是它的环境变量,我这里使用了阿里云的私有仓库,所以需要提供username和password,而drone.yml是要跟随代码上传到代码仓库的,所以这里username和password自然不能明文写在文件内,我们应该使用前文描述的drone secret或者k8s Secret,两者在使用上差别不大:

  • drone secret:在drone的项目setting里配置Secret,然后在.drone.yml内通过from_secret:secretName进行引用就可以了。
  • k8s secret: 如常配置k8s的Secret后,在.drone.yml的末尾添加kind:secret类型的资源,也就是上述yml末尾的username和password,path就是k8s secret的名称,name则是内部key的名称,定义好之后与drone secret一样使用就好。

然后是tags,这里定义了latest和drone_commit俩tag,后者是使用了drone自带的全局变量,用代码commitID作为tag,方便好用,定义俩标签的原因是为了方便容器回滚和实现dind的docker layer cache,这个是后话了,暂且不提。

最后就是repo和registry了,这个不用多说,前者是具体的镜像仓库,后者是仓库的地址,我这里使用的是阿里云镜像仓库,且是内网vpc地址,如果你使用的是腾讯云或百度云,记得也可以去白嫖一下对应的镜像仓库个人版,免费还好用,自己购买云服务器的情况下不建议自己自建镜像仓库,浪费资源。

运行流水线

之后提交代码到源头仓库,比如我这里是github,Github会通过action推送代码到我的gitea,然后gitea会触发drone自动添加到仓库的webhook,接下来ci的流程就开始了:

克隆代码
构建镜像并push到镜像仓库

小结

那么Drone的CI流程就结束了,接下来就是最重要的部分了,也就是CD,自动化部署,下一篇将介绍如何在K8S上实现自动部署。

葫芦

葫芦,诞生于1992年8月11日,游戏宅,胶佬,爱好摸鱼,一个干过超市收银,工地里搬过砖,当过广告印刷狗,做过电焊铁艺的现役.Net程序员。

这篇文章有 2 个评论

发表回复