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

CRPER發表於2021-08-12

前言


有些時候需要下載GitHub倉庫的tar.gz來做一些其他操作;
這時候可能最常見的就是去GitHub上找release或者tag裡面有提供tar.gz的資源;
然後點選下載~~

但是有些場景可能這種操作就不是很方便了,比如給客戶打包原始碼的;
快速指定git的tag或者某個commit_hash , download下來
然後對於原始碼做一些加密什麼的,再給到客戶現場構建部署~;

這時候我們就會考慮以指令碼來切入,以配置檔案的姿勢來錄入一些引數,
然後快速拿到一些我們需要的資源~

這裡舉一個比較單一的場景來開展這篇文章,往下看~

常規CURL下載Github Repo.tar.gz

非私有倉

# 指定路徑存放並重新命名
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 把輸出寫到該檔案中,保留遠端檔案的檔名

複製程式碼

私有倉

  # 可以指定登陸使用者和授權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 變數配置檔案

# 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

#!/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
這裡可以說下,怎麼拿到tag裡面的commit_hash~~
通過tarball路徑執行下載的包,都有一個標準的資料夾規律,
就是壓縮包的第一個目錄名字是:
組織+倉庫名字+commit_hash(commit_hash永遠在最後一個)
image.png
有規律後其實就比較好解決了~就是用shell組合裁剪過濾拿即可~程式碼如下


# 輸出構建依賴資訊
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過去

總結

有不對之處請留言,會及時修正,謝謝閱讀~

相關文章