【CI/CD】docker + Nginx自动化构建部署

CI/CD是什么

CI/CD 是持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery)的缩写,它们是现代软件开发中用于自动化软件交付过程的实践。

1、持续集成(CI):指的是开发人员频繁(通常是每天多次)将代码变更合并到共享仓库中的实践。每次代码提交后,自动执行构建和测试,以尽早发现并解决集成错误,提高软件质量。

2、持续交付(CD - Continuous Delivery):在持续集成的基础上,自动将代码变更部署到更接近生产环境的测试环境中,以便进行更深入的测试和验证。持续交付确保软件可以随时被部署到生产环境中,但最终的部署动作可能需要手动触发。

3、持续部署(CD - Continuous Deployment):是持续交付的进一步实践,它指的是每当代码变更通过所有的测试阶段后,自动部署到生产环境中。这意味着软件的新版本可以快速且频繁地部署到生产环境中。

CI/CD 的目标是通过自动化测试和部署流程,减少软件开发和发布过程中的手动错误,提高开发效率和软件质量。这通常需要使用专门的工具和平台,如 Jenkins、Travis CI、CircleCI、GitLab CI/CD 和 GitHub Actions 等。

也就是说,我们可以通过我们的git版本控制平台如GitLab CI/CD、GitHub Actions、Gitea Actions等自动化执行某些操作(打包测试、部署、数据库版本控制的验证等),设置触发时机,每次PR时都会触发,便于提前暴露问题,提高效率等

怎么做

这里以GitHub Actions为例,其他的也都类似 GitHub Actions官网

GitHub Actions 的工作流配置文件使用 YAML(.yml 或 .yaml)格式。这些文件位于 GitHub 仓库的 .github/workflows 目录下。在这些 YAML 文件中,你可以定义事件触发器、作业、步骤以及每个步骤使用的动作。

运行器

附位置 =》 运行器

在这里插入图片描述

触发

仅列举常用的 附位置 =》 触发工作流

触发方式说明
pull_request创建合并请求时,此合并中的所有修改提交都会触发,不包括合并其他分支到主分支
push每次提交修改到远程分支时触发,包括合并其他分支到主分支

区别
其实二者的触发方式差不多,只不过范围不同,所以使用push时谨慎触发的条件
可以通过限制分支branch、标签tags、更改的文件路径path等

name: CI
on:push:## 以下两个条件是或的关系 branches: - master ## 只push到master分支时触发tags:- v**  ## 标签为以v打头的push触发path:- src/main/**  ## push的更改文件路径包含src/main下的文件时触发

格式

创建目录文件 .github/workflows/build.yaml,设置工作流触发时机为pull_request即创建合并请求后执行

name: CI  ## 工作流名称
## 工作流的触发时机
on: pull_request  ## 仅在PR(合并请求)触发    ## 作业(任务)
jobs:continuous_build: ## 作业名称runs-on: ubuntu-latest   ## 运行器环境steps: ## 作业步骤- name: testrun: echo "this is a test step" 

注意github actions 工作流中不允许使用中文
在这里插入图片描述

情景示例

此情景只适用于测试环境,所以只打包构建到自己的docker hub中。不可用于生产环境,生产环境的配置更复杂,感兴趣的可以了解CI/CD + k8s + rancher

1、在 合并请求 的生命周期,通过自动化工作流提前做一些测试

目标
在创建合并请求后,在合并之前,每次更改推送都自动执行打包测试(还可以执行 npm run test)

在这之前,由于Gihub Actions具有隔离性,运行在虚拟环境中,每次运行都是在一个干净的环境中开始。所以我们需要在其工作流中做像拉取新项目时的操作如重新npm i

创建目录文件 .github/workflows/build.yaml,设置工作流触发时机为pull_request

name: CI  
on: [pull_request]  jobs:continuous_build: runs-on: ubuntu-latest   steps:- name:  testrun:  echo "this is a test step"- name: checkout  ## 检出代码uses: actions/checkout@v3 ## GitHub 提供用于在工作流中检出仓库- name: get-hash ## 计算hash,便于缓存uses: seepine/hash-files@v1id: get-hashwith: patterns: |-package.jsonpackage-lock.json- name: set cache ## 设置缓存id: npm-cacheuses: actions/cache@v3with:key: coal-manage-${{ steps.get-hash.outputs.hash }} ## 使用项目名称 + 上一步骤的hashpath: ${{ github.workspace }}/node_modules    ## 上下文表达式,获取执行的工作目录- name: install ## 安装依赖if: steps.npm-cache.outputs.cache-hit != 'true' ## 判断缓存run: npm i --registry=http://registry.npmmirror.com - name: buildrun: npm run build

在这里插入图片描述

2、在合并分支到主分支时,通过自动化流程做一些部署

目标
每次合并到主分支或者每次打tag标签发布版本时,通过工作流帮我们打包项目并构建成docker 镜像推送到个人都docker hub中,我们可以直接在本地通过手敲或shell脚本部署。

ps:我也有尝试过直接通过工作流打包然后启动,但是直接访问运行的容器会有一些限制,因为 GitHub Actions 的运行器(runner)是在 GitHub 的虚拟环境中,而不是在本地网络或公开的服务器上。所以需要借助工具或者通过k8s部署,这里暂时不考虑

  • 准备docker/Dockerfile
FROM nginx:alpineCOPY dist/ /usr/share/nginx/html/COPY nginx/nginx.conf /etc/nginx/nginx.confEXPOSE 9999
  • 准备docker/nginx.conf配置

worker_processes	1;events {worker_connections	1024;
}http {include		/etc/nginx/mime.types;default_type	application/octet-stream;sendfile	on;keepalive_timeout	65;server {listen	80;server_name	localhost;location / {root	/usr/share/nginx/html;index	index.html index.htm;}error_page	500 502 503 504 /50x.html;location = /50x.html {root	html;}}
}
  • 在 Docker Hub 创建访问令牌:

    1) 登录到 Docker Hub

    • 进入 Account Settings(账户设置)

    • 选择 Security(安全)选项卡

    • 创建一个新的 Access Token(访问令牌,需要读写操作)。

    • 记下生成的令牌,因为你将需要它来在 GitHub 中配置凭据。
      在这里插入图片描述

    2) 在 GitHub 仓库中设置 Secrets

    • 转到你的 GitHub 仓库页面。
    • 选择 Settings(设置)> Secrets(密钥)> Actions(操作)。
    • 点击 New repository secret(新建仓库密钥)按钮。
    • 创建两个密钥:一个用于 Docker Hub 的用户名(例如,DOCKER_USERNAME),另一个用于上一步中生成的访问令牌(例如,DOCKER_PASSWORD)。
      在这里插入图片描述
  • 创建目录文件 .github/workflows/deploy.yaml,设置触发时机为push master,即当代码被合并到远程仓库时到推送操作执行。

name: CI  
on: push:branches:- mainjobs:continuous_build: runs-on: ubuntu-latest   steps:- name: checkoutuses: actions/checkout@v3 - name: get-hashuses: seepine/hash-files@v1id: get-hashwith: patterns: |-package.jsonpackage-lock.json- name: set cacheid: npm-cacheuses: actions/cache@v3with:key: coal-trade-web-manage-${{ steps.get-hash.outputs.hash }}path: ${{ github.workspace }}/node_modules   - name: installif: steps.npm-cache.outputs.cache-hit != 'true'run: npm i --registry=http://registry.npmmirror.com - name: buildrun: npm run build- name: login to Docker Hubuses: docker/login-action@v1with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: build and push docker imageuses: docker/build-push-action@v4with:context: . ## 执行上下文file: docker/Dockerfile  ## Dockerfile路径push: true  ## 是否推送tags: ${{ secrets.DOCKER_USERNAME }}/my-dockerfile-nginx:${{ github.ref_name }}   ## 标签 docker hub username/镜像名称:版本号(git tag打的标签,不打就是分支名)

合并到主分支、每次打tag标签推送都会执行,执行成功后会显示✅
在这里插入图片描述

  • 可以登录自己的docker hub查看
    在这里插入图片描述

  • 登录docker hub将镜像拉取到本地,直接运行即可

docker login
# 根据提示输入用户名、密码docker pull  <username>/<image name>:<tag>

在这里插入图片描述
启动成功返回容器id

# 本地9090端口(访问端口)映射 容器内的端口
docker run --name <container name> -p 9090:80 -d <username>/<image name>:<tag>

在这里插入图片描述
直接访问本地虚拟机ip+端口
在这里插入图片描述

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

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

相关文章

Centos安装、迁移gitlab

Centos安装迁移gitlab 一、下载安装二、配置rb修改&#xff0c;起服务。三、访问web&#xff0c;个人偏好设置。四、数据迁移1、查看当前GitLab版本2、备份旧服务器的文件3、将上述备份文件拷贝到新服务器同一目录下&#xff0c;恢复GitLab4、停止新gitlab数据连接服务5、恢复备…

GO-学习-03-基本数据类型

数据类型&#xff1a;基本数据类型和复合数据类型 基本数据类型&#xff1a;整型、浮点型、布尔型、字符串 复合数据类型&#xff1a;数组、切片、结构体、函数、map、通道&#xff08;channel&#xff09;、接口 整型&#xff1a; package main import "fmt" im…

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求。在过去多个版本中&#xff0c;Apache Doris 持续加深与数据湖的融合&#xff0c;已演进出一套成熟…

32单片机开发bootloader程序

一&#xff0c;单片机为什么要使用bootloader 1、使用bootloader的好处 1) 程序隔离&#xff1a;可以同时存在多个程序&#xff0c;只要flash空间够大&#xff0c;或者通过外挂flash&#xff0c;可以实现多个程序共存&#xff0c;在多个程序之间切换使用。 2&#xff09;方便程…

OpenHarmony 入门——初识JS/ArkTS 侧的“JNI” NAPI 常见的函数详解(二)

引言 前面一篇文章OpenHarmony 入门——初识JS/ArkTS 侧的“JNI” NAPI&#xff08;一&#xff09;介绍了NAPI的基础理论知识&#xff0c;今天重点介绍下NAPI中重要的函数。 一、Native 侧的NAPI的相关的C函数 以下面一段代码为例介绍下主要函数的功能和用法。 napi_value …

系统模块时序图的重要性:解锁系统模块交互的全景视图

在复杂的系统开发中,理解和管理不同模块之间的交互是成功的关键。时序图是一种有效的工具,可以帮助我们清晰地展示这些交互,提升设计和开发的效率。本文将深入探讨系统模块之间的时序图,并通过实例展示其实际应用。 1. 什么是系统模块之间的时序图? 系统模块之间的时序图…

Layui表格向下滑动时表头固定悬浮

记录&#xff1a;Layui表格向下滑动时表头固定悬浮 使用table的height参数&#xff1a; 示例 //“方法级渲染”配置方式 table.render({ //其它参数在此省略height: 315 //固定值 }); table.render({ //其它参数在此省略height: full-20 //高度最大化减去差值 }); 等价于&am…

项目的小结

1.实现实时聊天 1.服务端建立一个ConcurrentHashMap<> 用来存储在线用户&#xff0c;用户账号和socket然后&#xff0c;如果有个人发了信息&#xff0c;就去数据库中查询&#xff0c;然后根据这个在线用户进行传递信息 服务端框架&#xff1a; public class ServerMain {…

git sendemail使用

教程参考&#xff1a; git-send-email - 以电子邮件形式发送补丁集 1、安装git-email 2、配置 SMTP 服务器 git config --global sendemail.smtpserver smtp.163.com git config --global sendemail.smtpserverport 465 git config --global sendemail.smtpuser xxxxxx163.c…

Hyperledger Fabric 网络体验 - 网络启动过程概览

进入fabric-samples/test-network目录&#xff0c;执行指令&#xff1a; ./network.sh up -i 2.5执行完指令能看到fabric已经启动。 作为第一次Fabric网络体验&#xff0c;网络启动主要包含三个操作&#xff0c;分别是生成配置文件、启动网络和操作网络。 配置文件 使用cr…

传知代码-智慧医疗:纹理特征VS卷积特征(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 论文链接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1076633223003537?__cf_chl_rt_tkJ9Aipfxyk5d.leu48P20ePFNd4B2aunaSmzVpXCg.7g-1721292386-0.0.1.1-6249 论文概述 今天我们把视线…

【系统架构设计师】十八、信息系统架构设计理论与实践②

目录 四、企业信息系统的总体框架 4.1 战略系统 4.2 业务系统 4.3 应用系统 4.4 企业信息基础设施 4.5 业务流程重组BPR 4.6 业务流程管理BPM 五、信息系统架构设计方法 5.1 行业标准的体系架构框架 5.2 架构开发方法 5.3 信息化总体架构方法 5.4 信息化建设生命周…

Golang | Leetcode Golang题解之第290题单词规律

题目&#xff1a; 题解&#xff1a; func wordPattern(pattern string, s string) bool {word2ch : map[string]byte{}ch2word : map[byte]string{}words : strings.Split(s, " ")if len(pattern) ! len(words) {return false}for i, word : range words {ch : patt…

【知识分享】MIPI C-PHY 互连技术参数定义

目录 0 概述 1 Interconnect Specifications 1.1 Differential Insertion Loss 1.2 Differential Reflection Loss 1.3 Common-Mode Reflection Loss 1.4 Intra-Lane Cross Coupling 1.5 Mode-Conversion Loss 1.6 Inter-Lane Static Skew 2 Driver and Receiver Char…

好的STEM编程语言有哪些?

STEM是科学&#xff08;Science&#xff09;&#xff0c;技术&#xff08;Technology&#xff09;&#xff0c;工程&#xff08;Engineering&#xff09;&#xff0c;数学&#xff08;Mathematics&#xff09;四门学科英文首字母的缩写&#xff0c;STEM教育简单来说就是在通过在…

【管控业财一体化】

1. 引言 大型集团在现代企业管理中扮演着举足轻重的角色&#xff0c;其管控业财一体化解决方案是实现企业高效运营的关键。随着数字化转型的加速&#xff0c;业财一体化不再局限于财务与业务流程的简单融合&#xff0c;而是向着更深层次的数据驱动、智能化决策和价值创造方向发…

SpringMVC中的常用注解

目录 SpringMVC的定义 SpringMVC的常用注解 获取Cookie和Session SpringMVC的定义 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它…

百某应JS逆向

https://ying.baichuan-ai.com/ 目录 一、发起提问 二、观察发现有两个加密参数&#xff1a;X-Bc-Sig和X-Bc-Ts ​三、观察JS调用栈 四、从JS中搜索 X-Bc-Sig和X-Bc-Ts 五、断点并分析参数的生成方式 六、分析入参 七、发现关键的o方法调用了一个i()方法 八、验证结果 …

前后端项目打包对比——关于Spring Boot Maven Plugin配置的问题

Spring Boot Maven Plugin 配置详解 Spring Boot Maven Plugin 配置详解1. 添加插件到 pom.xml2. 插件配置2.1 基本配置2.2 配置参数详解默认行为说明简单配置示例为什么这样的配置能工作&#xff1f;进一步说明 2.3 高级配置 3. 使用插件打包应用程序3.1 打包成 JAR 文件3.2 打…

ElasticSearch(六)— 全文检索

一、match系列查询 前面讲到的query中的查询&#xff0c;都是精准查询。可以理解成跟在关系型数据库中的查询类似。match系列的查询&#xff0c;是全文检索的查询。会通过分词进行评分&#xff0c;匹配&#xff0c;再返回搜索结果。 1.1 match 查询 "query": {&qu…