Drone轻量自动化 - 将提交代码与线上部署画上等号

简介: 我所使用的集成构建平台为`Drone`,关于Drone的介绍安装可查看我的上一篇文章。

我们所要实现的,是代码提交之后,通过Drone将代码自动发布到线上,无需人工处理,所以多数工作实际在于脚本的编写。

而基本原理很简单,这里我使用的代码托管平台为Github,在提交代码(push)时,Github会向我们的Drone发送一条通知,内容包含了此次提交的各种信息,然后Drone会进行一系列预设操作,此时的入口默认为项目根目录.drone.yml文件,则根据该文件的描述执行了我们整个构建过程。

简单画了一下我当前的架构图:

image.png

编写yml配置文件

一份基础的.drone.yml配置可能是这样的:

kind: pipeline
type: docker
name: 部署Web项目

clone:
  disable: true

steps:

  - name: docker-clone
    image: alpine/git

  - name: docker-move
    image: alpine

  - name: docker-deploy
    image: appleboy/drone-ssh

trigger:
  branch:
    - publish
  event:
    - push

volumes:
  - name: cache
    host:
      path: /data/cache

可以看到根级的clone选项被我设置了disable: true,这表明无需clone代码,不设置的话drone默认会有一个clone的步骤。

根级steps则具体描述了整个部署过程,它可以是分阶段的,通过-来创建,这里我们整个部署过程都基于docker,在每个步骤下我们必须描述当前会基于哪个镜像操作,然后进行到该步骤时drone会创建一个临时的docker容器,这种容器插件的理念会贯穿在我们整个构建过程中。

多个步骤下,创建的容器实际都是独立的,但它们应该都挂载映射了同一个目录 /drone/src,所有容器的操作都是在这个目录下进行的,假设在步骤1中创建的容器A,创建了一个文件,然后在步骤2中创建容器B,对这个文件进行操作,这就是我部署所有步骤的核心。而具体操作什么,则以步骤2中的容器所依赖的镜像来决定(比如这个文件是Java,那么容器B就应该拉取的是java的docker镜像来操作,很好理解吧)。

根级的trigger我则简单配置了对分支的过滤,意思是只有当提交的代码是publish分支下的,才会执行部署操作。

下面我以一个实例来演示我如何部署。

拉取代码

部署的第一步,是获取目标代码,这个步骤可以使用alpine/git这个镜像

steps:
  - name: docker-clone
    pull: if-not-exists
    image: alpine/git
    environment:
      warehouse_name: 仓库名
      publish_branch: publish
    volumes:
      - name: sshkeys
        path: /root/.ssh
    commands:
      - echo $publish_branch
      - echo $DRONE_GIT_SSH_URL
      - chmod -R 600 /root/.ssh/
      - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
      - git clone -b $publish_branch --depth=1 $DRONE_GIT_SSH_URL
      - cd $warehouse_name
      - mv -f ./* /drone/src
      
volumes:
  - name: sshkeys
    host:
      path: /root/.ssh

配置ssh (在宿主机环境, 已配置则忽略) :

ssh-keygen -t rsa -C "your_email@example.com"
cd /root/.ssh/

cat id_rsa.pub

在这一步,前置步骤需要宿主机和Github配置好SSH的公钥私钥,这里主要是让容器内的环境可以使用宿主的sshKey,然后以最低深度clone仓库下publish分支的代码,其中environment是为该环境下注入全局变量。

最后我将clone下来的代码全部移到默认根目录,方便接下来操作。

执行部署

这一步比较灵活,通用的步骤是以ssh连接宿主机,这样进入宿主机之后就可以执行一些docker操作。

- name: link-to-ssh
    pull: if-not-exists
    image: appleboy/drone-ssh
    settings:
      PASSWORD:
        from_secret: PASSWORD
      host: xx.xx.xx.xx
      username: root
      password: PASSWORD
      port: 22
      script:
        - echo hello world

这一步由于涉及到服务器私密信息,不想暴露在配置文件中,于是需要到Drone的对应项目管理下创建一个Secret

image.png

然后通过from_secret即可调用到。

在线编译前端示例

drone会拉取node镜像,然后执行代码编译。

  - name: build-front
    pull: if-not-exists
    image: node
    settings:
      mirror: https://docker.mirrors.ustc.edu.cn
    commands:
      - yarn
      - yarn build

编译完成后可以通过volumes将编译后文件放到宿主机。

由于我个人服务器资源不高,在线编译速度慢,所以我其实是在本地进行打包编译,然后用脚本将打包后的dist目录压缩到publish分支再提交,而drone只需要执行解压文件转移文件即可。这部分与drone没有太大关系,所以暂不展开细说。

尚未解决的问题

目前有一个问题是项目仓库必须是公开的,一旦设为私有库webhook就无法正确请求到drone了,调试很久也不知原因,这在我之前使用Jenkins的时候并无此问题,所以判断应该是drone本身有bug,但如果对于企业项目的话代码不会托管在Github这种第三方平台,都是内部自己的仓库(如gitlab等),所以项目都没必要设为私有。

轻量代码仓库的解决方案有GogsGitea等,但我实在折腾不动了,于是把自己的项目改造了一番,涉及账号等私密信息的都不存放在代码里了。

Drone作为一个轻量的CI/CD构建工具,在使用上是完全没有问题的,相比Jenkins这种老大哥,Drone可能更适合小团队或个人使用,而目前国内社区热度似乎也不高,基本没有什么文章,官网文档也过于简单,项目一直在更新中,总之我个人还是比较喜欢这款工具的,希望它能越来越成熟吧。

补充码云 Gitee 相关

由于国内网络的问题,Github服务经常不稳定,后来直接更换到了码云作为发布仓库。有些需要注意的地方说明一下:

0. 仓库404问题

这个问题只在码云会遇到,由于码云的新建仓库逻辑是把仓库名称和链接分开的,所以一定要保证两者一致,采用驼峰写法它会"自作聪明"地给你把链接拆成带'-'的形式,这样drone识别仓库就会404了。

image.png

1. SSH算法问题

码云SSh不再能使用ras算法了,所以生成公钥需要使用 ssh-keygen -t ed25519 -C "yourName@xxxx.com" 这种key才可以使用。记得上面的加入主机列表也要改成 - ssh-keyscan -t ed25519 gitee.com >> ~/.ssh/known_hosts

相关文章
|
1月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的办公自动化管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的办公自动化管理系统附带文章源码部署视频讲解等
20 0
|
3月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的办公自动化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的办公自动化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
3天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
4天前
|
弹性计算 JSON 开发工具
"一键玩转阿里云ECS!Python大神揭秘:如何自动化创建镜像并跨地域复制,让你的云资源部署秒变高效达人!"
【8月更文挑战第14天】本文介绍如何使用Python与阿里云SDK自动化管理ECS镜像,包括创建镜像及跨地域复制,以优化云资源部署。首先安装`aliyun-python-sdk-ecs`并配置阿里云凭证。接着,通过Python脚本实现镜像创建与复制功能,简化日常运维工作并增强灾难恢复能力。注意权限及费用问题。
16 2
|
17天前
|
运维 安全 网络安全
自动化运维:使用Python脚本实现批量部署
【8月更文挑战第2天】在现代IT基础设施管理中,自动化运维成为提升效率、减少人为错误的关键。本文将通过一个实际的Python脚本示例,展示如何实现服务器的批量部署,包括环境准备、代码实现及执行过程。文章旨在为运维工程师提供一种简化日常任务的方法,同时强调安全性和可维护性的重要性。
|
18天前
|
运维 安全 测试技术
自动化运维的利剑:Ansible在企业级部署中的应用与挑战
本文深入探讨了Ansible,这一领先的IT自动化工具,如何在企业级部署中扮演关键角色。我们将通过实际案例分析,揭示Ansible在简化配置管理、加速应用部署和提高运维效率方面的优势。同时,文章也将不回避Ansible实施过程中可能遇到的技术挑战与限制,并提供针对性的解决策略。阅读本文后,您将获得一个全面的视角,理解Ansible在现代企业运维中不可或缺的地位,以及如何克服其面临的主要问题。
25 1
|
2天前
|
监控
只需部署这个脚本就可玩自动化,还是思科牛逼!
只需部署这个脚本就可玩自动化,还是思科牛逼!
|
1月前
|
Kubernetes Serverless 开发工具
代码提交即部署:Argo Workflows与EventBridge构建自动化CI
ACK One Serverless Argo工作流和EventBridge简单快速、高效、低成本地交付您的应用,为您实现代码提交即构建/交付的自动化CI系统。
|
2月前
|
运维 监控 Devops
基础设施即代码(IaC):自动化运维的新纪元
【6月更文挑战第21天】基础设施即代码(IaC)是将基础设施配置转为代码,实现自动化和标准化运维的实践。它通过文本文件描述基础设施,保证重复性、一致性和自动化部署。IaC提升效率,降低成本,加速产品上市,增强安全性和可移植性,在配置管理、环境管理、CI/CD及监控告警中发挥关键作用,推动DevOps和云时代的创新。
|
1月前
|
监控 网络协议 安全
由于楼层自动化系统的复杂性和多样性,很难给出一个通用的Python代码示例,因为每个系统可能使用不同的硬件、通信协议和软件接口。
由于楼层自动化系统的复杂性和多样性,很难给出一个通用的Python代码示例,因为每个系统可能使用不同的硬件、通信协议和软件接口。