語境
我撰寫了一個 Bash 腳本,它會自動從 GitLab 服務器中洗掉一個存盤庫,并創建一個新的 GitLab 存盤庫。
代碼
洗掉存盤庫的代碼是:
delete_existing_repository() {
local repo_name="$1"
local repo_username="$2"
# load personal_access_token
local personal_access_token
personal_access_token=$(echo "$GITLAB_PERSONAL_ACCESS_TOKEN_GLOBAL" | tr -d '\r')
local output
output=$(curl --silent -H 'Content-Type: application/json' -H "Private-Token: $personal_access_token" -X DELETE "$GITLAB_SERVER_HTTP_URL"/api/v4/projects/"$repo_username"/"$repo_name")
if [ "$(lines_contain_string '{"message":"404 Project Not Found"}' "${output}")" == "FOUND" ]; then
echo "ERROR, you tried to delete a GitLab repository that does not exist."
exit 183
fi
}
檢查 GitLab 是否成功處理了 repo 推送的函式是:
# Create repository.
curl --silent -H "Content-Type:application/json" "$GITLAB_SERVER_HTTP_URL/api/v4/projects?private_token=$personal_access_token" -d "{ \"name\": \"$gitlab_repo_name\" }" > /dev/null 2>&1 &
sleep 30
printf "\n Waiting 30 secs untill repo is (re)created in GitLab server."
問題
問題是我在確定何時成功洗掉 GitLab 存盤庫以及何時成功創建和處理它時遇到了一些困難。現在,我只是“蠻力”等待 30 秒,因為到目前為止,我的系統已經足夠快,可以在這段時間內完成。但是,這是低效且不可靠的,因為它也應該在較慢的系統上作業。因此我想問:
如何在 Bash 中洗掉和創建 GitLab 存盤庫,以便在命令結束時,repo 被完全洗掉并(重新)成功創建?
uj5u.com熱心網友回復:
部分答案:完全創建的 GitLab 存盤庫將是可克隆的。要測驗創建是否已完成,請嘗試克隆 repo。這只有在完全創建存盤庫的情況下才能成功,并且由于您正在嘗試克隆一個空的存盤庫,所以它會很快。
不過,我沒有驗證洗掉的建議,因為克隆失敗不會確認洗掉已完成,盡管創建失敗可能表明它不是。
但是,如果在您的 bash 腳本結束時,克隆按預期生成了一個空的 repo,那么您肯定知道洗掉 重新創建操作作為一個整體是成功的。
uj5u.com熱心網友回復:
描述
為了確保 bash 代碼等到在 GitLab 中成功創建或洗掉存盤庫,我撰寫了一個方法,FOUND如果存盤庫存在于 GitLab 服務器中,則回傳該方法,NOTFOUND如果它不存在。接下來我撰寫了兩個方法來檢查n存盤庫是否存在/不存在的時間,中間有 5 秒的暫停:
解決方案
# run with:
# bash -c 'source src/import.sh && wait_until_repo_exists_in_gitlab nonexistant_repo'
# bash -c 'source src/import.sh && wait_until_repo_exists_in_gitlab sponsor_example'
wait_until_repo_exists_in_gitlab(){
local gitlab_repo_name="$1"
# Specify how many retries are allowed.
local nr_of_retries=10
local termination_limit="$((nr_of_retries-2))"
local i="0"
while [ $i -lt $nr_of_retries ]; do
local found_repo="$(repo_exists_in_gitlab_server "$gitlab_repo_name")"
i=$[$i 1]
if [ "$found_repo" == "FOUND" ]; then
break
elif [[ "$i" == "$termination_limit" ]]; then
echo "Error, did not find repo in GitLab server, within permitted timeframe."
exit 6
break
fi
sleep 5
done
}
# bash -c 'source src/import.sh && wait_until_repo_does_not_exist_in_gitlab nonexistant_repo'
# bash -c 'source src/import.sh && wait_until_repo_does_not_exist_in_gitlab sponsor_example'
wait_until_repo_does_not_exist_in_gitlab(){
local gitlab_repo_name="$1"
# Specify how many retries are allowed.
local nr_of_retries=10
local termination_limit="$((nr_of_retries-2))"
local i="0"
while [ $i -lt $nr_of_retries ]; do
local found_repo="$(repo_exists_in_gitlab_server "$gitlab_repo_name")"
i=$[$i 1]
if [ "$found_repo" == "NOTFOUND" ]; then
break
elif [[ "$i" == "$termination_limit" ]]; then
echo "Error, still found the repo in GitLab server, within permitted timeframe."
exit 6
break
fi
sleep 5
done
}
# run with:
# bash -c 'source src/import.sh && repo_exists_in_gitlab_server nonexistant_repo'
# bash -c 'source src/import.sh && repo_exists_in_gitlab_server sponsor_example'
repo_exists_in_gitlab_server(){
local gitlab_repo_name="$1"
local temporary_test_filepath=/tmp/TESTRET
local expected_if_non_existant="fatal: repository '$GITLAB_SERVER_HTTP_URL/$GITLAB_SERVER_ACCOUNT_GLOBAL/$gitlab_repo_name/' not found"
local acceptable_warning="warning: redirecting to $GITLAB_SERVER_HTTP_URL/$GITLAB_SERVER_ACCOUNT_GLOBAL/$gitlab_repo_name.git/"
# Delete file exists.
delete_file_if_it_exists $temporary_test_filepath
# Check if gitlab repo exists and output any errors to file.
something=$(git ls-remote http://$GITLAB_SERVER_ACCOUNT_GLOBAL:$GITLAB_PERSONAL_ACCESS_TOKEN_GLOBAL@$GITLAB_SERVER/$GITLAB_SERVER_ACCOUNT_GLOBAL/$gitlab_repo_name 2> $temporary_test_filepath)
# Used to verify it throws an error if auth is invalid.
#something=$(git ls-remote http://$GITLAB_SERVER_ACCOUNT_GLOBAL:$GITLAB_PERSONAL_ACCESS_TOKEN_GLOBALasdf@$GITLAB_SERVER/$GITLAB_SERVER_ACCOUNT_GLOBAL/$gitlab_repo_name 2> $temporary_test_filepath)
# Check if the output file contains an error.
if [[ -n `cat $temporary_test_filepath` ]]; then
# Check if the error indicates the repo does not exist, or whether there is another issue.
if [ "$(file_contains_string "$expected_if_non_existant" "$temporary_test_filepath")" != "FOUND" ]; then
# An error is thrown, check if it is an acceptable error or not.
if [ "$acceptable_warning" == "$(cat $temporary_test_filepath)" ]; then
# This means the repository exists.
echo "FOUND"
else
echo 'ERROR, checking if GitLab repo exists yielded an error other than "the repo does not exist"'
echo "$(cat $temporary_test_filepath)."
echo "$acceptable_warning."
exit 5
fi
elif [ "$(file_contains_string "$expected_if_non_existant" "$temporary_test_filepath")" == "FOUND" ]; then
# The output file contained the expected error, for when a repo does not exist.
echo "NOTFOUND"
else
echo "Error, checking if a GitLab repo exists in server, yielded an unexpected output error:"
echo "$(cat $temporary_test_filepath)."
fi
else
echo "FOUND"
fi
# Delete file exists.
delete_file_if_it_exists $temporary_test_filepath
}
用法
創建 GitLab 存盤庫并等待它創建完成的代碼:
# Create repository.
curl --silent -H "Content-Type:application/json" "$GITLAB_SERVER_HTTP_URL/api/v4/projects?private_token=$personal_access_token" -d "{ \"name\": \"$gitlab_repo_name\" }" > /dev/null 2>&1 &
wait_until_repo_exists_in_gitlab "$gitlab_repo_name"
洗掉 repo 并等待它被洗掉的代碼:
#######################################
# Checks if repository exists in the GitLab server and deletes it. Otherwise, an
# error is shown.
# How to run:
# source src/import.sh src/helper/GitLab/helper_gitlab_modify.sh && delete_existing_repository_from_gitlab
# "sponsor_example" "root"
# Local variables:
# gitlab_repo_name
# gitlab_username
# personal_access_token
# Globals:
# GITLAB_PERSONAL_ACCESS_TOKEN_GLOBAL
# GITLAB_SERVER_HTTP_URL
# Arguments:
# Name of the GitLab repository.
# The GitLab username.
# Returns:
# 0 if funciton was evaluated succesfull.
# 183 if an attempt was made to delete a GitLab repository that did not exist.
# Outputs:
# None.
#######################################
# run with:
# bash -c 'source src/import.sh src/helper/GitLab/helper_gitlab_modify.sh && delete_existing_repository_from_gitlab new_repo root'
delete_existing_repository_from_gitlab() {
local repo_name="$1"
local repo_username="$2"
# load personal_access_token
local personal_access_token
personal_access_token=$(echo "$GITLAB_PERSONAL_ACCESS_TOKEN_GLOBAL" | tr -d '\r')
local output
output=$(curl --silent -H 'Content-Type: application/json' -H "Private-Token: $personal_access_token" -X DELETE "$GITLAB_SERVER_HTTP_URL"/api/v4/projects/"$repo_username"/"$repo_name")
if [ "$(lines_contain_string '{"message":"404 Project Not Found"}' "${output}")" == "FOUND" ]; then
echo "ERROR, you tried to delete a GitLab repository that does not exist."
exit 183
fi
wait_until_repo_does_not_exist_in_gitlab "$gitlab_repo_name"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/517593.html
標籤:重击GitLab等待
