前言
有些時候需要下載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
複製程式碼
下載效果圖
實際我們真實業務場景的需求往往是更復雜的,下載資源僅僅是比較簡單的一步;
比如配置檔案引數校驗,路徑校驗以及環境構建場景,變數注入,
不同的產物組合到不同的映象,映象之間資源的互相複用等等~
構建概要資訊輸出
有時候我們可能需要輸出一些構建過程產生的資訊,方便追溯或者對比拿到的資源是否正確;
這裡可以說下,怎麼拿到tag裡面的commit_hash~~
通過tarball路徑執行下載的包,都有一個標準的資料夾規律,
就是壓縮包的第一個目錄名字是:
組織+倉庫名字+commit_hash(commit_hash永遠在最後一個)
有規律後其實就比較好解決了~就是用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過去
總結
有不對之處請留言,會及時修正,謝謝閱讀~