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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月15万CU 3个月
简介: 一次协作多端同步,打通看云、github互相同步(serverless实践)

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


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


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS8yMDIwLzA2LzI1L2RVM3RjYzEyMTUucG5n.png


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


同步原理


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.git
KY_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_URL
setup_git() {
  git show -s --format=%ct
  git config --global user.email "pzqu@qq.com"
  git config --global user.name "pzqu"
  rm -rf *
  git clone --depth=50 --branch=master $SRC_REPO_URL
  repo_dir=$(ls) && cp -rf $repo_dir/* ./ &&  rm -rf $repo_dir
}
commit_country_json_files() {
  git status
  git checkout master
  # Current month and year, e.g: Apr 2018
  dateAndMonth= `date "+%b %Y"`
  # Stage the modified files in dist/output
  git add -A
  # Create a new commit with a custom build message
  # with "[skip ci]" to avoid a build loop
  # and Travis build number for reference
  git 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 authentication
  git remote add origin $DEST_REPO_URL > /dev/null 2>&1
  git push origin master --quiet
}
compare_new() {
   github_last_commit_time=$(git show -s --format=%ct)
   git clone $KY_REPO_URL && cd $KY_REPO_NAME
   ky_last_commit_time=$(git show -s --format=%ct)
   if [ $github_last_commit_time -gt $ky_last_commit_time ];then
       SRC_REPO_URL=$GH_REPO_URL
       DEST_REPO_URL=$KY_REPO_URL
   else
       cd ..
   fi
   echo "sync $SRC_REPO_URL to $DEST_REPO_URL"
}
compare_new
setup_git
commit_country_json_files
# Attempt to commit to git only if "git commit" succeeded
if [ $? -eq 0 ]; then
  echo "A new commit with changed country JSON files exists. Uploading to GitHub"
  upload_files
else
  echo "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 即可。


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS8yMDIwLzA2LzI1L2JrSFFhODExNTEucG5n.png

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS8yMDIwLzA2LzI1L1RxdEVvbTExNTMucG5n.png



腾讯云 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();
    //设置抓取的url
    curl_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 请求,填写 url 和 headers 参数


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


然后复制访问路径

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS8yMDIwLzA2LzI1L0VYMktWODEyMDAucG5n.png


看云配置


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


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

查看 travis-ci 触发成功构建

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


小结


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


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


涉及资源

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

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

引用

看云实时同步到 github


QA

Q:如果两端同时编辑,那怎么自动解决冲突合并问题,还是通过邮件通知开发人员去解决?

A:我也考虑过这个问题,如果同时对一个文件进行编辑,只有当同时提交的时候才会发生这个问题,首先是构建速度快,一般1分钟内就会同步完成,这个时候冲突会发生在提交成功前。


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

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
29天前
|
运维 Kubernetes 前端开发
拥抱Knative, 合思加速Serverless化演进实践
合思信息基于阿里云容器服务Knative, 实现Serverless化演进的最佳实践。
拥抱Knative, 合思加速Serverless化演进实践
|
2月前
|
弹性计算 关系型数据库 Serverless
函数计算驱动多媒体文件处理:高效、稳定与成本优化实践
本次测评的解决方案《告别资源瓶颈,函数计算驱动多媒体文件处理》展示了如何利用阿里云函数计算高效处理多媒体文件。文档结构清晰、内容详实,适合新客户参考。方案提供了一键部署与手动部署两种方式,前者简便快捷,后者灵活性高但步骤较多。通过部署,用户可体验到基于函数计算的文件处理服务,显著提升处理效率和系统稳定性。此外,测评还对比了应用内处理文件与函数计算处理文件的不同,突出了函数计算在资源管理和成本控制方面的优势。
22703 19
|
2月前
|
运维 Kubernetes Serverless
Serverless Argo Workflows荣获信通院标杆实践案例,引领大规模离线任务处理新方法
阿里云容器服务Serverless Argo Workflows大规模离线计算工作流平台荣获2024信通院Serveless实践标杆案例。本文介绍其应用场景、平台特性以及领域实践。
|
3月前
|
分布式计算 Java Serverless
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
本文以 ECS 连接 EMR Serverless Spark 为例,介绍如何通过 EMR Serverless spark-submit 命令行工具进行 Spark 任务开发。
369 7
EMR Serverless Spark 实践教程 | 通过 spark-submit 命令行工具提交 Spark 任务
|
2月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
45 0
|
2月前
|
分布式计算 Serverless 数据处理
EMR Serverless Spark 实践教程 | 通过 Apache Airflow 使用 Livy Operator 提交任务
Apache Airflow 是一个强大的工作流程自动化和调度工具,它允许开发者编排、计划和监控数据管道的执行。EMR Serverless Spark 为处理大规模数据处理任务提供了一个无服务器计算环境。本文为您介绍如何通过 Apache Airflow 的 Livy Operator 实现自动化地向 EMR Serverless Spark 提交任务,以实现任务调度和执行的自动化,帮助您更有效地管理数据处理任务。
158 0
|
2月前
|
Windows
github无法访问?vscode 无法使用github登录同步? 改 hosts 吧
github无法访问?vscode 无法使用github登录同步? 改 hosts 吧
|
3月前
|
监控 JavaScript Serverless
函数计算产品使用问题之如何部署一个未构建的Vue项目,并实现从Gitee仓库自动同步更新
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
3月前
|
分布式计算 Hadoop Serverless
数据处理的艺术:EMR Serverless Spark实践及应用体验
阿里云EMR Serverless Spark是基于Spark的全托管大数据处理平台,融合云原生弹性与自动化,提供任务全生命周期管理,让数据工程师专注数据分析。它内置高性能Fusion Engine,性能比开源Spark提升200%,并有成本优化的Celeborn服务。支持计算存储分离、OSS-HDFS兼容、DLF元数据管理,实现一站式的开发体验和Serverless资源管理。适用于数据报表、科学项目等场景,简化开发与运维流程。用户可通过阿里云控制台快速配置和体验EMR Serverless Spark服务。
|
4月前
|
分布式计算 运维 Serverless
通过Serverless Spark提交PySpark流任务的实践体验
EMR Serverless Spark服务是阿里云推出的一种全托管、一站式的数据计算平台,旨在简化大数据计算的工作流程,让用户更加专注于数据分析和价值提炼,而非基础设施的管理和运维。下面就跟我一起通过Serverless Spark提交PySpark流任务吧。
150 1

相关产品

  • 函数计算
  • 下一篇
    无影云桌面