7.4 自动化构建综合应用

任务一:自动构建
1、先配置手动构建使用的 Dockerfile
cd /root/myproject
vim Dockerfile
文件内容如下:
注:
- FROM 指定父镜像
- RUN 运行后面的命令
- WORKDIR 指定工作目录,没有则创建
- COPY 将上下文目录中的文件复制到镜像
- CMD 指定容器入口(容器启动时运行的命令)
如果构建过程中出现网络问题,可以在 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 是否可以正常使用
docker build -t myproject:v1 .
命令最后的 . 就是上下文目录。它其实就是 docker build 的”工作目录“
如果可以正常地手动构建,才可以进行下一步操作
3、撰写 drone 的配置文件
创建文件 .drone.yml 该文件用来控制 drone 进行镜像构建的流程
与 Dockerfile 和 docker-compose.yml 文件一样,
.drone.yml
也有一个默认的文件名规范,注意它默认是隐藏文件,以.开头
cd /root/myproject
vim .drone.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:
.drone.yml
文件中的 from_secret
值完全一致,否则构建过程将无法获取正确的认证信息。4、将配置文件提交到 Git 仓库
# 添加到暂存区
git add Dockerfile .drone.yml
# 添加到本地仓库
git commit -m "更新构建的配置文件"
# 推送到远程仓库
git push
5、验证自动构建流程
代码推送完成后,回到 Drone 网页,你应该能看到自动触发的构建过程:
构建成功后,我们可以打开 Harbor 网页,查看是否成功推送了镜像:
任务二:自动部署
在这个任务中,我们将扩展自动化流程,不仅构建镜像,还要自动将应用部署到目标服务器上。
1、修改 .drone.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 连接到目标服务器并执行一系列命令:
- 停止并删除旧的容器(如果存在)
- 删除旧的镜像(如果存在)
- 从 Harbor 拉取最新的镜像
- 使用新镜像启动容器
这些命令确保每次部署都使用最新的镜像,并且不会因为旧容器或镜像而出现问题。
ssh_pwd
密钥,这是连接目标服务器所必需的。2、提交更新后的配置文件并验证部署
提交并推送更新后的 .drone.yml
文件后,Drone 将自动触发新的构建和部署流程。完成后,可以在浏览器中打开 http://目标服务器IP:5000
进行验证:
任务三:邮件通知
最后,我们来添加邮件通知功能,让系统在部署完成后自动发送通知邮件。
1、在 .drone.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 密钥中获取邮箱配置信息