技術(shù)棧
Tech |
Usage |
git |
構(gòu)建裸倉庫用于存放鉤子/文件倉庫 |
shell |
用于更新項(xiàng)目原型版本及提供給不熟悉git操作的產(chǎn)品同事更新原型 |
html |
用于根據(jù)js配置文件展示項(xiàng)目原型及版本 |
js |
用于存放所有項(xiàng)目的版本配置, 供html及shell腳本解析調(diào)用 |
nginx |
HTTP服務(wù)器用于配置web域名訪問及簡單賬戶密碼限制 |
AxureRP |
產(chǎn)品同事用于生成用于原型預(yù)覽的HTML文件 |
Bare repository(用于存放鉤子澈蟆,相當(dāng)于中央倉庫)
cd /data/bare_repo
git init --bare rp.git
cd rp.git/hooks
vim post-receive
--- contents of post-receive ----
#!/bin/bash
unset GIT_DIR
dep_path="/data/prototype/"
cd "$dep_path"
git add . -A && git stash
git pull origin master
exit 0
--- contents end ----
Local repository(用于存放供web訪問的文件)
cd /data/prototype
git init
git remote add origin /data/bare_repo/rp.git
項(xiàng)目結(jié)構(gòu)(/data/prototype 下)
- config: 用于存放項(xiàng)目配置
- rp: 用于存放項(xiàng)目原型 HTML 文件
- scripts: 存放提供給產(chǎn)品同事執(zhí)行的 shell 腳本,用于更新原型文件或原型版本
- index.html/version.html: web頁面入口匿沛,用于頁面展示
代碼樣例
var rpVersion = {
mmb: [0.1, 0.2],
aitu: [0.1],
wedis: [0.1, '0.2'],
kqmp : [0.1, 0.2, 'web'],
ddysApp: [2.13, 2.14],
ddysWx: [2.13, 2.14],
ddysPc: [2.13],
ddysAdmin: [2.13],
ddysXbld: [2.13]
}
- scripts/git_rp_repo_sync.sh
#!/bin/bash
# encoding: utf-8
###################################################
# Author: gaopq
# Version: 0.01
# Email: peiqianggao@gmail.com
# Org: DDYS
# Date: 2017-01-10 18:23:34
# ChangeLog: add versions page for projects
# ChangeLog: fixed bugs when this script updated itself and other user execute it before pull and update it.
# Description: 更新原型系統(tǒng)請先在 rp 文件夾下對應(yīng)項(xiàng)目文件夾下創(chuàng)建代表版本的文件夾, 并把原型HTML文件生成到該文件夾下再執(zhí)行本腳本
###################################################
CONF_FILE=$(dirname $0)/../config/properties.js
RP_DIR="$(dirname $0)/../"
TMP_SHELL_NAME=".tmp.sh"
# 獲取所有項(xiàng)目名
get_projects(){
while read line
do
if [[ $line != ${line%:*} ]]
then
projs="$projs ${line%:*}"
fi
done < $CONF_FILE
echo $projs
}
# 獲取某個(gè)項(xiàng)目的現(xiàn)有版本號(hào), param: project_name
get_versions(){
[[ $# -ne 1 ]] && return 1
proj=$1
versions=$(grep -w $proj $CONF_FILE | awk -F: '{print $2}')
echo $versions | sed "s/ //g;s/[]\[,]/ /g;s/'//g;"
}
# 給某個(gè)項(xiàng)目添加一個(gè)版本, params: project_name, new_version
add_version(){
[[ $# -ne 2 ]] && return 1
proj=$1
new_version=$2
versions_pro=$(get_versions $proj)
echo $versions_pro | grep -w $new_version > /dev/null
if [[ $? -eq 0 ]]
then
return 1
else
# write new_version to file
# 此處不能使用單引號(hào)
# sed 's/(^ *$proj.*)(],.*$)/\1, ${new_version}\2/' $CONF_FILE
sed -i "s/\(^ *$proj.*\)\(],.*$\)/\1, '${new_version}'\2/" $CONF_FILE
return 0
fi
}
# 通過 git 上傳文件
rp_git_sync(){
git add -A :/
git commit -m "$(date +'%Y-%m-%d %H:%M:%S')[INFO]update project: $1, version: $2, From: $(uname -a)"
echo -e "\e[1;32m][INFO]Waiting for updating and pushing ...\e[0m"
git push origin master && echo -e "\e[1;32m$(date +'%Y-%m-%d %H:%M:%S') updated successfully.\e[0m"
}
# 從倉庫更新文件并判斷本shell文件是否在被更新的列表中
git_pull_test_shell_script_if_updated(){
# shell_name=$(basename $0)
# if the current running shell is not the $TMP_SHELLL_NAME
[[ ${0%%$TMP_SHELL_NAME} == $0 ]] && cp -rf $0 $(dirname $0)/${TMP_SHELL_NAME}
cd $RP_DIR
git pull origin master
[[ $? -ne 0 ]] && exec bash scripts/${TMP_SHELL_NAME}
}
# 開始工作
git_pull_test_shell_script_if_updated
echo -e "\e[1;32m\nPlease select project (select one and update all ^_^)\e[0m"
select project in $(get_projects)
do
# vers=($(get_versions $project))
# last_ver=${vers[((${#vers[@]}-1))]}
last_ver=$(ls -t ${RP_DIR}rp/$project | head -1)
echo "Versions: $(get_versions $project)"
echo -en "\e[1;32m\nPlease input your version name (defaults: $last_ver): \e[0m"
read version
version=${version// /}
version=${version:-$last_ver}
add_version $project $version
rp_git_sync $project $version
break
done
exit 0
server {
listen 80;
server_name my_domin_name;
root /data/prototype/;
index index.html;
access_log /data/logs/nginx/my_domain_name.log main;
location ^~ / {
try_files $uri $uri/ /index.html?$args;
# Before this: htpasswd -c $NGINX_PATH/passwd_db/passwd.db username
auth_basic "Input Password";
auth_basic_user_file $NGINX_PATH/passwd_db/passwd.db;
}
# avoid accessing shell scripts from web
location ^~ /scripts {
deny all;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|html)$ {
if (-f $request_filename) {
root /data/prototype;
expires 10s;
}
}
}
Problems and solutions
- properties.js 文件中版本號(hào)可用單引號(hào)或雙引號(hào)括起苫耸,便于 js 解析
- 用戶在執(zhí)行本 shell 是發(fā)現(xiàn)本 shell 文件在遠(yuǎn)程倉庫被修改, git pull 的時(shí)候報(bào)錯(cuò)
- 每次執(zhí)行腳本前若發(fā)現(xiàn)執(zhí)行的不是備份版,則備份一次本腳本
- 發(fā)現(xiàn) git pull 失敗時(shí)默認(rèn)認(rèn)為是本 shell 在 pull 列表中陷谱,則使用 exec 執(zhí)行備份的腳本
- 用戶端配置
# server 端先配置一個(gè)可以訪問 /data/bare_repo 和 /data/prototype 的用戶
# client 端使用 ssh-keygen 命令生成公鑰私鑰并配置到 server 上
git init
git remote add rp_user@ip:/data/bare_repo/rp.git
# 首次更新,獲取初始化文件及 shell 腳本
git pull origin master
# 使用:
# 在 rp 文件夾下對應(yīng)項(xiàng)目文件夾下創(chuàng)建代表版本的文件夾, 并把原型HTML文件生成到該文件夾下
# 直接將 scripts 下的 git_rp_repo_sync.sh 拖到 git-bash 或 terminal 中執(zhí)行即可
# 可能需要: chmod +r git_rp_repo_sync.sh
效果預(yù)覽