7.4 自动化构建综合应用

系列 - 自动化构建与持续集成
摘要
本实验将带你综合应用 gitea、drone、harbor 实现自动构建镜像、自动部署项目、自动推送镜像到 Harbor,邮件通知。

1、先配置手动构建使用的 Dockerfile

bash

cd /root/myproject
vim Dockerfile

文件内容如下:

注:

  • FROM 指定父镜像
  • RUN 运行后面的命令
  • WORKDIR 指定工作目录,没有则创建
  • COPY 将上下文目录中的文件复制到镜像
  • CMD 指定容器入口(容器启动时运行的命令)

如果构建过程中出现网络问题,可以在 Dockerfile 增加三个环境变量,将教师机作为网络流量的代理服务器:

dockerfile

env HTTP_PROXY 192.168.192.160:10809
env HTTPS_PROXY 192.168.192.160:10809
env ALL_PROXY 192.168.192.160:10809

2、测试 Dockerfile 是否可以正常使用

bash

docker build -t myproject:v1 .

命令最后的 . 就是上下文目录。它其实就是 docker build 的”工作目录“

如果可以正常地手动构建,才可以进行下一步操作

3、撰写 drone 的配置文件

创建文件 .drone.yml 该文件用来控制 drone 进行镜像构建的流程

与 Dockerfile 和 docker-compose.yml 文件一样,.drone.yml 也有一个默认的文件名规范,注意它默认是隐藏文件,以.开头

bash

cd /root/myproject
vim .drone.yml

文件内容如下:

yml

kind: pipeline # 默认为 pipeline
type: docker
name: deployment # 构建文件名称

# 数组结构,流水线化的构建步骤
steps: 
# 步骤1 将镜像推送到 Harbor
- name: 推送到Harbor
  pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
  image: plugins/docker 
  settings:
    dockerfile: Dockerfile  # Dockerfile 在项目中的位置
    tags: latest # 生成镜像后的标签名
    insecure: true      # 是否不安全
    registry: 192.168.192.135:9000  # 私有镜像仓库地址
    repo: 192.168.192.135:9000/library/myproject00   # 仓库地址/Harbor项目名称/自定义镜像名称
    username:
     # 从drone仓库配置中秘密空间读取用户名
      from_secret: harbor_username
    password:
    # 从drone仓库配置中秘密空间读取密码
      from_secret: harbor_password
配置说明
  • pull: if-not-exists:只有在镜像不存在时才拉取,可以节省构建时间
  • image: plugins/docker:使用 Drone 官方的 Docker 插件来构建和推送镜像
  • settings:插件的配置参数
    • dockerfile:指定 Dockerfile 的路径
    • tags:镜像标签,这里使用 latest
    • insecure:是否允许不安全连接,生产环境应设为 false
    • registry:Docker 镜像仓库地址
    • repo:完整的镜像名称,包括仓库地址、项目名和镜像名
    • username/password:从 Drone 的密钥中获取认证信息

3、在 Drone 中添加 Harbor 的认证信息

配置文件的最后四行指定从 secret 中获取 Harbor 的用户名和密码。我们需要回到 Drone 网页,添加这两个 secret:

添加Harbor认证信息

警告
确保 secret 的名称与 .drone.yml 文件中的 from_secret 值完全一致,否则构建过程将无法获取正确的认证信息。

4、将配置文件提交到 Git 仓库

bash

# 添加到暂存区
git add Dockerfile .drone.yml
# 添加到本地仓库
git commit -m "更新构建的配置文件"
# 推送到远程仓库
git push

5、验证自动构建流程

代码推送完成后,回到 Drone 网页,你应该能看到自动触发的构建过程:

构建过程

技巧
点击构建任务可以查看详细的构建日志,这对于调试构建问题非常有帮助。

构建成功

构建成功后,我们可以打开 Harbor 网页,查看是否成功推送了镜像:

Harbor中的镜像

成功
恭喜!你已经成功配置了自动构建流程。每当你向 Git 仓库推送代码时,Drone 都会自动触发构建并将镜像推送到 Harbor 仓库。

在这个任务中,我们将扩展自动化流程,不仅构建镜像,还要自动将应用部署到目标服务器上。

1、修改 .drone.yml 文件,添加部署步骤

yml

- name: 部署
  pull: if-not-exists
  image: appleboy/drone-ssh
  settings:
   # 需要部署的主机地址
    host: 192.168.192.240
   # 主机ssh端口
    port: 22
    # 主机登陆用户名
    username: root
    password:
      from_secret: ssh_pwd
    script:
      - echo "=========暂停并删除旧容器========"
      - docker stop flask-demo && docker rm flask-demo
      - echo "=========删除旧镜像=============" 
      - docker rmi 192.168.192.135:9000/library/myproject00:latest
      - echo "========从harbor拉取最新镜像========"
      - docker pull 192.168.192.135:9000/library/myproject00:latest
      - echo "===============运行镜像=========="
      - docker run --name flask-demo -p 5000:5000 -d 192.168.192.135:9000/library/myproject00:latest
      - echo "========部署成功========"
部署步骤说明

这个部署步骤使用 appleboy/drone-ssh 插件,通过 SSH 连接到目标服务器并执行一系列命令:

  1. 停止并删除旧的容器(如果存在)
  2. 删除旧的镜像(如果存在)
  3. 从 Harbor 拉取最新的镜像
  4. 使用新镜像启动容器

这些命令确保每次部署都使用最新的镜像,并且不会因为旧容器或镜像而出现问题。

添加SSH密钥

警告
在添加部署步骤前,请确保在 Drone 中添加了 ssh_pwd 密钥,这是连接目标服务器所必需的。

2、提交更新后的配置文件并验证部署

提交并推送更新后的 .drone.yml 文件后,Drone 将自动触发新的构建和部署流程。完成后,可以在浏览器中打开 http://目标服务器IP:5000 进行验证:

部署成功

应用运行成功

部署成功
恭喜!你已经成功实现了自动部署。现在,每当你向 Git 仓库推送代码时,Drone 不仅会自动构建镜像并推送到 Harbor,还会自动将应用部署到目标服务器上。

最后,我们来添加邮件通知功能,让系统在部署完成后自动发送通知邮件。

1、在 .drone.yml 文件中添加邮件通知步骤:

yml

# 步骤3 部署完成,邮件通知
- name: notify
  pull: if-not-exists # 如果镜像不存在则拉取,免去每次都要重新下载
  image: drillster/drone-email
  settings:
    recipients_only: true # 只发送给指定邮件收件人,不默认发送给流水线创建人
    host: smtp.larksuite.com      # SMTP服务器 例如 smtp.qq.com
    port: 465   # SMTP服务端口  例如QQ邮箱端口465
    subject: "【测试项目】部署完成!"  # 邮件主题内容
    username:   # 邮箱用户名
      from_secret: mail_username
    password:   # 邮箱密码
      from_secret: mail_pwd
    from:
      from_secret: mail_username
    recipients:   #收件人
      from_secret: mail_recipients  #  格式:xxxx,xxxx
邮件通知配置说明
  • image: drillster/drone-email:使用 Drone 的邮件插件
  • settings
    • recipients_only: 只发送给指定收件人
    • host: SMTP 服务器地址
    • port: SMTP 服务器端口
    • subject: 邮件主题
    • username/password/from/recipients: 从 Drone 密钥中获取邮箱配置信息

相关内容