一次协作多端同步,打通看云、github互相同步(serverless实践)

本文原创首发于 https://coding3min.com/1194.html

之前在看云上专门搞了个电子书来归档和协作一些文章,支持 webhook(钩子),但是一直没用上,今天端午放假,早上就突然醒了,突发奇想,不如弄个自动同步,把看云的同步到 github ,把 github 同步到看云,经过一个早上的努力总算是搞定了。

网上的资料 只支持单向的同步,我稍微做了一下改动,下面是整个过程。

同步原理

kancloud+webhook+serverless+travis-ci+github

大致流程如下:

  • 在看云上编写文章
  • 配置看云仓库的 Webhook 通知,当更新文章时通知给 Serverless
  • 使用腾讯云提供的 Serverless ,编写云函数接收 Webhook 通知,然后通过 API 的方式触发 TravisCI 构建
  • Github 新建仓库,编写相关的仓库更新合并脚本进行同步,此脚本会对比两个仓库哪个更新来判断同步方向
  • Github 更新时自动触发 TravisCI 构建

同步目的:

  • 看云文档 github 备份分享
  • 看云文档分发到其他博客系统或导入到 gitbook
  • 实现基于分支仓库(github.io)的 hexo 静态博客自动发布
  • 多人协作共同完善文章库

github 配置

首先登陆github创建一个仓库,名称自定义,用来同步看云某一本书(git 仓库)。

在仓库根目录创建 2 个文件 .travis.yml.travis-push.sh

.travis.yml

script:+ sh .travis-push.sh

.travis-push.sh

#!/bin/sh#看云版本库地址:
KY_REPO=https://git.kancloud.cn/coding3min/coding3min.git
#github仓库地址:
GH_REPO=https://github.com/pzqu/coding3min-book.gitKY_REPO_URL=https://${KANCLOUD_USER}:${KANCLOUD_PASS}@$(echo $KY_REPO | awk -F'//' '{print $2}')
GH_REPO_URL=https://${GITHUB_TOKEN}@$(echo $GH_REPO | awk -F'//' '{print $2}')
KY_REPO_NAME=$(echo $KY_REPO | awk -F'/' '{print $NF}' | awk -F '.' '{print $1}')
DEST_REPO_URL=$GH_REPO_URL
SRC_REPO_URL=$KY_REPO_URLsetup_git() {git show -s --format=%ctgit config --global user.email "pzqu@qq.com"git config --global user.name "pzqu"rm -rf *git clone --depth=50 --branch=master $SRC_REPO_URLrepo_dir=$(ls) && cp -rf $repo_dir/* ./ &&  rm -rf $repo_dir
}commit_country_json_files() {git statusgit checkout master# Current month and year, e.g: Apr 2018dateAndMonth= `date "+%b %Y"`# Stage the modified files in dist/outputgit add -A# Create a new commit with a custom build message# with "[skip ci]" to avoid a build loop# and Travis build number for referencegit commit -m "Travis update: $dateAndMonth (Build $TRAVIS_BUILD_NUMBER)" -m "[skip ci]"
}upload_files() {# Remove existing "origin"git remote rm origin# Add new "origin" with access token in the git URL for authenticationgit remote add origin $DEST_REPO_URL > /dev/null 2>&1git push origin master --quiet
}compare_new() {github_last_commit_time=$(git show -s --format=%ct)git clone $KY_REPO_URL && cd $KY_REPO_NAMEky_last_commit_time=$(git show -s --format=%ct)if [ $github_last_commit_time -gt $ky_last_commit_time ];thenSRC_REPO_URL=$GH_REPO_URLDEST_REPO_URL=$KY_REPO_URLelsecd ..fiecho "sync $SRC_REPO_URL to $DEST_REPO_URL"
}compare_newsetup_gitcommit_country_json_files# Attempt to commit to git only if "git commit" succeeded
if [ $? -eq 0 ]; thenecho "A new commit with changed country JSON files exists. Uploading to GitHub"upload_files
elseecho "No changes in country JSON files. Nothing to do"
fi

代码过长,参考代码位置 github

脚本说明

这个脚本实现了仓库更新时间对比,同步推送代码的功能。

脚本中只需修改看云版本库地址以及 github 地址即可,另外脚本中定义了 3 个变量,是从 ci 平台里取的,用于免密执行 git clone ,为了安全不放在代码库里。

KY_REPO #看云版本库地址
GH_REPO #github仓库地址
$KANCLOUD_USER #看云账号
$KANCLOUD_PASS #看云密码
$GITHUB_TOKEN #github token

注意这 3 个参数可以配置在 travis-ci web 界面中,脚本能够自行调用该参数,不要以明文配置在脚本中。

travis-ci 配置

开启 github 仓库追踪

访问traivs 官网,以 github 账户登录:

点击右上角用户头像 settings 开启刚才新建的 github 仓库跟踪

定义脚本变量

点击 dashboard ,选择对应仓库,点击右侧 More options--Settings

配置 Environment Variales

  • 注意 TOKEN 和密码不要以明文显示。
  • 注意!!这 4 个参数如果用户名或密码中包含 @ 符号,需要替换为 %40 ,比如密码为 admin@123 需要写为 admin%40123
  • github token 需要访问 github 官网进行创建,点击右上角头像, Settings--Developer settings--Personal access tokens 生成一个新 token ,权限只需要 repo 就行,设置复制到 travis-ci 即可。

腾讯云 serverless

阿里云和腾讯云都提供免费的 serverless 服务,免费服务每个月有流量限制,不过完全够用,这里以腾讯云为例。

无服务器云函数地址:https://cloud.tencent.com/product/scf

选择产品–基础–无服务器云函数–立即使用–函数服务–新建。

选择空白函数,运行环境选择 PHP

下一步,复制以下函数

<?php
function main_handler($event, $context) {// 解析看云post的数据$update_title = '';if($event->body){$kanyun_data= json_decode($event->body);$update_title .= $kanyun_data->data->title;}// default params$repos = 'xxxxxxxx';  // 你的仓库id 或 slug扩展名$token = 'xxxxxxxxxxxxxxx'; // 你的登录token$message = date("Y/m/d").':kanyun update:'.$update_title;$branch = 'master';// post params$queryString = $event->queryString;$q_token = $queryString->token ? $queryString->token : $token;$q_repos = $queryString->repos ? $queryString->repos : $repos;$q_message = $queryString->message ? $queryString->message : $message;$q_branch = $queryString->branch ? $queryString->branch : 'master';echo($q_token);echo('===');echo ($q_repos);echo ('===');echo ($q_message);echo ('===');echo ($q_branch);echo ('===');//request travis ci$res_info = triggerTravisCI($q_repos, $q_token, $q_message, $q_branch);$res_code = 0;$res_message = '未知';if($res_info['http_code']){$res_code = $res_info['http_code'];switch($res_info['http_code']){case 200:case 202:$res_message = 'success';break;default:$res_message = 'faild';break;}}$res = array('status'=>$res_code,'message'=>$res_message);return $res;
}/** @description  travis api , trigger a build
* @param $repos string 仓库ID、slug
* @param $token string 登录验证token
* @param $message string 触发信息
* @param $branch string 分支
* @return $info array 回包信息*/
function triggerTravisCI ($repos, $token, $message='kanyun update', $branch='master') {//初始化$curl = curl_init();//设置抓取的urlcurl_setopt($curl, CURLOPT_URL, 'https://api.travis-ci.org/repo/'.$repos.'/requests');//设置获取的信息以文件流的形式返回,而不是直接输出。curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置post方式提交curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");//设置post数据$post_data = json_encode(array("request"=> array("message"=>$message,"branch"=>$branch)));$header = array('Content-Type: application/json','Travis-API-Version: 3','Authorization:token '.$token,'Content-Length:' . strlen($post_data));curl_setopt($curl, CURLOPT_HTTPHEADER, $header);curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);//执行命令$data = curl_exec($curl);$info = curl_getinfo($curl);//关闭URL请求curl_close($curl);return $info;
}
?>

函数说明:
serverless 函数中参数的设置:
该函数只需修改以下两项:

$repos = 'xxx'; // 你的github仓库id 或 slug扩展名
$token = 'xxx'; // 你的travis-ci登录token

获取 travis-ci token

travis-ci 官网上点击右上角 Settings--Settings ,复制 token

仓库 ID 获取方法

方法 1,使用 curl 命令,注意需要 travis-ci token 以及 github 用户名称

curl -X GET \https://api.travis-ci.org/owner/替换成你的github用户名/repos \-H 'apiexplore: 替换成你的token' \-H 'cache-control: no-cache' \-H 'travis-api-version: 3' \-H 'user-agent: API Explorer'

方法 2,使用 postman
下载地址:https://www.getpostman.com/downloads/
postman 发个 GET 请求,填写 urlheaders 参数

完成后添加触发方式,选择 API 网关触发器,其他默认,保存。

然后复制访问路径

看云配置

找一本想要实时同步到 github 的书,在文档钩子中添加 serverless 访问路径( webhook 地址) ,保存即可。

开始写书,提交到版本库,查看腾讯云 serverless 日志,提示调用成功:

查看 travis-ci 触发成功构建

查看 github 仓库,内容已经更新

小结

这篇文章中的 serverless 是云行业非常火的一个概念,不再需要服务器,不再需要写应用,只需要专注于函数就可以处理一些问题,大大的节约了成本,支持很多语言,可以自己下来研究下。

webhook 是非常棒的一种架构模式,不仅仅是可以用在代码仓库的同步中,也可以设计到你写的程序里,只要制定好规范,你的程序就可以通过配置调用/被调用,变得更像插件,其他系统对接的时候就更容易。

涉及资源

  • 代码仓库 github
  • 看云 [编程伐木累的技术小册

](https://www.kancloud.cn/coding3min/coding3min/1748607)

  • travis-ci
  • 腾讯云函数

引用

看云实时同步到 github

QA

Q:如果两端同时编辑,那怎么自动解决冲突合并问题,还是通过邮件通知开发人员去解决?
A:我也考虑过这个问题,如果同时对一个文件进行编辑,只有当同时提交的时候才会发生这个问题,首先是构建速度快,一般1分钟内就会同步完成,这个时候冲突会发生在提交成功前。

要是恰好在这 1 分钟内的,我是先pull,再覆盖代码再push,不会发生冲突,但是上一次提交记录会被覆盖掉。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

两个offer:一个996,月薪3万;一个885,月薪2万,怎么选?

找工作时&#xff0c;钱和闲&#xff0c;你选哪个&#xff1f; 一位网友拿到了两个offer&#xff0c;一个996&#xff0c;月薪3万&#xff0c;一个885&#xff0c;月薪2万&#xff0c;怎么选&#xff1f; 一部分网友选择885&#xff0c;因为自己是打工人&#xff0c;不是打工奴…

Karto的后端优化与回环检测功能对比测试与分析

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 上篇文章讲解了Karto的前端是如何工作的. 这篇文章将slam_karto中的后端优化部分的代码添加进lesson6中&#xff0c;我将带着大家一起体验后端优化的作用与功能&#xff0e; 1 室外数据集 由于上一篇文章使用…

面向智能博弈的决策 Transformer 方法综述

源自&#xff1a;指挥与控制学报 作者&#xff1a;罗俊仁 张万鹏 苏炯铭 王尧 陈璟 摘 要 智能博弈是认知决策智能领域的挑战性问题, 是辅助联合作战筹划与智能任务规划的关键支撑. 从协作式团队博弈、竞争式零和博弈和混合式一般和博弈共 3 个角度梳理了智能博弈模型, …

打造音视频极致消费体验

在观看视频时&#xff0c;用户最看重的是什么呢&#xff1f;清晰度&#xff1f;流畅度&#xff1f;还是播放时的稳定性&#xff1f;作为视频厂商&#xff0c;不仅要考虑到常见的指标&#xff0c;一些关乎用户体验的隐藏性指标也需要重点关注。如何持续升级优化代码并在成本和用…

前端系列17集-和公司架构师在学习vue3-springboot

SyntaxError: "undefined" is not valid JSON at JSON.parse (<anonymous>) 这个错误通常意味着你正在尝试将一个非 JSON 格式的数据转换成 JSON 格式。为了修复这个问题&#xff0c;你需要找到导致错误的代码行并检查它的输入数据是否符合 JSON 格式标准。 这…

微信联盟链接不到服务器怎么,LOL微信绑定方法及无法登录处理方案推荐

LOL今日开启了微信登录功能的测试&#xff0c;很多玩家不知道该怎么绑定。本文小编会为大家详细介绍绑定方法和无法登陆的处理方案&#xff0c;感兴趣的小伙伴们&#xff0c;和小编一起来看看吧&#xff01; 绑定方法 8月21日8.16版本发布后&#xff0c;在部分大区开启微信登录…

英雄联盟手游登录注册地与服务器不匹配,lol手游无法使用当前地区账号登录原因说明,相关解决方法分享...

在lol的手游中&#xff0c;最近注册登录的玩家越来越多&#xff0c;上线登录的时间也越来越频繁&#xff0c;很多服务器也处于无法登陆的状态&#xff0c;刚刚也有玩家发现Unable to login with an account from this region的登录提示&#xff0c;这是表示无法使用当前地区的账…

LOL决赛夜钓鱼攻击分析

今天是LOL决赛夜&#xff0c;朋友圈和群里很多人发图一的链接&#xff0c;会自动跳转到B站&#xff0c;我看了一下认为有点问题。 首先是大学生群体中大规模转发了这种自动跳转b站的url&#xff0c;并且url不相同。 第二我进行分析了一下&#xff0c;发现这个url域名没有网页…

印尼玩lol注册哪个服务器,LOL手游印尼服怎么注册 云顶之弈印尼服账号注册方法[多图]...

LOL手游印尼服作为国外服开放的区域&#xff0c;可以让你认识更多的国外强力玩家哦&#xff0c;但是很多玩家都不知道如何注册账号&#xff0c;下面就让安族66来告诉大家吧~ LOL手游云顶之弈印尼服账号注册方法 国服英雄联盟玩家众多&#xff0c;万一手游的水平达不到希望中的程…

推特 我们目前不能注册此邮箱地址_试玩手游版LOL,媲美端游的质量,这份注册攻略须收藏|moba|英雄联盟|lol|端游|手游...

眼看着英雄联盟手游版已经在印尼、马来西亚、新加坡、日本、菲律宾、韩国等公测地区的应用商店上线&#xff0c;且正式进行不限号公测&#xff0c;国内玩家也开始想尽办法冲破地域限制来率先体验这款经典的游戏。那么“如何成功下载并运行游戏&#xff1f;”、“哪些机型能够完…

推特 我们目前不能注册此邮箱地址_试玩手游版LOL,媲美端游的质量,这份注册攻略须收藏...

原标题&#xff1a;试玩手游版LOL&#xff0c;媲美端游的质量&#xff0c;这份注册攻略须收藏 眼看着英雄联盟手游版已经在印尼、马来西亚、新加坡、日本、菲律宾、韩国等公测地区的应用商店上线&#xff0c;且正式进行不限号公测&#xff0c;国内玩家也开始想尽办法冲破地域限…

前端:完整简单详细的注册页面讲解

成品总效果如下&#xff1a; 需要其他修饰网页可以加入自己的创意 讲解&#xff1a; 不知道基础语法的宝可以看看我先前发的一些内容 注意点&#xff1a; 1&#xff0c;密码需要用type"password"属性&#xff0c;使密码不会被显示。如下&#xff1a; 密 码<in…

云顶之弈服务器维护多长时间,云顶之弈各服务器上线时间一览

云顶之弈已经在美服PBE测试一段时间了&#xff0c;终于要开始登陆正式服了&#xff0c;下面为大家带来的是lol云顶之弈各服务器的正式上线时间一览&#xff0c;一起来了解一下吧。 推荐阅读&#xff1a; 云顶之弈各服务器上线时间一览 由于以下的时间都是太平洋时区&#xff0c…

冲击百万大奖!广州·琶洲算法大赛赛题讲解会,7场直播直击命题重点

‍‍ 第二届广州琶洲算法大赛是由广州市人民政府主办、海珠区人民政府和百度公司等单位联合承办的赛事&#xff0c;旨在为企业、高校师生、广大开发者提供展示技术能力、开展跨界交流、促进创业就业的平台。大赛自 4 月 25 日启动以来&#xff0c;吸引了超过 1000 支队伍报名参…

microsoft store 安装包_LOL英雄联盟手游官方安装包

两年了&#xff0c;整整两年了&#xff0c;英雄联盟手游终于要来了&#xff0c;10月28日&#xff0c;LOL手游在日本开放公测&#xff0c;无需再预约。 不过很遗憾&#xff0c;现在只开放了东南亚小部分地区&#xff0c;国内还得等一段时间。官方预计在明年春季上线国服。 前辈今…

[JSP暑假实训] 二.JSP网站创建及Servlet实现注册表单提交、计算器运算

本系列文章是作者暑假给学生进行实训分享的笔记&#xff0c;主要介绍MyEclipse环境下JSP网站开发&#xff0c;包括JAVA基础、网页布局、数据库基础、Servlet、前端后台数据库交互、DAO等知识。 本篇文章开始讲解MyEclipse环境下创建JSP网站&#xff0c;并实现注册表页面的创建及…

lol计算机丢失msvcp140,玩英雄联盟提示电脑缺少msvcp140.dll怎么办

玩英雄联盟提示电脑缺少msvcp140.dll怎么办&#xff1f;很多小伙伴不知道msvcp140.dll是什么&#xff1f;msvcp140.dll 其实是 VC 运行库组件中的一个 dll 文件。很多小伙伴安装游戏活着软件的时候提示缺少该文件&#xff01;其实我们可以通过安装 VC 运行库来解决这个错误提示…

仿LOL项目开发第一天

---恢复内容开始--- 仿LOL项目开发第一天 by---草帽 项目源码研究群&#xff1a;539117825 最近看了一个类似LOL的源码&#xff0c;颇有心得&#xff0c;所以今天呢&#xff0c;我们就来自己开发一个类似于LOL的游戏demo。 可能项目持续的时间会比较久&#xff0c;主要是现在还…

linux 用户创建时间,在linux中如何能得知一个用户的创建时间?

在linux中如何能得知一个用户的创建时间&#xff1f; (2011-08-24 03:36:01) 标签&#xff1a; 杂谈 在linux中如何能得知一个用户的创建时间&#xff1f;如题。之前我试过id、passwd以及通过stat查看用户主目录的创建时间&#xff0c;但是都不能准确地反映这个用户的 创建时间…

印尼玩lol注册哪个服务器,《LOL手游》印尼服怎么注册 安卓IOS注册流程攻略

导 读 LOL手游印尼服终于上线咯。相信大家都想去尝试一波&#xff0c;印尼服作为国际外服&#xff0c;想要体验就需要注册账号哦&#xff0c;下面九游小编就带来详细注册方法&#xff0c;快来看看吧~ 云顶之弈手游安卓ios注册流程详解 国服英雄联盟... LOL手游印尼服终于上线咯…