讲之前放上地址https://cycle.bucai.cc/,开发环境正在运行,有点慢,请耐心等待加载。GitHub:https://github.com/notbucai/c...这是我尝试用流水线的方式实现项目开发的记录。至于为什么不套用市面上现成的完整的框架,是因为我已经很久没有写出完整有意义的东西了,当然我还是会向一些成熟的项目“学习”。设计需求的来源是最近断断续续升级优化博客功能点。项目分为后台nestjs项目,前端nuxtjs,管理系统vue.js。目前的部署方式是使用Docker编译本地镜像,推送到私有仓库。然后进入服务器拉取并重启。还有多人协同开发。大家需要在本地安装服务器环境(Docker等),保证环境的一致性。通过以上描述不难发现,由于项目使用的模板、语言、部署后状态(static、service)等方面的差异,导致编译方式无法统一。当前手动部署过程的重复问题。需要匹配服务器环境,本地开发电脑配置要求高。目标希望项目部署是模板化的,不同的类型可以选择不同的模板进行打包。将手动部署过渡到自动部署。依托分支监控,推送自动触发部署,解决本地高配置需求。调查是因为大多数人在日常工作中都会接触到,需要这套工具,所以对调查进行简单说明。研究对象:Netlify(国外),腾讯云Webify(国内)。他们解决资源部署的问题。CI/CD工作流程。他们的缺点(迫不得已提高当前项目的高度)国外的Netlify,dddd。Webify云厂商进行运维,保障不完备就开始割韭菜。需求分析可以通过以上内容直观的得到项目所需要的功能点。核心分析的核心功能是以“任务”为单位进行操作,创建任务和管理任务。所谓“任务”,就是需要传递状态。目前,任务分为进行中、失败和停止。每个触发器都应该生成一个子任务,如果触发时有一个子任务正在进行,它应该停止并开始一个新任务。正在进行的任务有子状态:编译、编译成功、编译失败。用户交互和核心链接请看下方流程图。功能设计创建任务主要是注册某仓库某分支的webhook,并将任务信息写入数据库。管理任务主要管理创建的任务信息,删除,挂起,启动。开始恢复暂停的任务。暂停执行正在进行的任务。Delete删除这条数据,删除webhook。任务执行由webhook触发,找到当前数据执行。任务执行设计如何针对不同的配置有不同的编译/运行模式?所有编译都是使用docker隔离编译,根据不同的类型选择不同的运行方式。目前区分两种,一种是静态的,一种是动态的:静态:采用docker编译后上传CDN的方式,当然只是模拟,暂时只放在nginx静态目录下存在。动态:使用docker编译后,docker运行。webservice不需要端口portnginx转发资源nginx转发端口可能需要编译可能需要编译可能不需要容器运行需要容器运行actionspa项目普通网页Ts节点项目普通节点项目buildyescompileyesrunnonoyes以上fromresourcetype与item类型相比,它更直观地表达了任务的执行动作。静态资源(web)容器构建完成后,将镜像中的dist数据通过dockercp复制到宿主机,再传输到nginx。服务资源(service)容器构建编译完成后,再次运行,然后添加nginx将容器映射到机器端口。后面会维护端口,不管理容器中的端口,由nginx容器进行映射维护。用户自己的任务容器可以互相通信,可以通过任务id访问。如果是需要访问的静态资源,会通过配置转发接口,用户可以将自己的域名绑定到当前机器上。页面设计前端使用naive-ui作为前端布局样式组件。它的交互主要分为三步:选择托管平台github、gitee等平台,选择的托管平台必须授权才能登录。符合要求。由于设计比较简单,直接以图片的形式展示。任务列表字段:任务名称/ID、托管平台、模板、状态、创建者、创建时间、更新时间、运行时间。详情页的数据库设计只展示了核心表的设计。用户表托管在平台上。模板表就是任务表。选课的标准是我会,简单。目前选择egg+mysql+redis+vue架构,编码尽量ts。nestjs、koa等其他框架我也考虑过。相对来说,nest太大了,koa太小了。我选择vue只是为了试用3.x版本。eggjs:为企业级框架和应用而生。vue:我明白一切。项目架构架构很简单,就是存储配合依赖触发。服务器运维架构独立于当前应用。用户可以共享自己的服务并独立运行(隔离)。原则上每个用户都可以申请一些存储等资源(待定),但还是建议使用远程/第三方资源。编译/部署触发流程是否编译:部分节点项目不需要编译。步骤是否运行:静态资源不需要运行,直接敲入nginx即可实现核心功能(暂时只实现github相关业务,其他平台保留接口)。查看项目进度,绑定托管平台引用阮一峰图文。绑定过程基本上是浏览器重定向,然后返回代码,获取令牌的代码,然后保存令牌。获取相关信息通过以下api操作用户仓库列表获取分支列表获取指定文件内容创建任务CreatetaskWritewebhook。创建webhook任务执行并等待webhook回调https://docs.github.com/cn/developers/webhooks-and-events/webhooks/testing-webhooks任务执行相关模板每次触发都会执行,使用ejs进行配置渲染一代。//注入内容{user,//数据库用户模型task,//数据库任务模型taskChild,//数据库task_child模型模板,//数据库模板path:{...path,//相对路径code:relativeCodePath//code与配置的相对位置}}#dockerfileFROMnode:12.18.2LABELmaintainer="<%=user.id%><<%=user.email%>>"ADD<%=path.code%>/app/WORKDIR/appRUNrm-rfnode_modulesRUNrm-rf<%=path.build%>RUNnpmconfigsetsharp_binary_hosthttps://npm.taobao.org/mirrors/sharpRUNnpmconfigsetsharp_libvips_binary_hosthttps://npm.taobao.org/mirrors/sharp-libvipsRUNnpm配置设置sass_binary_sitehttps://npm.taobao.org/mirrors/node-sassRUNnpminstall--registryhttps://registry.npm.taobao.org--max-old-space-size=4096ENVNODE_ENV生产<%if(template.is_build){%>RUNnpmrun<%=task.build_script%><%}%><%if(template.is_run){%>EXPOSE<%=task.server_port%>CMDnohupsh-c'npmrun<%=task.run_script%>'<%}%>#dockercomposeconfigversion:"3.7"services:"<%=task.id%>":build:.图片:<%=task.id%>:<%=taskChild.version||'0.0.1'%>container_name:<%=task.id%>restart:always<%if(template.is_run){%>networks:<%=user.id%>-network:ipv4_address:<%=task.ip%>networks:<%=user.id%>-network:external:true<%}%>build/compile/runrelatednodechild_processexec执行命令:使用exec('docker-composebuild')imagebuild使用exec(dockercp$(dockercreate--rm${imageName}):/app/${buildPath}./dist)将容器中的数据拷贝到宿主机中。使用docker-composedown停止现有的镜像。使用“docker-composerestart”来镜像容器的重启。使用docker-composeup启动编译镜像。
