【CICID】GitHub-Actions语法
[TOC]
【CICID】GitHub-Actions语法
1 场景
当我们开发过程中,经常需要提交代码,打包,部署新代码到对应的环境,整个过程都是人工手动操作,占据开发人员大量时间,并且很繁琐容易出错。所以需要借助一些CI/CD
工具让这整个流程自动化,节约生命。
一般公司都有自己的CICD工具或平台,但如何搭建一个属于自己的一套CICD工作流呢?
常见的CI/CD工具有Jenkins、GitLab、GitHub Actions等,各有优缺点,自行百度吧~
考虑代码都在GitHub托管,也不用额外购买服务器,最终选定GitHub Actions方式
附:推荐参考
- 如果公司已有完整的代码托管平台,希望尽量少改动已有的工作流程,选 Jenkins
- 如果是公司使用+新项目,选GitLab,自带代码托管和CICD
- 如果是个人项目,希望可以使用免费资源,选Github Actions
- 如果是个人项目+有自己服务器,也可以选GitLab
2 CI/CD
2.1 什么是CI/CD
CI/CD 属于DevOps,代表持续集成、持续部署
CI/CD自动化上将新代码从提交到生产,配置基础设施所需的大部分或全部手动人工干预流程
借助CI/CD,开发人员可以对代码进行更改,然后自动测试并推出,以进行持续部署
以实现停机时间最小化,代码发布速度更快
2.2 持续集成(CI)
持续集成是在提交或合并代码时,自动测试每个更改,并自动启动构建。可以大大减少开发和运维人员的重复工作,可以在软件开发生命周期的更早阶段更轻松的发现并修复错误和安全问题。
2.3 持续部署(CD)
持续交付是一种软件开发实践,一般与持续集成结合使用,以自动化基础设置供应和应用程序发布过程。
一旦代码作为 CI 流程的一部分进行了测试和构建,持续交付将在最后阶段接管,以确保可以随时部署并将部署所需要的环境打包在一起。
通过持续交付,可以随时将构建的软件部署到生产环境。可以手动触发部署,也可以进行自动化部署。
3 介绍
GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。
3.1 优点
GitHub直接托管代码
Actions直接依赖于Github,不需额外安装任何东西
集成部署常用依赖库
支持Docker
不需要额外购买服务器搭建服务(重点!)
4 工作流常用语法
官网文档:https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions
工作流文件使用 YAML 语法,并且必须具有 .yml
或 .yaml
文件扩展名。
4.1 name : 工作流名称
name: 这是工作流名称
4.2 on : 触发工作流时机
on. .types
定义将触发工作流运行的事件活动类型
# 代码push 或者 fork等时触发 on:# 当向分支进行git push时触发该工作流push:branches:- "main"# 当向分支合并分支时触发该工作流pull_request:branches:- "main"
- 事件类型:https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows
on.<push|pull_request>.<branches|tags>
定义事件筛选器,可让你更好地控制工作流的运行时间,可以指定分支和分支版本
name: MYCI on:push:branches:- master
on.<push|pull_request>.paths
使用
push
和pull_request
事件时,指定文件路径生效- 指定路径
on:push:paths:- '**.js'
排除路径
on:push:paths-ignore:- 'docs/**'
on.schedule
定义触发事件,使用 cron
on:schedule:# 每天 5:30 和 17:30 UTC 触发工作流程- cron: '30 5,17 * * *'# 每周一至周四 5:30- cron: '30 5 * * 1,3'- cron: '30 5 * * 2,4'
4.3 jobs : 作业
工作流运行由一个或多个 jobs
组成,默认情况下并行运行。
jobs.
使用
jobs.<job_id>
为作业提供唯一标识符,是一个字符串jobs:my_first_job:name: My first jobmy_second_job:name: My second job
jobs. .name
设置作业名称
jobs. .needs
此作业之前必须成功完成的所有作业
要求成功的依赖项作业
按顺序执行 job1 -> job2 -> job3
jobs:job1:job2:# 依赖job1完成needs: job1job3:# 依赖job1和job2完成needs: [job1, job2]
无论是否成功,都要执行
always()
按顺序执行 job1 -> job2 -> job3 ,但job3 无论是否成功,都会执行
jobs:job1:job2:needs: job1job3:if: ${{ always() }}needs: [job1, job2]
jobs. .runs_on
定义要运行环境
- 指定操作系统
runs-on: ubuntu-latest
公共免费GitHub托管的标准运行器
jobs. .steps
作业包含一系列任务,称为
steps
步骤,步骤可以运行命令、运行设置任务,每个步骤在运行器环境中以其自己的进程运行,且可以访问工作区和文件系统,步骤之间不会保留环境变量的更改。jobs. .steps[*].uses
选择要作为作业中步骤的一部分运行的操作,
jobs:my-jobname:steps:# checkout出v1版本代码- uses: actions/checkout@v1
jobs. .timeout-minutes
工作执行超时时间,超过则取消,默认 360分钟(6小时)
jobs. .strategy
作业使用的矩阵策略,根据定义数组的笛卡尔积,创建作业
jobs:example_matrix:strategy:matrix:version: [10, 12]os: [ubuntu-latest, windows-latest]
根据上述矩阵,按顺序创建作业
{version: 10, os: ubuntu-latest}
{version: 10, os: windows-latest}
{version: 12, os: ubuntu-latest}
{version: 12, os: windows-latest}
jobs. .container
注意:如果工作流使用 Docker 容器操作、作业容器或服务容器,则必须使用 Linux 运行器:
* 如果您要使用 GitHub 托管的运行器,则必须使用 Ubuntu 运行器。* 如果您要使用自托管运行器,则必须使用 Linux 机器作为运行器,并且必须安装 Docker。
用于运行作业中尚未指定容器的任何步骤的容器
在容器中运行作业
name: CI on:push:branches: [ main ] jobs:container-test-job:# 运行的外部环境runs-on: ubuntu-latest# 环境下运行的容器(Docker定义)container:# 容器中使用镜像image: node:18# 容器中定义环境env:NODE_ENV: development# 容器中定义端口ports:- 80# 容器中定义映射位置volumes:- my_docker_volume:/volume_mountoptions: --cpus 1steps:- name: Check for dockerenv filerun: (ls /.dockerenv && echo Found dockerenv) || (echo No dockerenv)
只指定容器映像时,可以忽略
image
关键词jobs:container-test-job:runs-on: ubuntu-latestcontainer: node:18
jobs. .services
注意:如果工作流使用 Docker 容器操作、作业容器或服务容器,则必须使用 Linux 运行器:
如果您要使用 GitHub 托管的运行器,则必须使用 Ubuntu 运行器。
如果您要使用自托管运行器,则必须使用 Linux 机器作为运行器,并且必须安装 Docker。
多个服务编排
services:# 1. nginx服务nginx:image: nginx# ngxin 80 映射 docker 8080端口 ports:- 8080:80# 2. redis服务redis:image: redis# ngxin 6379 映射 docker 6379 ports:- 6379/tcp
单个事件
# 代码push on: push
多个事件
# 代码push 或者 fork on:[push,fork]
指定分支触发
name: MYCI on:push:branches:- master
时机类型:https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows
5 环境变量
Github action 定义变量很多方式,很容易搞混,记录下常用方式
口诀:
普通使用
$xxx
,命令行或字符串拼接使用
${xxx}
,遇到
uses
则用${{xxxx}}
使用别人写好的Action,要用两个花括号
5.1 自定义变量
5.1.1 在env中定义变量
定义变量
jobs:build:runs-on: ubuntu-latestenv:# 端口号Port: 8080# 云服务地址Host_IP: ${{secrets.REMOTE_SERVER01_IP}} # 云服务密码Host_PWD: ${{secrets.REMOTE_SERVER01_PWD}}# 账号Host_Role: root# 路径Host_Dir: "/cicd"
变量取值
- 普通使用,
$xxx
# 测试环境变量
- name: Use variable from environmentrun: |echo "端口号:$Port"echo "服务器地址: $Host_IP"
- 有命令行或拼接使用,
${xxxx}
# 上传新的docker镜像
- name: upload new docker image and start-up scriptrun:sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}
当使用外部
uses
时,${{env.xxx}}
run
里面也要用${{env.xxx}}
# 加载tar文件,加载docker镜像
- name: Load new docker imageuses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run:docker load -i ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar
5.1.2 Run通过写入到github变量
在run里面定义了变量,需要给后面step
使用,一定要写入github环境中echo "key=$xxx" >> "$GITHUB_ENV"
定义
steps:# 定义环境变量- name: Define environment variablesrun: |# 定义全局变量PROJECT_NAME=$(basename $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')FILE_NAME=${PROJECT_NAME}-backendVERSION=0.1# 写入环境中echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"echo "FILE_NAME=$FILE_NAME" >> "$GITHUB_ENV"echo "VERSION=$VERSION" >> "$GITHUB_ENV"
取值
普通使用,
$xxx
# 测试环境变量 - name: Use variable from environmentrun: |echo "项目名称 (从环境变量): $PROJECT_NAME"echo "文件名称 (从环境变量): $FILE_NAME"echo "项目版本 (从环境变量): $VERSION"
有命令行或拼接使用,
${xxxx}
# 构建镜像 - name: Build docker imagerun: |docker build -t ${FILE_NAME}:${VERSION} . # 构建docker镜像,命令最后的点代表Dockerfile所在目录
当使用外部
uses
时,${{env.xxx}}
# 删除旧的docker镜像压缩包 - name: Delete old docker taruses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run: |echo "Attempting to delete ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar"rm -rf ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar
5.2 默认环境变量
地址:
https://docs.github.com/zh/codespaces/developing-in-a-codespace/default-environment-variables-for-your-codespace#list-of-default-environment-variables
环境变量 | 说明 |
---|---|
CODESPACE_NAME | 代码空间的名称 例如,octocat-literate-space-parakeet-mld5 |
CODESPACES | 在代码空间中始终为 true |
GIT_COMMITTER_EMAIL | 未来 git 提交的“作者”字段的电子邮件。 |
GIT_COMMITTER_NAME | 未来 git 提交的“提交者”字段的名称。 |
GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN | 返回 GitHub Codespaces 转发端口的域。 例如 app.github.dev 。 |
GITHUB_API_URL | 返回 API URL。 例如 https://api.github.com 。 |
GITHUB_GRAPHQL_URL | 返回 GraphQL API URL。 例如 https://api.github.com/graphql 。 |
GITHUB_REPOSITORY | 所有者和仓库名称。 例如,octocat/Hello-World 。 |
GITHUB_SERVER_URL | 返回 GitHub 服务器的 URL。 例如,https://github.com 。 |
GITHUB_TOKEN | 代表代码空间中用户的签名身份验证令牌。 您可以使用它对 GitHub API 进行经过身份验证的调用。 有关详细信息,请参阅“GitHub Codespaces 中的安全性”。 |
GITHUB_USER | 启动代码空间的用户的名称。 例如,octocat 。 |
使用方式
项目名称:
${GITHUB_REPOSITORY}
分支名称:
${GITHUB_REF##*/}
refs/heads/main
->main
refs/tags/v1.0.0
->v1.0.0
示例
- name: Print Environmentrun: | echo $GITHUB_REPOSITORY # 仓库全名echo ${GITHUB_REF##*/}
6 常用示例
定义环境变量
- name: Define environment variablesrun: |# 定义全局变量# 当前项目名(小写)PROJECT_NAME=$(basename $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')# 文件名FILE_NAME=${PROJECT_NAME}-backend# 常量VERSION=0.1# 写入环境中echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"echo "FILE_NAME=$FILE_NAME" >> "$GITHUB_ENV"echo "VERSION=$VERSION" >> "$GITHUB_ENV"
拉取代码
# 拉取最新代码 - name: Pull latest codeuses: actions/checkout@v3 # 使用官方的checkout action,用于将仓库中的最新代码检查并拉取到工作目录中
连接远程服务器操作
# 连接远程服务器操作 - name: SSH Commondsuses: matheusvanzan/sshpass-action@v2with:host: "远程主机IP"user: rootpass: "远程主机密码"run: |# 命令行pwdls
传输文件
# 上传新的docker镜像 - name: upload new docker image and start-up scriptrun:# sshpass -p 远程服务器密码 scp -r -o StrictHostKeyChecking=no 当前文件 账号@远程服务器地址:目标目录sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}
7 参考资料
【CICD】github新功能actions全方位讲解!!
https://www.bilibili.com/video/BV1RE411R7Uy/?spm_id_from=333.337.search-card.all.click&vd_source=1d31e698afb74bb3222db3bb76f9b408
GitHub文档-Actions
https://docs.github.com/zh/actions/learn-github-actions/understanding-github-actions
GitHub Actions 的工作流语法
https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions
Github Actions 的一份不完全指南
https://ucaskernel.com/d/822-github-actions
遇到问题
run 报错: bash: -c: line 1: syntax error: unexpected end of file
如下图所示:
- name: xxxxwith:run: | echo "只有一条命令会报错"
原因:run后面的
|
: 运行执行多个命令,但一条命令时会报错解决方法:
# 单条命令,去掉run后面的 `|` - name: xxxxwith:run: echo "只有一条命令会报错"# 多条命令 - name: xxxxwith:run: | echo "只有一条命令会报错"echo "两条命令就不会报语法错误"
相关文章:

【CICID】GitHub-Actions语法
[TOC] 【CICID】GitHub-Actions语法 1 场景 当我们开发过程中,经常需要提交代码,打包,部署新代码到对应的环境,整个过程都是人工手动操作,占据开发人员大量时间,并且很繁琐容易出错。所以需要借助一些…...
Ionic 创建 APP
Ionic 创建 APP Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动和网页应用程序。它结合了 Angular、React 或 Vue 的强大功能,以及 Capacitor 或 Cordova 的原生功能,使得开发者可以轻松地创建跨平台的应用程序。本篇文章将指导您如何使用 Ionic 创建一个基本的…...

【数学代码】幂
Hello!大家好,我是学霸小羊,今天来讲讲幂。 求几个相同因数的积的运算,叫做乘方,乘方的结果叫做幂。 a^n,读作 “ a的n次方 ” 或 “ a的n次方幂”,a叫做底数,n叫做指数。 对于底数、指数和幂…...
os.system() 函数
os.system() 是 Python 标准库 os 模块中的一个函数,用于在子终端中运行系统命令。它可以在 Python 脚本中调用外部命令或程序。具体来说,它通过执行命令字符串并返回执行状态来实现这一点。下面是对 os.system() 函数的详细解释: import os…...
Spring Boot中的RESTful API详细介绍及使用
在Spring Boot中,RESTful API的实现通过控制器类中的方法和特定的注解来完成。每个注解对应不同的HTTP请求方法,并通过处理请求参数和返回响应来实现不同的操作。 下面将详细解释RESTful API中的各个方面,包括GetMapping, PostMapping, PutMa…...

nlp学习笔记
目录 很多入门例子 bert chinese 很多入门例子 https://github.com/lansinuote/Huggingface_Toturials bert chinese import torch import torch.nn as nn from transformers import AutoTokenizer, AutoModel, BertModel, TFBertModel, BertTokenizer# youpath = D:/bert-…...
使用python获取内存信息
#!/usr/bin/python # -*- coding:utf-8 -*- psutil模块是一个跨平台的获取进程和系统应用情况(CPU,内存,磁盘,网络,传感器)的库。 该模块用于系统监控、限制进程资源和运行进程的管理等方面。 内存信息&am…...
外包公司泛滥,这些常识你应该提前知道?
今年大环境确实很不好 很多985,211的应届生都在网上大吐苦水,很多大龄离职大厂的技术人也好,业务人也好,都纷纷转向短视频平台做起了自媒体。而找工作的人普遍发现,某最火的招聘平台几乎都被外包公司刷屏了。大大小小的外包公司如…...
Linux下的抓包工具使用介绍
应用层 传输层 网络层 数据链路层 物理层 1)tcpdump(传输/网络层) tcpdump -i eth0 tcpdump -i eth0 -vnn -v:显示包含有TTL,TOS值等等更详细的信息 -n:不要做IP解析为主机名 -nn:…...

centos环境上:k8s 简单安装教程
本次演示安装3节点k8s环境,无需多言,直接上操作步骤: 1、环境准备 k8s部署前,首先需要准备好环境,除了1.4 步骤,其他步骤在所有(3个)节点上都要执行: 1.1 关闭防火墙 s…...

短视频矩阵系统/源码搭建---拆解热门视频功能开发上线
短视频矩阵系统/源码搭建 一、短视频矩阵系统源码开发需要用到以下技术: 1.前端技术:HTML、CSS、JavaScript、Vue.js等前端框架。 2.后端技术:Java、Python、PHP等后端语言及相关框架,如Spring Boot、Django、Laravel等。 3.移…...

手机和模拟器的 Frida 环境配置
目录 一、配置 JDK 和 android 环境 二、连接设备和查看权限 1、连接设备 2、查看手机权限 三、手机配置 Frida 1、frida-server下载 2、验证 四、模拟器配置 Frida 1、下载模拟器并调节成手机版: 2、连接并查看架构 3、配置并开启 x86 的 frida-serve…...
力扣1385.两个数组间的距离值
力扣1385.两个数组间的距离值 二分判断答案是否正确 class Solution {public:int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {ranges::sort(arr2);ranges::sort(arr1);int m arr2.size();auto check [&](int low,int h…...
[C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品
大家好,今天zty带来的是斗破苍穹的 2.11.6 版本,这个版本主要更新了:1、背包 2、将退出游戏改到了设置里面 3、如果不逃跑不会停止战斗。废话不多说, 先赞后看 养成习惯 code #include<stdio.h> #include<iostrea…...
认识与学习JSP
JSP核心技术 什么是JSP JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm…...

MySql 各种 join
MySql 定义了很多join的方式,接下来我们用一个例子来讲解。 用到的表 本文用到了两个表s1,s2: 内外连接 测试 1 1 1.select * from s1 inner join s2 on(s1.id s2.id);: -------- | id | id | -------- | 3 | 3 | | 4 | 4 | --------2…...
【Android面试八股文】Android中操作多线程的方式有哪些?
文章目录 1. 使用 `Thread` 和 `Runnable`2. `AsyncTask`3. `Handler` 和 `Looper`4. `HandlerThread`5. `ThreadPoolExecutor`6. `IntentService`7. `RxJava`8. `Coroutine`(协程)9. `WorkManager`在Android开发中,有多种方式可以进行多线程操作。以下是主要的几种方式: 1…...

语义分割和目标检测的关系
目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 (1)物体的位置 (2)物体的分类 从数据格式来说 (1)语义分割的数据格式 (2)目标检测的数据格式 1.语义分…...

SpringBoot 大文件基于md5实现分片上传、断点续传、秒传
SpringBoot 大文件基于md5实现分片上传、断点续传、秒传 SpringBoot 大文件基于md5实现分片上传、断点续传、秒传前言1. 基本概念1.1 分片上传1.2 断点续传1.3 秒传1.4 分片上传的实现 2. 分片上传前端实现2.1 什么是WebUploader?功能特点接口说明事件APIHook 机制 …...

数据资产治理与数据质量提升:构建完善的数据治理体系,确保数据资产的高质量与准确性
一、引言 随着信息技术的迅猛发展,数据已经成为企业和社会发展的重要资产。然而,数据资产的有效治理与数据质量的提升,是企业实现数字化转型、提升竞争力的关键。本文旨在探讨数据资产治理与数据质量提升的重要性,并提出构建完善…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...