在 CI/CD 中怎么使用 Docker 部署前端项目?

本项目代码已开源,具体见:

前端工程:vue3-ts-blog-frontend

后端工程:express-blog-backend

数据库初始化脚本:关注公众号程序员白彬,回复关键字“博客数据库脚本”,即可获取。

前言

在上一篇文章《前端不懂 Docker ?先用它换掉常规的 Vue 项目部署方式》中,我们学会了怎么使用 docker 制作镜像、推送镜像到 aliyun 私有镜像仓库,也学会了怎么在服务器上拉取最新的镜像进行容器部署。不过,这些都是过程式的命令,我们需要把这些过程提炼出来做成脚本,最终在 CI/CD 工具中直接使用,以实现全自动化的部署。具体怎么做呢?我们来看看!

现有 actions 分析

vue3-ts-blog-frontend 这个前端项目使用的是 github actions 实现自动化部署的,打开ci_cd.yml文件可以查看具体实现。

在引入 Docker 之前,我们的部署流程是这样的,一共分两个 job,第一个 job 是 build,第二个 job 是 deploy。总体来说做的事情是将打包好的 dist 传输到服务器上。

  • build 阶段会安装依赖和打包,也就是我们熟悉的 yarn 和 yarn build。
- name: Install Dependencyrun: |yarn config set registry https://registry.npmmirror.comyarn- name: Buildrun: yarn build
  • 接着上传打包好的 dist 资源,这要用到 actions/upload-artifact。
- name: Archive production artifactsuses: actions/upload-artifact@v2with:#产物名称name: artifact#产物路径path: dist
  • 然后来到 deploy 阶段,首先要把刚才上传的文件下载下来,会用到 actions/download-artifact。(其实不拆分 job 也就不需要处理 artifact 了,不过也是为了学习下 artifact 的使用)
- name: Download production artifactsuses: actions/download-artifact@v2with:name: artifactpath: dist
  • 最后是与服务器建立 ssh 连接,将 dist 资源全部传输到 /usr/share/nginx/html 的项目目录下。
- name: SSH Auth && Deploy To the Serverrun: |eval $(ssh-agent -s)echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/nullmkdir -p ~/.sshchmod 700 ~/.sshecho "PubkeyAcceptedKeyTypes +ssh-rsa" > ~/.ssh/configssh-keyscan $SSH_HOST >> ~/.ssh/known_hostschmod 644 ~/.ssh/known_hostsscp -r dist/* $SSH_USERNAME@$SSH_HOST:$DEPLOY_DIR

由于是 CI 模式,登录服务器的过程不能有人机交互,必须是全自动化的,这就需要用到免密 ssh 连接,也就会使用到密钥对,如果对这一块不清楚的,可以先看看我之前写的一篇文章《自动化部署的一小步,前端搬砖的一大步》。

具体传输文件就是用到了 scp 命令。

以上过程会涉及到一些私密信息,比如服务器 ip、用户名、私钥等,这些私密信息都可以用 github 的 secrets 维护。

image.png

改造思路

既然我们选择了使用 Docker 来部署前端,那 CI 脚本中主要就是对 Docker 的一些操作,可能就不会在 CI 脚本上看到 yarn 安装依赖和打包这种信息了,因为这些信息都被隐藏到 Dockerfile 里了。

所以在 CI 脚本中,大概要做的事情是:

  • 使用 docker build 打镜像。
  • 推送镜像到私有镜像仓库。
  • 登录服务器。
  • 拉取镜像。
  • 重启容器。

理清思路后,实现起来就会简单很多,我们顺着思路一步一步做就可以了。

打镜像

首先是使用 docker build 打镜像,并给出具体的 tag。

docker build -t ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{secrets.DOCKER_REPOSITORY}}:${{github.ref_name}} .      

由于我们要把镜像推送到私有镜像仓库,所以镜像 tag 命名带上了 registry 的地址、命名空间、仓库名,版本号是以 git tag 为准,这些都以变量插值的形式体现在命令中。

推送镜像

我们的镜像是存储在 aliyun 私有镜像仓库中的,在 push 镜像之前,我们需要先登录。

docker login --username=${{secrets.DOCKER_USERNAME}} --password=${{secrets.DOCKER_PASSWORD}} ${{secrets.DOCKER_REGISTRY}}

接着使用 docker push 推送镜像。

docker push ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{secrets.DOCKER_REPOSITORY}}:${{github.ref_name}}

登录服务器

打镜像和推送镜像在 runner 中执行即可,但是拉取镜像部署这一步必须要在自己的服务器上执行,所以我们要先登录自己的服务器。

mkdir -p ~/.sshecho "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsachmod 600 ~/.ssh/id_rsacat >>~/.ssh/config <<END
Host remote
HostName ${{secrets.SSH_HOST}}
Port 22
User ${{secrets.SSH_USERNAME}}
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
ENDssh remote

登录服务器之后,我们需要执行登录 aliyun registry、拉取镜像、重启容器等操作。我们可以把这些步骤整合到一个脚本 remote.sh 中,然后一并传输给 ssh 命令执行。

cat >>~/remote.sh <<END
docker ps
docker login --username=${{secrets.DOCKER_USERNAME}} --password=${{secrets.DOCKER_PASSWORD}} ${{secrets.DOCKER_REGISTRY}}
docker pull ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{secrets.DOCKER_REPOSITORY}}:${{github.ref_name}}
docker stop ${{secrets.DOCKER_CONTAINER_NAME}}
docker rm ${{secrets.DOCKER_CONTAINER_NAME}}
docker run -dp ${{secrets.HOST_PORT}}:${{secrets.CONTAINER_PORT}} --name ${{secrets.DOCKER_CONTAINER_NAME}} ${{secrets.DOCKER_REGISTRY}}/${{secrets.DOCKER_NAMESPACE}}/${{secrets.DOCKER_REPOSITORY}}:${{github.ref_name}}
ENDssh remote < ~/remote.sh

完整的配置文件可以前往底部源码查看。

小结

使用 CI/CD 进行自动化部署与我们在本地执行一条条命令去部署在本质上没有多少区别,关键是把我们整理的命令合理地嵌入到 CI/CD 流程中,这需要我们比较熟悉 CI/CD 平台约定的 yaml 配置语法。各家平台提供的配置语法大同小异,关键概念可能也只是换了一个名字,学会了一个,使用其他的平台也不会很难,当然这个过程需要很多耐心,试错,纠正,反复,最后取得成功!

  • 开源地址:vue3-ts-blog-frontend
  • 专栏导航:Vue3+TS+Node打造个人博客(总览篇)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速上手AI指令:打造个性化智能交互体验的全面指南

快速上手AI指令&#xff1a;打造个性化智能交互体验的全面指南 一、初识文心一言1.1 文心一言简介1.2 文心一言的特点 二、准备工作2.1 获取访问权限2.2 熟悉界面布局2.3 了解基础指令 三、基础指令操作3.1 问答互动3.2 文本创作3.3 任务规划 四、进阶指令操作4.1 复杂查询4.2 …

Python酷库之旅-第三方库Pandas(035)

目录 一、用法精讲 106、pandas.Series.iloc方法 106-1、语法 106-2、参数 106-3、功能 106-4、返回值 106-5、说明 106-6、用法 106-6-1、数据准备 106-6-2、代码示例 106-6-3、结果输出 107、pandas.Series.__iter__魔法方法 107-1、语法 107-2、参数 107-3、…

Java程序的故障排查

文章目录 Linux命令关机/重启/注销系统信息和性能查看磁盘和分区⽤户和⽤户组⽹络和进程管理常⻅系统服务命令⽂件和⽬录操作⽂件查看和处理打包和解压RPM包管理命令YUM包管理命令DPKG包管理命令APT软件⼯具 JDK命令jpsjstatjinfojmapjhatjstackjcmdjconsole 分析工具VisualVME…

自动驾驶-预测概览

通过生成一条路径来预测一个物体的行为&#xff0c;在每一个时间段内&#xff0c;为每一辆汽车重新计算预测他们新生成的路径&#xff0c;这些预测路径为规划阶段做出决策提供了必要信息 预测路径有实时性的要求&#xff0c;预测模块能够学习新的行为。我们可以使用多源的数据…

超简单安装指定版本的clickhouse

超简单安装指定版本的clickhouse 命令执行shell脚本 idea连接 命令执行 参考官网 # 下载脚本 wget https://raw.githubusercontent.com/183461750/doc-record/d988dced891d70b23c153a3bbfecee67902a3757/middleware/data/clickhouse/clickhouse-install.sh # 执行安装脚本(中…

【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR&#xff08;网件&#xff09;公司生产的无线接入器&#xff08;或无线路由器&#xff09;提供Wi-Fi保护协议&#xff08;WPA2-PSK, WPA-PSK&#xff09;&#xff0c;以及有线等效加密&#xff08;WEP&#xff09;64位、128位和152…

亲测--linux下安装ffmpeg最新版本---详细教程

下载地址 Download FFmpeg 下载最新的https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz 上传到服务器 解压 tar xvf ffmpeg-7.0.1.tar.xz 编译 cd ffmpeg-7.0.1 ./configure --prefix=/usr/local/ffmpeg make && make install 报错: 解决:在后面加 跳过检测…

【Word】——小技巧

1.PDF相关转换word PDF转换成Word在线转换器 - 免费 - CleverPDF 2. word插入公式 1.软件推荐&#xff08;免费&#xff09; 可直接将图片&#xff0c;截屏公式转为word标准规范形式 2.网址推荐 在线LaTeX公式编辑器-编辑器 &#xff08;每天有免费使次数&#xff09; 3.…

Matlab演示三维坐标系旋转

function showTwo3DCoordinateSystemsWithAngleDifference() clear all close all % 第一个三维坐标系 origin1 [0 0 0]; x_axis1 [1 0 0]; y_axis1 [0 1 0]; z_axis1 [0 0 1];% 绕 x 轴旋转 30 度的旋转矩阵 theta_x 30 * pi / 180; rotation_matrix_x [1 0 0; 0 cos(th…

Linux服务器配置Python+PyTorch+CUDA深度学习环境

参考博主 Linux服务器配置PythonPyTorchCUDA深度学习环境_linux cuda环境配置-CSDN博客 https://blog.csdn.net/NSJim/article/details/115386936?ops_request_misc&request_id&biz_id102&utm_termlinux%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83%E6%8C%89pytorch%20…

4核16G服务器支持多少人?4C16G服务器性能测评

租赁4核16G服务器费用&#xff0c;目前4核16G服务器10M带宽配置70元1个月、210元3个月&#xff0c;那么能如何呢&#xff1f;配置为ECS经济型e实例4核16G、按固定带宽10Mbs、100GB ESSD Entry系统盘。 那么问题来了&#xff0c;4C16G10M带宽的云服务器可以支持多少人同时在线&…

C++ ───List的使用

目录 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&…

2024年汉字小达人比赛区级活动学校选拔的题型预测和真题示例

上一篇文章&#xff0c;好真题网为大家介绍了2024年上海市小学生汉字小达人比赛活动的轮次、举办日期、参赛对象、报名方式、费用和如何备考的建议等。 有家长朋友问汉字小达人考试的内容和范围是什么&#xff0c;有哪些题型&#xff0c;以及汉字小达人比赛和上海市小学生古诗…

PDF压缩软件电脑版 电脑pdf压缩怎么压缩文件

在数字化时代&#xff0c;pdf文件因其良好的兼容性和稳定性&#xff0c;已成为工作与生活中不可或缺的文件格式。然而&#xff0c;随着内容的增多&#xff0c;pdf文件的体积也随之增大&#xff0c;给文件的传输和存储带来了一定的困扰。本文将为你详细介绍如何在电脑上压缩pdf文…

关于Redis的最常见的十道面试题

面试题一&#xff1a;Redis为什么执行这么快&#xff1f; Redis运行比较快主要原因有以下几种&#xff1a; 纯内存操作&#xff1a;Redis将所有数据存储在内存中&#xff0c;这意味着对数据的读写操作直接在内存中运行&#xff0c;而内存的访问速度远远高于磁盘。这种设计使得…

LNMP架构部署及应用

部署LNMP架构流程 1.安装Nginx&#xff08;上传软件包&#xff0c;执行脚本&#xff09; yum -y install pcre-devel zlib-devel gcc gcc useradd -M -s /sbin/nologin nginx tar zxf nginx-1.12.0.tar.gz cd nginx-1.12.0 ./configure --prefix/usr/local/nginx --usernginx…

python原型链污染

python原型链污染 ​ 后面会有跟着Article_kelp慢慢操作的&#xff0c;前面先面向题目学习。 背景&#xff1a; ​ 国赛遇到了这个考点&#xff0c;然后之后的DASCTF夏季挑战赛也碰到了&#xff0c;抓紧粗略学一手&#xff0c;学了JavaScript之后再深究原型链污染。 简介&a…

传输层和网络层的关系,ip协议+ip地址+ip报头字段介绍(4位TOP字段,8位生存时间(ttl)),ip地址和端口号的作用

目录 传输层和网络层的关系 引入 介绍 ip协议 介绍 ip地址 引入 数据传递过程 举例(ip地址的作用) ip报头 格式 4位版本号 ip地址不足的问题 8位服务类型 4位TOP(type of service)字段 最小延时 最大吞吐量 4位首部长度 16位总长度 8位协议号 首部校验和…

《样式设计001:表单的2种提交方式》

描述&#xff1a;在开发小程序过程中&#xff0c;发现一些不错的案例&#xff0c;平时使用也比较多&#xff0c;稍微总结了下经验&#xff0c;以下内容可以直接复制使用&#xff0c;希望对大家有所帮助&#xff0c;废话不多说直接上干货&#xff01; 一&#xff1a;表单的2种…

【强化学习的数学原理】课程笔记--4(随机近似与随机梯度下降,时序差分方法)

目录 随机近似与随机梯度下降Mean estimationRobbins-Monro 算法用 Robbins-Monro 算法解释 Mean estimation用 Robbins-Monro 算法解释 Batch Gradient descent用 SGD 解释 Mean estimation SGD 的一个有趣的性质 时序差分方法Sarsa 算法一个例子 Expected Sarsa 算法n-step S…