github_api获取仓库最新Releases版本号

shell命令获取

以 链接https://github.com/fatedier/frp为例,对应的 项目是fatedier/frp

所有latest版本信息的API 地址为:https://api.github.com/repos/fatedier/frp/releases

最新发布的一个的latest版本信息API 地址为:
https://api.github.com/repos/fatedier/frp/releases/latest

【实际使用时注意替换接口URL中对应的用户名和仓库名】

下载地址为:"browser_download_url":
"https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_android_arm64.tar.gz"

通过观察和分析得知,想要下载最新的版本 只需要获取最新的版本号即可,然后我们手动拼接,即可获取最新的下载地址:

https://github.com/fatedier/frp/releases/download/v[最新的版本号]/frp_[最新的版本号]_android_arm64.tar.gz

以下是完整的shell命令:

# 使用GitHub API获取最新的发行版信息(里边有最新的版本号标识)
response=$(curl -s https://api.github.com/repos/fatedier/frp/releases/latest)
# 提取下载链接 (tag_name属性即为版本号属性 cut命令获取版本号属性的值 awk命令把版本号中的v字符删除)
version=$(echo "$response" | grep 'tag_name' | cut -d'"' -f4 | awk '{print substr($0, 2, length($0) - 1)'})

# 拼接下载连接
download_url=https://github.com/fatedier/frp/releases/download/v$version/frp_$version_android_arm64.tar.gz

# 使用curl下载最新发行版(-L意思是支持重定向,很多下载都是重定向下载 -o是自定义名字)
curl -L -o clash.apk $download_url

提取链接信息1:

wget -qO- -t1 -T2 "https://api.github.com/repos/iina/iina/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g'

wget 参数

wget -qO- -t1 -T2`,在这里,我们使用了 4 个参数,分别是`q,O-,t1,T2
  1. -q: q 就是 quiet 的意思了,没有该参数将会显示从请求到输出全过程的所有内容,这肯定不是我们想要的。
  2. -O-: -O是指把文档写入文件中,而-O-是将内容写入标准输出,而不保存为文件。(注:这里是大写英文字母 O (Out),不是数字 0)
  3. -t1,-T2: 前者是设定最大尝试链接次数为 1 次,后者是设定响应超时的秒数为 2 秒,两者可以防止失败后反复获取,导致后续脚本无法执行。

筛选参数

  1. grep "tag_name": grep 是 Linux 一个强大的文本搜索工具,在本代码中输出 tag_name 所在行,即输出"tag_name": "v0.0.15.1",
  2. head -n 1: head -n用于显示输出的行数,考虑到某些项目可能存在多个不同版本的 tag_name,这里我们只要第一个。
  3. awk -F ":" '{print $2}': awk 主要用于文本分析,在这里指定:为分隔符,将该行切分成多列,并输出第二列。于是我们得到了(空格)"v0.0.15.1",
  4. sed 's/\"//g;s/,//g;s/ //g': 在这里 sed 用于数据查找替换,如sed 's/要被取代的字串/新的字串/g' ,因此本段命令可分为 3 个,以分号分隔。s/\"//g即将引号删除(反斜杠是为了防止引号被转义),以此类推,最终留下我们需要的内容:v0.0.15.1

提取链接信息2:

# 使用curl下载版本信息
curl -o version.latest https://api.github.com/repos/fatedier/frp/releases/latest

# 正则表达式匹配版本号
cat version.latest | grep -E 'tag_name\": \"v[0-9]+\.[0-9]+\.[0-9]+' -o |head -n 1| tr -d 'tag_name\": \"'

自动更新drpyS-node

#!/bin/bash
echo "开始更新drpyS-node!"
echo "开启v2raya服务"
sudo systemctl start v2raya
sleep 60
sudo systemctl status v2raya


## 如果drpy_ver不存在就创建一个,并_ver值为空,存在就读取version文件里的数据给_ver
if [ -f "/B860/drpyS/drpy_ver" ]; then
drpy_ver=$(cat "/B860/drpyS/drpy_ver")
echo "本地版本:$drpy_ver"
else
drpy_ver=""
fi
echo $drpy_ver

## 获取所有的latest版本信息中的 .[0] 表示获取 JSON 数组的第一个元素
## curl -s https://api.github.com/repos/OWNER/REPO/releases | jq -r '.[0].tag_name'

## "获取最新一个 Latest版本信息赋值给 LATEST_TAG "
LATEST_TAG=$(curl -s https://api.github.com/repos/hjdhnx/drpy-node/releases/latest | jq -r '.tag_name')
echo $LATEST_TAG

echo "判断是否需要更新"
if [ "$drpy_ver" = "$LATEST_TAG" ]; then
echo "已经是最新 Latest-release 版本"
else
echo "发现新 Latest-release 版本 $LATEST_TAG"
echo "准备更新drpy-node"
cd "/B860/drpyS/drpy-node/" # 注意此行对应drpy-node项目路径
git fetch --all && git reset --hard origin/main
# drpyS 注意此行 drpyS 对应容器名
docker exec -it drpyS npm install > /dev/null 2>&1
# 注意此行对应编排文件路径 和 编排版本docker-compose[可能是docker compose])
docker-compose -f /opt/1panel/runtime/node/drpyS/docker-compose.yml restart

## 判断下载是否成功 [ $? -eq 0 ] 特殊变量 $? 表示上一条命令的退出状态,0 表示成功,非0 表示上一条失败。
if [ $? -eq 0 ]; then
echo "执行成功"
echo "$LATEST_TAG" > "/B860/drpyS/drpy_ver"
else
echo "执行失败"
fi
fi


echo "停止v2raya服务"
sudo systemctl stop v2raya
cp "/root/drpy_update.sh" "/B860/drpyS/"


## 出现的问题 file busy(文本文件忙),发生此错误是因为当前文件已被占用,
## 因此只要找出占用该文件的进程并杀死就可以了。
## zsh: 文本文件忙: ./drpy_update.sh
## B860:~:# fuser drpy_update.sh
## /root/drpy_update.sh: 15550
## B860:~:# kill -9 15550