首页 文章 精选 留言 我的

精选列表

搜索[分库分表],共10000篇文章
优秀的个人博客,低调大师

五分钟创建一个 Serverless ChatGPT GitHub App

自从 OpenAI 在2023年3月发布了 ChatGPT 的官方 API 和插件系统以来,许多开发者和创业者都兴致勃勃地想办法将其整合到自己的业务中。 本文讨论的 serverless 函数相当于 ChatGPT 插件。 它们由 Web 事件触发,可以检索实时信息以输入 ChatGPT,使用动态提示词问询 ChatGPT,然后通过外向的 Web 服务调用执行实际操作。 但是,想要集成 ChatGPT,仍然困难重重: OpenAI为 ChatGPT 提供了一个简单的无状态 API。开发者需要在应用程序管理的缓存或数据库中跟踪每个对话的历史和上下文。开发者还需要管理和保护 API 密钥。这里有很多与应用程序业务逻辑无关的 boilerplate 代码。 ChatGPT API 应用程序的“自然”用户界面是 thread 聊天。但在传统的网络或应用程序框架中创建“聊天界面”是非常困难的。实际上,最常用的聊天界面已经存在于诸如 Slack、Discord 乃至论坛(例如 GitHub Discussions)这样的消息应用中。我们需要一种简单的方法将 ChatGPT 的 API 响应连接到现有的消息服务中。 ChatGPT 插件编程起来比较复杂,在很重的虚拟机中部署成本高昂。 本文将展示如何用 serverless 函数创建一个完整的 ChatGPT 应用程序。它是个 GitHub 机器人。 与 ChatGPT 插件一样,该机器人使 ChatGPT 能够实时读取和写入互联网。 有了这个机器人, GitHub 用户就能在 GitHub Issues 中与 ChatGPT 进行对话。 可以通过提新的 issue 或在已有的 issue 的下面发表评论,来和 ChatGPT 聊天。 换句话说,这个项目使用 GitHub Issues 的 thread 消息 UI 作为它聊天的 UI。 图1. 用 ChatGPT 学习Rust编程。 查看示例: https://github.com/second-state/chat-with-chatgpt/issues/31 该机器人是用 Rust 编写的 serverless 函数。只需 fork 该 example 模版,将你的 fork 部署到 flows.network 上,并配置你的 GitHub repo 和 OpenAI 密钥。 只需 5 分钟,就能拥有一个功能齐全的 GitHub 机器人。无需设置 Web 服务器、为 GitHub API 设置 Webhook、或设置缓存/数据库服务器。 Fork 模板 Repo 首先,从GitHub fork 该模版repo。 src/lib.rs 文件包含 bot 应用 (也称为 flow 函数)。run() 函数在启动时就被调用。它从 GitHub repo owner/repo 监听 issue_comment 和 issues事件。 这些事件会出现在 repo 中创建新 issue 或新 issue 评论时。 #[no_mangle] #[tokio::main(flavor = "current_thread")] pub async fn run() { // Setup variables for // login: GitHub account for the bot (typically just your personal account) // owner: GitHub org (or user) to install the bot // repo: GitHub repo to install the bot // openai_key_name: Name for your OpenAI API key // All the values can be set in the source code or as env vars listen_to_event(&login, &owner, &repo, vec!["issue_comment", "issues"], |payload| { handler(&login, &owner, &repo, &openai_key_name, payload) }) .await; } handler() 函数处理 listen_to_event() 接收到的事件。 如果事件是 issue 中的新评论,则机器人会调用 OpenAI 的 ChatGPT API 将评论文本添加到由 issue.number 标识的现有对话中。 它收到来自 ChatGPT 的响应,并添加到 issue 的评论。 此处的 flow 函数自动并透明地管理本地存储中与 ChatGPT API 的对话历史记录。 OpenAI API 密钥也存储在本地存储中,因而可以通过 openai_key_name 中的字符串名称来识别密钥,而不必将密钥放在源代码中。 EventPayload::IssueCommentEvent(e) => { if e.comment.user.r#type != "Bot" { if let Some(b) = e.comment.body { if let Some(r) = chat_completion ( openai_key_name, &format!("issue#{}", e.issue.number), &b, &ChatOptions::default(), ) { if let Err(e) = issues.create_comment(e.issue.number, r.choice).await { write_error_log!(e.to_string()); } } } } } 如果事件是一个新的 issue,flow 函数创建一个新的对话,由 issue.number识别,并向 ChatGPT 请求响应。 EventPayload::IssuesEvent(e) => { if e.action == IssuesEventAction::Closed { return; } let title = e.issue.title; let body = e.issue.body.unwrap_or("".to_string()); let q = title + "\n" + &body; if let Some(r) = chat_completion ( openai_key_name, &format!("issue#{}", e.issue.number), &q, &ChatOptions::default(), ) { if let Err(e) = issues.create_comment(e.issue.number, r.choice).await { write_error_log!(e.to_string()); } } } 如何部署 Serverless Flow 函数 可以看到,flow 函数代码调用 SDK API 来执行复杂的操作。 例如 listen_to_event() 函数通过 GitHub API 注册一个 webhook URL,从而 handler() 函数会在 GitHub 发生特定事件时被调用。 The chat_completion() 函数使用命名的 API 密钥和指定对话的历史(上下文)调用 ChatGPT API。 API 密钥和对话历史记录存储在 Redis 缓存中。 Webhook 服务器和 Redis 缓存都是 SDK 依赖的外部服务。 这意味着 flow 函数必须在提供此类外部服务的托管 host 环境中运行。 Flows.network 是 flow 函数 SDK 的 PaaS(平台即服务)host。 为了在 flows.network 上部署 flow 函数,只需将其源代码导入 PaaS。 首先,从你的 GitHub 账号登录 flows.network。 导入你刚刚 fork 的包含 flow 函数源代码的 GitHub repo,并选择 “ Advanced”。 请注意,不是选要部署机器人的 GitHub repo;而是选择你 fork 的 flow函数源代码的 repo chatgpt-github-app。 点击 Advanced 来查看更多设置。 设置环境变量以将 flow 函数指向 OpenAI API 密钥名称 (openai_name_key) 和 GitHub repo (login, owner 和 repo)。 此处的 GitHub owner 和 repo 变量指向你要部署机器人的 GitHub repo,而不是 flow 函数源代码的 repo。 login变量是机器人的 GitHub 账号。 它通常只是您的个人 GitHub 账号。 login 账号必须有权访问上述 owner/repo。 图 3. 为要部署机器人的 GitHub repo 设置环境变量,以及 OpenAI API 密钥名称。 Flows.network 将 fetch 源代码并使用标准的 cargo 工具链将 Rust 源代码构建为 Wasm 字节码。 然后在 WasmEdge Runtime 中运行 Wasm flow 函数。 如何将 Flow 函数连接到 GitHub 和 OpenAI 虽然 flow 函数需要连接到 OpenAI 和 GitHub API,但源代码没有写死的 API 密钥、访问令牌或 OAUTH 逻辑。 flow 函数 SDK 使开发者可以轻松、安全地与外部 SaaS API 服务进行交互。 Flows.network 发现 flow 函数要求连接到 OpenAI 和 GitHub API。flows 平台为开发者提供了 UI 工作流,让开发者能够: 登录 GitHub,授权访问事件,并将 flow 函数注册为用于接收这些事件的 webhook。 将 OpenAI API 密钥与名称 openai_key_name相关联。 图 4. flow 函数所需的外部服务 外部 SaaS API 成功连接并得到授权后,flow 函数 dashboard 上的紫色 “Connected”变成灰色。 flow 函数现在将接收 listen_to_event() 的事件。 它还将获得对 Redis 的透明访问以获取指定的 OpenAI API 密钥和缓存的对话上下文,从而支持 chat_completion() SDK 函数。 下一步 flows.network 支持连接各种 SaaS 的不同机器人,GitHub 机器人只是其中之一。通过将 flow 函数连接到 Slack 频道,就可以将 ChatGPT 加到你的群聊天。 下面是一个基于 Slack 的 ChatGPT 机器人的示例。你可以参加代码 Repo 里的 readme 文件,自己部署这个函数。 代码链接:https://github.com/flows-network/collaborative-chat 图 5. Slack ChatGPT 机器人 另一个例子是让 ChatGPT 在 Slack 频道中回答法律问题。 flow 函数里面可以规定好 prompt ——说明 ChatGPT 需要充当法律顾问回答法律咨询。你可以参加代码 Repo 里的 readme 文件,自己部署这个函数。 代码链接:https://github.com/flows-network/robo-lawyer 图 6. 基于 ChatGPT 的 Slack 律师机器人 除了 GitHub 和 Slack,还有许多 SaaS 产品可以通过其 API 集成到 flows.network 中。除了 Rust 支持,JavaScript 的支持也在路上了。

优秀的个人博客,低调大师

10分钟在 Rainbond 上部署 mall 电商项目

很多小伙伴在学习 mall 电商项目时,都会在部署上折腾许久,虽然目前已经提供了很多种部署方式,比如 在 Linux 上部署 mall 、使用 Docker 或 DockerCompose 部署 mall ,但对于正在学习的我们都显得比较复杂,需要理解并学习这些容器技术。而本文将使用 Rainbond 部署 mall 电商项目,通过 Rainbond 部署 mall 商城项目非常方便、简单,让我们专注于代码,Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器、Kubernetes和底层复杂技术,轻松的在 Kubernetes 上部署应用并体验 Kubernetes 带来的能力。 本文介绍在 Rainbond 上的两种部署 mall 电商项目的方式: 通过 Rainbond 开源应用商店快速部署 mall 从 0 开始部署 mall 项目所有服务 前提 安装可用的 Rainbond 环境,Linux、Mac、Win上均可安装,参阅 Rainbond 快速安装 通过应用商店快速部署 mall mall 电商项目已发布到 Rainbond 开源应用商店,可以通过开源应用商店一键部署,在 平台管理 -> 应用市场 -> 开源应用商店 中搜索 mall 并安装。 此时 Rainbond 会自动构建、启动 mall 所有服务,只需等待即可,部署完成后拓扑图如下: 访问 mall-admin-web 前端项目验证部署,默认用户密码:admin / macro123 mall-portal 和 mall-search 暂时没有前端,可以访问后端 swagger 验证部署 http://xxx/swagger-ui/,如下: 从零开始部署 mall 中间件部署 mall 需要用到的中间件有:Mysql Redis RabbitMQ MongoDB ElasticSearch,这些中间件都可以通过 Rainbond 开源应用商店部署。 安装 Redis 在开源应用商店中搜索 Redis 并安装 5.x 版本 安装 MongoDB 在开源应用商店中搜索 MongoDB 并安装 4.x 版本 安装 RabbitMQ 在开源应用商店中搜索 RabbitMQ 并安装 安装 MySQL 在开源应用商店中搜索 MySQL 并安装 5.7 版本 在 Mysql 组件 -> 端口 打开对外端口服务,通过 IP:PORT 连接,默认用户密码 root / root 通过工具连接并导入 mall sql 数据。 安装 ElasticSearch 在开源应用商店中搜索 ElasticSearch 并安装 7.15.2 版本 ElasticSearch 应用包含了 Kinbana,如不需要可删除 Kinbana 组件 ElasticSearch 默认开启了密码验证,在 组件 -> 环境配置 -> 配置文件设置 编辑配置文件将 xpack.security.enabled 设置为 false 并更新组件生效。 安装中文分词器 IK Analyzer 首先在 团队视图 -> 插件 -> 新增插件 -> 通过应用商店安装插件 搜索 ES-IK-Analysis 并安装插件 为 ElasticSearch 组件添加存储,组件 -> 存储 -> 添加存储 名称:自定义 挂载路径:/usr/share/elasticsearch/plugins 类型:共享存储 进入 组件 -> 插件 -> 未开通,开通 ES-IK-Analysis 插件 更新或重启 ElasticSearch 组件即可生效。 部署 mall 后端服务 修改项目代码配置 注释主 pom.xml 文件中的 execution 部分,不需要在项目中配置 Docker 打包项目,打包工作交给 Rainbond 处理,pom.xml 配置如下: <!-- <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> --> 修改 mall-admin 服务的 application-dev.yml 文件,内容如下: spring: datasource: url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false #MySQL连接地址 username: ${MYSQL_USERNAME} #MySQL用户 password: ${MYSQL_PWD} #MySQL密码 ...... redis: host: ${REDIS_HOST} #Redis连接地址 ...... 修改 mall-portal 服务的 application-dev.yml 文件,内容如下: spring: datasource: url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false #MySQL连接地址 username: ${MYSQL_USERNAME} #MySQL用户 password: ${MYSQL_PWD} #MySQL密码 ...... data: mongodb: host: ${MONGODB_HOST} #MySQL连接地址为环境变量 port: 27017 database: mall-port redis: host: ${REDIS_HOST} #Redis服务器地址 ...... rabbitmq: host: ${AMQP_HOST} #RabbitMQ 连接地址 virtual-host: ${RABBITMQ_DEFAULT_VHOST} #RabbitMQ virtual host username: ${RABBITMQ_DEFAULT_USER} #RabbitMQ 用户 password: ${RABBITMQ_DEFAULT_PASS} #RabbitMQ 密码 ...... 修改 mall-search 服务的 application-dev.yml 文件,内容如下: spring: datasource: url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false #MySQL连接地址 username: ${MYSQL_USERNAME} #MySQL用户 password: ${MYSQL_PWD} #MySQL密码 ...... elasticsearch: uris: ${ES_HOST}:${ES_PORT} #ElasticSearch连接地址 ...... 为什么都要改成环境变量的方式呢,因为这样更灵活,只需修改简单的变量配置可以让 mall 项目在任何环境中运行。而在 Rainbond 中,组件之间建立了依赖关系之后,会自动注入被依赖组件的环境变量,这样我们连环境变量都不用配置,更加方便,原理可参阅 Rainbond 组件之间的环境变量注入。 部署后端组件 在团队视图或应用视图 新增从源码创建组件: 组件名称:自定义 组件英文名称:自定义 仓库地址:https://github.com/zzzhangqi/mall.git 代码版本:master 以上仓库已经修改了上述的代码配置 此时 Rainbond 会检测到项目为多模块项目,进入多模块项目构建:勾选 mall-admin、mall-portal、mall-search 并构建。 进入每个组件内 -> 端口,删除默认的 5000 端口,添加新的组件对应端口: mall-admin:8080 mall-portal:8085 mall-search:8081 建立组件间的依赖关系 在应用内,切换到编辑模式,按照以下依赖关系并建立连接: 给组件之间添加依赖 部署 mall 前端服务 很多时候我们的后端服务一般是不对外提供访问的,如果采用现在的配置那么在部署的时候,config/prod.env.js 中后端的地址就必须与前端的访问地址一样,如果不一样则会产生跨域,如下: module.exports = { NODE_ENV: '"production"', BASE_API: '"https://admin-api.xxx.com"' } 如何不暴露后端服务的同时又能解决跨域,可以使用 Nginx 反向代理后端服务。 在 config/prod.env.js 定义一个不存在的接口,比如 /api module.exports = { NODE_ENV: '"production"', BASE_API: '"/api"' } 比如现在前端访问登陆接口的 URL 是 /api/admin/login ,显然 /api 不是我们的接口,/admin/login 才是,那么通过 Nginx URL 重写,把 /api 重写,访问到后端的接口就是 /admin/login 此时接口正确就可以正常返回数据,也能解决跨域问题同时后端服务也不用对外暴露。 server { listen 80; location / { root /app/www; index index.html index.htm; } location /api { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8080; } } 部署前端组件 在团队视图或应用视图 新增从源码创建组件: 组件名称:自定义 组件英文名称:自定义 仓库地址:https://github.com/zzzhangqi/mall-admin-web.git 代码版本:master 以上仓库已经添加了上述配置 添加 mall-admin-web 依赖于 mall-admin 验证部署 访问 mall-admin-web 前端项目验证部署,默认用户密码:admin / macro123。mall-portal 和 mall-search 暂时没有前端,可以访问后端 swagger 验证部署 http://xxx/swagger-ui/ 最后 下一期出在 Rainbond 上部署 mall-swarm 微服务项目实践。

优秀的个人博客,低调大师

5.4 万 Star 全部归零,项目作者:十分后悔

不知道大家是否使用或了解过 HTTPie 这个项目,如果对它还不熟悉的话,这里先简要介绍一下:HTTPie 是一个开源的命令行 HTTP 客户端,它的目标是使 CLI 与 Web 服务的交互尽可能人性化。HTTPie 设计用于测试、调试以及通常与 API 和 HTTP 服务器交互。http& https 命令允许创建和发送任意 HTTP 请求。它们使用简单自然的语法,并提供格式化和彩色输出。 HTTPie 项目的作者于 2012 年在 GitHub 上进行了第一次提交,至今已走过 10 年时间。经过不断地迭代和改进,HTTPie 如今已经成为了 GitHub 平台上最受欢迎的 API 工具之一,并拥有超过 5.4 万 Star 和 1 千多 Watch。 这个拥有如此高 Star 数量的项目,却因意外导致 5.4 万个 Star 全部归零。项目作者 Jakub Roztocil 近日在博客中详细介绍了此次事件的来龙去脉,也顺便可以给其他项目的作者敲响警钟。 发生了什么? Jakub 首先是承认了此次事件是由自己的错误操作导致的: 由于一连串不幸的事件,我不小心把项目的仓库设为了私有,这个操作让 GitHub 连带删除了我们花了 10 年时间建立的社区。 为什么要设为私有 作者 Jakub 表示: 把仓库设为私有就会永久删除所有 Watch 和 Star,这是 GitHub 的一个特性。我也知道这一点,因此我显然无意将 HTTPie 设为私有。 之所以会导致这样的结果,最直接的原因是 Jakub 以为自己在一个不同的仓库里面(该仓库没有内容也没有 Star),这是他在一周前创建的,但之前一直没有向里面填充内容。 Jakub 在当时并没有意识到仓库在命名上存在不一致,HTTPie 项目的仓库为 httpie/httpie,而 Jakub 想要设置的仓库为 httpie/.github。 这就是为什么我在没有意识到我的错误时,将 httpie/httpie 设为私有,而不是 httpie/.github 当 Jakub 做完操作回到组织页面后,他发现仍然可以看到空的仓库,反而是 HTTPie 项目仓库消失不见时,他才真正意识到发生了什么。于是 Jakub 立刻回到设置页面中想要重新将 HTTPie 设为公开。但 GitHub 在接下来的半个小时内都不允许他这样做,原因是 GitHub 正在 “帮助” 他删除仓库的 Star 和 Watch,无法中途停止这个过程。 GitHub 区别对待、拒绝恢复 为了尽可能避免损失,事后 Jakub 第一时间与 GitHub 取得联系,希望 GitHub 能够帮助他们恢复原本的数据。毕竟 GitHub 团队自己就曾经不小心把 GitHub Desktop 应用的仓库设置为私有,并在几个小时内就为自己恢复了一切。 当初 GitHub 的 CEO 对这一情况做出了解释: 开发人员今天早上错误地将 GitHub Desktop 仓库设为私有,重新修改回来并不会恢复它的 Star 和其他一些东西,因此我们正在从数据库备份中进行恢复。 显然 GitHub 对此是有相关备份的,并且能够通过备份挽回因不小心将仓库设为私有而造成的损失。但是在 HTTPie 项目的事件中,GitHub 却拒绝这样做,理由是会引发不良的副作用和浪费资源成本。Jakub 甚至向 GitHub 提出经济补偿,也同样遭到了拒绝。 虽然这件事是由于 Jakub 自己错误操作导致的,但他在博客中也提出了一些 GitHub 可以改善的地方,也希望其他项目作者能够避免再犯同样的错误。首先,他希望 GitHub 能够以更加清晰、明确的方式向用户告知操作的危害性,而不是一句放在任何地方都适用的 “警告:这是一个潜在的破坏性操作”;其次是改善数据库的设计,尽可能使用 “软删除”,并在一定时间范围内延迟 “硬删除”。 目前 HTTPie 已重新公开,截止完稿,该项目已获得 9 千多的 Star 数量。

优秀的个人博客,低调大师

3分钟了解如何跨应用、跨形态无缝登录

一、 功能盘点 Q1:什么是钥匙环服务? A:钥匙环服务是HMS Core对国内外开发者开放的技术服务,提供用户认证凭据本地存储,和跨应用、跨形态共享能力,帮助用户在安卓应用、快应用、Web应用之间构建无缝登录体验。(“用户认证凭据”以下简称“凭据”) 跨应用登录示例 用户在已登录应用A的状态下,打开同一开发者旗下的应用B,无需输入帐号密码,实现直接登录应用B. 跨形态登录示例 以电商应用为例,用户在安卓应用登录之后,收到促销短信,用华为浏览器点开短信链接,Web应用直接处于登录状态,挑选心仪商品直接付款,完成下单。 Q2:钥匙环服务可以帮助我的用户在任意两款App之间共享用户认证凭据吗? A:钥匙环服务能够帮助用户在同一公司旗下开发的App之间共享凭据 Q3:凭据在应用之间的授权关系是可以继承,还是只能点对点授权? A:没有继承关系,只能点对点的授权,例如,A授权给B、C、D、E,B不能转授权给F、G。 Q4:如果我的用户需要退出帐号,可以在钥匙环服务中删除凭据吗? A:可以,钥匙环服务向开发者提供删除和更新的API。 Q5:如果我的用户拥有多个帐号,这种情况钥匙环服务如何识别用哪个帐号登录? A:钥匙环服务可以存储多个凭据,建议产品提供确认界面,让用户自主选择登录帐号。 二、 技术深入解读 Q1:钥匙环服务是如何将凭据从安卓应用共享到快应用的? A:当用户登录到您的应用之后,凭据将被保存在钥匙环服务中,已登录的应用将这些凭据授权共享给其它受信任的快应用或web应用。 Q2:钥匙环服务是怎么实现支持这么多应用形态的? A:对于不同的应用形态,钥匙环服务提供对应的接口:钥匙环服务为安卓应用提供Android API,为快应用提供快应用API,为Web应用提供Web API。 Q3:把我的用户凭据存储在钥匙环服务中,安全吗? A:凭据在可信执行环境(TEE)中随机生成的密钥进行加密,每个设备的密钥均不相同,而且密钥只能在TEE内使用,无法离开设备,华为也不掌握密钥的内容,支持凭据在本地安全存储。 Q4:应用保存凭据之后,用户下次直接处于登录状态时,会有提示吗? A: 钥匙环服务SDK提供无界面的凭据读取接口,安卓应用可以直接读取到凭据内容,您可以自行决定是否提示用户:以某应用的帐号登录。 Q5:钥匙环服务如何验证请求读取凭据的应用身份信息,怎么确定不是仿冒应用呢? A:钥匙环服务能够通过验证安卓应用的APK包名、快应用的包名和证书HASH,或者获取当前网页的真实URL作为身份信息等方式,认证读写凭据的APK或网站的真实身份,防止凭据被仿冒的程序或网站盗用,从而加强共享凭据过程中的安全性。 三、隐私政策问答 Q1:钥匙环服务符合用户隐私政策吗? A:符合,关于 HMS Core 与隐私的声明中已对钥匙环服务自身的隐私声明约束做出说明。 Q2:我的App是否需要告知用户帮助TA保管凭证? A:使用钥匙环服务过程中,用户凭据始终保存在用户设备本地,不上传服务器,用户仍是实际数据控制者,华为不能主动对用户凭据做修改、删除等影响凭据安全的操作,其次HMS Core隐私声明已做过说明,故您的App不需要再告知用户。 Q3:非华为设备上使用钥匙环服务,我的App是否需要获取用户同意? A:当用户在非华为设备上使用钥匙环服务时,会关联启动HMS Core应用,对此您需要向用户明示并获取其同意;用户在华为设备上使用钥匙环服务则无需单独获取同意。 扫码获取接入指南 了解更多详情>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:GitHub、Gitee 关注我们,第一时间了解 HMS Core 最新技术资讯~

优秀的个人博客,低调大师

十分钟用 GiteeGo + OSS 部署 Hexo 博客

前言 Hexo 是一款基于 Node.js 的静态博客框架,依赖少易于安装使用,同时拥有着众多插件和主题,支持 Git、云主机、对象存储等方式部署发布。 Gitee Go 是 Gitee 推出的 CI/CD(持续构建与集成)服务。用户可以通过自定义构建流程,实现构建集成自动化。 在本实战案例中,我们将基于 Gitee Go + Hexo + 对象存储 的组合,实现 Hexo 博客的自动化部署发布。 环境准备 本次实战基于 Gitee Go + Hexo + 对象存储,因此需要准备如下内容: 在 Gitee 上创建一个博客仓库并开通 Gitee Go 一个 阿里云或腾讯云 的 RAM 帐号,并开通对象存储(OSS/TOS)服务,本案例中以 Aliyun OSS 为例,通过该账号创建对象存储和子账号,获得以下内容 bucket: 对象存储 Bucket 名称 region: 对象存储地域ID(regionID) secretId: RAM 帐号的 AccessKey ID secretKey: RAM 帐号的 AccessKey Sercret 一个通过 ICP 已备案域名 体验和搭建过程 在本次实战中,你可以根据已有的文档和教程自己搭建 Hexo 站点,并结合 Gitee Go 发布部署 Hexo 到 对象存储,也可以按照以下步骤,通过 Fork 本仓库案例。快速体验 Gitee Go + Hexo 博客自动部署的便利。 通过 Gitee Go 活动页面 领取构建时长。 Fork 此仓库,通过仓库导航「DevOps」菜单找到并开通 Gitee Go。 配置 阿里云 OSS 或 腾讯云 TOS 对象存储。 配置 阿里云 或 腾讯云 相关 RAM 帐号。 通过仓库「管理」->「环境变量管理」添加环境变量内容。 向仓库内添加任意一个文件并提交,触发流水线部署博客。 Hexo 快速入门 Hexo 的使用和调试 基于 Node.js,通过 npm install -g hexo && npm install -g hexo-cli 可以将 Hexo 全局安装到系统中调用。也可以通过 npm install hexo --save 将 Hexo 集成在当前的项目中。相关 Hexo 命令学习可以通过访问 Hexo快速入门 进行学习了解 Hexo 使用 Markdown 语法进行编写,支持常见的 Markdown 语法。 领取 Gitee Go 免费构建时长 通过访问 Gitee Go 活动页面,选择相应需要领取时长的 个人/企业 并领取 500 分钟构建时长 配置 OSS 存储 创建 OSS Bucket 通过访问阿里云 OSS 控制台 https://oss.console.aliyun.com/ ,输入 Bucket 名称并选择一个地域,完成 OSS Bucket 创建。通过 OSS Region和Endpoint对照表 获得对应的 RegionID Bucket 静态页面设置 访问对应 OSS Bucket,通过「基础设置」->「静态页面」将 OSS Bucket 配置成静态网站托管模式。默认首页和默认 404 页 设置为 index.html 。 绑定自定义域名 根据阿里云 【升级】8月13日OSS网页类型文件访问返回Header策略调整通知 ,如果希望使用 OSS 作为静态网站主站,需要绑定一个已备案的域名。 访问对应 OSS Bucket,通过「传输管理」->「域名管理」,输入博客站点的域名,此处以我的博客站点 normalcoder.com 为例,如果域名使用阿里云的域名解析服务,还可以直接勾选「自动添加 CNAME 记录」以完成自动添加 DNS 解析配置。 配置完成后,可以通过页面配置更多如 CDN 加速、域名SSL证书 等内容。 完成配置后,通过 nslookup 可以查看 DNS 解析情况。 配置相关 RAM 账号与授权 现在大多数云服务厂商的服务都可以通过 API 的形式调用,使用 Gitee Go 发布博客到 Aliyun OSS 需要开通相应权限的 RAM 帐号,获得对应的 AccessKey 和 SercretKey。 通过访问阿里云 RAM 访问控制台 https://ram.console.aliyun.com/users ,创建并分配一个 RAM 帐号,获得对应的 AccessKey ID 和 AccessKey Sercret。 通过分配 AliyunOSSFullAccess 获得分配到 OSS 读写权限。 回到 OSS Bucket,通过「权限管理」->「Bucket 授权策略」,将对应的 RAM 帐号添加到 Bucket 授权列表中,赋予「完全控制」权限。 配置环境变量 访问并 Fork Hexo OSS Deploy 示例仓库,通过仓库「管理」—>「环境变量设置」,配置对应的环境变量,参考下表(此处变量信息为下文流水线配置使用,可以参考下文调整变量命名)。 变量名 变量含义和对应取值 CLOUD 固定值 aliyun/tencent,本文实例填写 aliyun REGION 存储服务所在区域,上文提及的 regionID BUCKET 存储服务的 BUCKET 名称 SECRET_ID RAM SecretID,对应云服务商的 AccessKey ID SECRET_KEY RAM SecretKey,对应云服务商的 AccessKey Sercret THEME 所使用的主题,默认建议配置 landscape,示例项目中包含:landscape/Chic/icalm/jacman 四个主题可选 SITE 部署的自定义域名,文中示例为 normalcoder.com 开通 Gitee Go 通过仓库导航「DevOps」菜单找到并开通 Gitee Go。 回到仓库中提交任意一个文件。触发流水线。即可触发完成部署。部署效果预览如下: 流水线配置结构和字段说明 本实战案例中,流水线配置文件存在于 ./workfolow/deploy.yml,具体内容和字段说明如下: # ======================================================== # 基于 aliyun OSS / tencent COS 构建部署 Hexo 静态网站示例 # 功能:通过 Node 编译构建 Hexo 项目并部署到 OSS / COS # ======================================================== name: hexo-oss-deploy # 定义一个唯一 ID 标识为 hexo-oss-deploy ,名称为「 Hexo 部署(OSS) 」的流水线 displayName: 'Hexo 部署(OSS)' triggers: # 流水线触发器配置 push: # 设置 master 分支 在产生代码 push 时精确触发(PRECISE)构建 - matchType: PRECISE branch: master commitMessage: '' # 通过匹配当前提交的 CommitMessage 决定是否执行流水线 stages: # 构建阶段配置 - stage: # 定义一个 ID 标识为 deploy-stage ,名为「 Deploy Stage 」的阶段 name: deploy-stage displayName: 'Deploy Stage' failFast: false # 允许快速失败,即当 Stage 中有任务失败时,直接结束整个 Stage steps: # 构建步骤配置 - step: npmbuild@1 # 采用 npm 编译环境 name: deploy-step # 定义一个 ID 标识为 deploy-step ,名为「 Deploy Step 」的阶段 displayName: 'Deploy Step' inputs: # 构建输入参数设定 nodeVersion: 14.15 # 指定 node 环境版本为 14.15 goals: | # 安装依赖,配置相关主题、部署参数并发布部署 node -v npm -v npm install npm run config url $SITE npm run config theme $THEME npm run config deploy.cloud $CLOUD npm run config deploy.bucket $BUCKET npm run config deploy.region $REGION npm run config deploy.secretId $SECRET_ID npm run config deploy.secretKey $SECRET_KEY npm run clean npm run deploy 附同内容视频教程:https://www.bilibili.com/video/BV1Xv41147EL

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册