前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >curl快速下载GitHub Repo指定commit的tar.gz

curl快速下载GitHub Repo指定commit的tar.gz

作者头像
CRPER
发布2022-03-08 15:13:55
1.3K0
发布2022-03-08 15:13:55
举报
文章被收录于专栏:CRPER折腾记

前言

有些时候需要下载GitHub仓库的tar.gz来做一些其他操作; 这时候可能最常见的就是去GitHub上找release或者tag里面有提供tar.gz的资源; 然后点击下载~~ 但是有些场景可能这种操作就不是很方便了,比如给客户打包源码的; 快速指定git的tag或者某个commit_hash , download下来 然后对于源码做一些加密什么的,再给到客户现场构建部署~;

这时候我们就会考虑以脚本来切入,以配置文件的姿势来录入一些参数, 然后快速拿到一些我们需要的资源~

这里举一个比较单一的场景来开展这篇文章,往下看~

常规CURL下载Github Repo.tar.gz

非私有仓

代码语言:javascript
复制
# 指定路径存放并重命名
curl -Ls  https://github.com/nodejs/node/tarball/v16.6.2  > node.tar.gz 

# 保留tar.gz原名字
curl -LsO  https://github.com/nodejs/node/tarball/v16.6.2

# -L 参数会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向。
# -s 是silent,就是不输出详细过程
# -O 把输出写到该文件中,保留远程文件的文件名

私有仓

代码语言:javascript
复制
  # 可以指定登陆用户和授权token拿到
  curl -sL --user "${GITHUB_LOGIN_USER}:${GITHUB_AUTH_TOKEN}" ${GIT_ARCHIVE_URL} >${SAVE_ARCHIVE_PATH}
  
  # -u,--user 就是指定用户账号和密码,密码也可以用授权token(支持的情况下)--> --user crper:crper_auth_token

单一场景演示

我们这里以下载私有仓的例子说明~

key.txt 变量配置文件

代码语言:javascript
复制
# GITHUB登陆用户
GITHUB_LOGIN_USER=<github_user>
# github授权toke
GITHUB_AUTH_TOKEN=<github_token>

# github代码tag或者commit hash
# 每一个tag本质上也是对应的一个commit hash
REPO_ORG=<repo_org>
PROJECT_GIT_REPO_TAG_OR_HASH=<project_tag_or_commit_hash>
PROJECT_COMMON_GIT_REPO_TAG_OR_HASH=<project_common_commit_hash>
WIKI_GIT_REPO_TAG_OR_HASH=<wiki_tag_or_commit_hash>
WIKI_COMMON_GIT_REPO_TAG_OR_HASH=<wiki_common_commit_hash>

# 若是需要在整个shell上下文生效,可以带上export,变成临时环境变量~
# 不带export,在执行那个脚本的上下文可以感知到我们定义的这些变量

demo.sh

代码语言:javascript
复制
#!/bin/bash
# 入口脚本执行路径内src目录的相对路径
SRC_PATH="./src"

# 从配置文件读取一些变量定义
init_args() {
  if [ -f "$SRC_PATH/key.txt" ]; then
    # . 等同于 source这个命令
    . $SRC_PATH/key.txt
  fi
}

# 上一条命令执行异常就强行退出
check_exec_result() {
  if [ $? != 0 ]; then
    exit 1
  fi
}


# 下载归档资源
download_repo_src() {
  GIT_REPO_NAME=$1
  GIT_REPO_TAG_OR_HASH=$2
  SAVE_ARCHIVE_PATH=$3
  GIT_ARCHIVE_URL="https://github.com/${REPO_ORG}/${GIT_REPO_NAME}/tarball/${GIT_REPO_TAG_OR_HASH}"
  echo "Download Git source archive: ${GIT_ARCHIVE_URL}"
  curl -sL --user "${GITHUB_LOGIN_USER}:${GITHUB_AUTH_TOKEN}" ${GIT_ARCHIVE_URL} >${SAVE_ARCHIVE_PATH}
  check_exec_result
  echo "Download Git source archive: ${GIT_ARCHIVE_URL} Success!!"
}

# 初始化
init_arg

# 下载资源
download_repo_src xxx-repo $PROJECT_GIT_REPO_TAG_OR_HASH $SRC_PATH/project.src.tar.gz
download_repo_src xxx-repo $WIKI_GIT_REPO_TAG_OR_HASH $SRC_PATH/wiki.src.tar.gz

下载效果图

image.png
image.png

​实际我们真实业务场景的需求往往是更复杂的,下载资源仅仅是比较简单的一步; 比如配置文件参数校验,路径校验以及环境构建场景,变量注入, 不同的产物组合到不同的镜像,镜像之间资源的互相复用等等~

构建概要信息输出

有时候我们可能需要输出一些构建过程产生的信息,方便追溯或者对比拿到的资源是否正确;

image.png
image.png

这里可以说下,怎么拿到tag里面的commit_hash~~ 通过tarball路径执行下载的包,都有一个标准的文件夹规律, 就是压缩包的第一个目录名字是: 组织+仓库名字+commit_hash(commit_hash永远在最后一个)

image.png
image.png

有规律后其实就比较好解决了~就是用shell组合裁剪过滤拿即可~代码如下

代码语言:javascript
复制
# 输出构建依赖信息
write_build_info() {
  PROJECT_COMMIT=$(tar -tf ${SRC_PATH}/project.src.tar.gz | head -n 1 | awk -F '-' '{print $NF}' | sed 's/\///g')
  WIKI_COMMIT=$(tar -tf ${SRC_PATH}/wiki.src.tar.gz | head -n 1 | awk -F '-' '{print $NF}' | sed 's/\///g')
  CURRENT_BUILD_DATE=$(date +'%Y-%m-%d_%H:%m')

  echo "PROJECT_COMMIT=${PROJECT_COMMIT}" >> "$SRC_PATH/build_info.txt"
  echo "WIKI_COMMIT=${WIKI_COMMIT}" >> "$SRC_PATH/build_info.txt"
}

FAQ

可能有人会说,git clone不是很好用么~~ git clone对于需要快速指定commit拿到对应资源来说其实并不友好; git clone 目前来说,只支持分支,仓库,仓库Tag, 而commit是需要你clone整个仓库后checkout过去

总结

有不对之处请留言,会及时修正,谢谢阅读~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 常规CURL下载Github Repo.tar.gz
    • 非私有仓
      • 私有仓
      • 单一场景演示
        • key.txt 变量配置文件
          • demo.sh
            • 下载效果图
              • 构建概要信息输出
              • FAQ
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档