写点什么

基于 Drone 实现 CI/CD【0 到 1 架构系列】

  • 2024-07-29
    福建
  • 本文字数:3814 字

    阅读完需:约 13 分钟

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


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


前提条件


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

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

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


准备工作


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

#自动构建docker pull drone/dronedocker pull drone/drone-runner-docker
#自动部署docker pull drone/drone-runner-sshdocker pull dockerdocker pull plugins/dockerdocker 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: pipelinetype: dockername: 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: pipelinetype: dockername: 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: pipelinetype: dockername: 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: pipelinetype: dockername: 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: pipelinetype: dockername: 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: pipelinetype: dockername: default
steps: - name: 部署完成通知 #管道名称 image: curlimages/curl:latest commands: - curl -X POST "通知的webhook地址"
复制代码


一个完整的示例如下:

kind: pipelinetype: dockername: 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
复制代码


运行效果:




文章转载自:老猿新码

原文链接:https://www.cnblogs.com/netcore3/p/18325616

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
基于Drone实现CI/CD【0到1架构系列】_Java_不在线第一只蜗牛_InfoQ写作社区