1 Star 2 Fork 11

则霖信息技术(深圳)有限公司/frappe-deployer

forked from 杨嘉祥/frappe-deployer 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
build.sh 16.63 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
#!/usr/bin/env bash
# 脚本报错即刻退出
set -e
DEFAULT_REGISTRY=ccr.ccs.tencentyun.com
DEFAULT_NAMESPACE=vnimy
DEFAULT_MAIN_VERSION=version-14
# 默认自定镜像主版本
DEFAULT_CUSTOM_MAIN_VERSION=version-14
DEFAULT_FRAPPE_REPO=https://gitee.com/mirrors/frappe.git
DEFAULT_ERPNEXT_REPO=https://gitee.com/mirrors/erpnext.git
DEFAULT_ERPNEXT_CHINESE_REPO=https://gitee.com/yuzelin/erpnext_chinese.git
DEFAULT_ERPNEXT_OOB_REPO=https://gitee.com/yuzelin/erpnext_oob.git
DEFAULT_IMAGE_NAME=erp
set -a # automatically export all variables
if [ -f .env ]; then
source .env
fi
set +a
function show_usage() {
echo -e "
用法:
<命令> [选项]
命令:
help 帮助
base [选项] 构建基础镜像
builder [选项] 构建builder镜像
backend [选项] 构建后端镜像。该命令将基于最新的代码进行构建镜像,该操作将
无法固定Frappe、ERPNext的版本。
builder-oob [选项] 构建builder-oob镜像。该命令用于构建指定版本的基础镜像,并
用于后续基于该镜像快速构建自定义镜像,该操作可固定Frappe、
ERPNext的版本。
custom [选项] 构建自定义APP镜像。在基于builder-oob命令构建出来的镜像的
基础上添加自定以APP。
[镜像] [-h | --help] 镜像构建帮助
get-default 查看当前构建默认值
set-default [选项] 设置构建默认值
使用方法:set-default param1=value1 param2=value2 ...
支持以下参数:
镜像注册中心 registry
镜像命名空间 namespace
主版本 main_version
自定义镜像主版本 custom_main_version
Frappe仓库 frappe_repo
ERPNext仓库 erpnext_repo
ERPNext Chinese仓库 erpnext_chinese_repo
ERPNext OOB仓库 erpnext_oob_repo";
}
function show_backend_usage() {
echo -e "
用法:
backend [选项]
命令:
-h,--help 帮助
-f,--apps_file [path] apps json文件路径,默认:apps.json
-r,--registry [registry] 镜像注册中心,默认:$DEFAULT_REGISTRY
-n,--namespace [namespace] 镜像注册中心的命名空间,默认:$DEFAULT_NAMESPACE
-v,--version [version] 主版本,默认:$DEFAULT_MAIN_VERSION
-i,--image [name] 镜像名称,不包含标签,默认:$DEFAULT_NAMESPACE/$DEFAULT_IMAGE_NAME
-t,--tag [name] 镜像标签,默认:$DEFAULT_MAIN_VERSION.$(date '+%y%m%d')
--frappe-repo [repo] Frappe框架仓库地址,默认:$DEFAULT_FRAPPE_REPO
-c,--cached 使用缓存进行构建,默认不使用缓存";
}
function show_custom_usage() {
echo -e "
用法:
backend [选项]
命令:
-h,--help 帮助
-r,--registry [registry] 镜像注册中心,默认:$DEFAULT_REGISTRY
-n,--namespace [namespace] 镜像注册中心的命名空间,默认:$DEFAULT_NAMESPACE
-v,--version [version] 基础镜像版本,默认:$DEFAULT_CUSTOM_MAIN_VERSION
-i,--image [name] 镜像名称,不包含标签,默认:$DEFAULT_NAMESPACE/$DEFAULT_IMAGE_NAME
-t,--tag [name] 镜像标签,默认:$DEFAULT_CUSTOM_MAIN_VERSION.$(date '+%y%m%d')
-f,--app-file [file] 自定义应用配置文件,一行一个APP,该配置优先于app-branch,app-repo,app-name参数
例子 custom.txt:
app-name1,app-repo1,app-branch1
app-name2,app-repo2,app-branch2
--app-branch [branch] 自定义应用分支名称,默认:master
--app-repo [repo] 自定义应用仓库地址
--app-name [name] 自定义应用名称";
}
function show_builder_oob_usage() {
echo -e "
用法:
builder-oob [选项]
命令:
-h,--help 帮助
-r,--registry [registry] 镜像注册中心,默认:$DEFAULT_REGISTRY
-n,--namespace [namespace] 镜像注册中心的命名空间,默认:$DEFAULT_NAMESPACE
-v,--version [version] 主版本,默认:$DEFAULT_MAIN_VERSION
--frappe-repo [repo] Frappe框架仓库地址,默认:$DEFAULT_FRAPPE_REPO
--erpnext-repo [repo] ERPNext仓库地址,默认:$DEFAULT_ERPNEXT_REPO
--erpnext-chinese-repo [repo] ERPNext Chinese仓库地址,默认:$DEFAULT_ERPNEXT_CHINESE_REPO
--erpnext-oob-repo [repo] ERPNext OOB仓库地址,默认:$DEFAULT_ERPNEXT_OOB_REPO
-c,--cached 使用缓存进行构建,默认不使用缓存";
}
function show_base_usage() {
echo -e "
用法:
base [选项]
命令:
-h,--help 帮助
-r,--registry [registry] 镜像注册中心,默认:$DEFAULT_REGISTRY
-n,--namespace [namespace] 镜像注册中心的命名空间,默认:$DEFAULT_NAMESPACE";
}
function show_builder_usage() {
echo -e "
用法:
builder [选项]
命令:
-h,--help 帮助
-r,--registry [registry] 镜像注册中心,默认:$DEFAULT_REGISTRY
-n,--namespace [namespace] 镜像注册中心的命名空间,默认:$DEFAULT_NAMESPACE";
}
function build_base() {
NAMESPACE=$DEFAULT_NAMESPACE
REGISTRY=$DEFAULT_REGISTRY
ARGS=`getopt -o hr:n: -al help,registry:,namespace: -- "$@"`
if [ $? != 0 ];then
echo "Terminating..."
exit 1
fi
#重新排列参数顺序
eval set -- "${ARGS}"
#通过shift和while循环处理参数
while :
do
case $1 in
-r|--registry)
REGISTRY=$2
shift 2
;;
-n|--namespace)
NAMESPACE=$2
shift 2
;;
-h|--help)
show_base_usage
exit 0
;;
--)
shift
break
;;
*)
show_base_usage
exit 0
;;
esac done
IMAGE=${REGISTRY}/$NAMESPACE/frappe-base:latest
echo "开始构建镜像:$IMAGE"
docker build \
--build-arg=DOCKER_REGISTRY=$REGISTRY \
--build-arg=DOCKER_NAMESPACE=$NAMESPACE \
--tag=$IMAGE \
--file=Dockerfile.base .
docker push $IMAGE
echo "构建完成"
if [ $? -eq 0 ]; then
docker push $IMAGE
echo "推送完成"
fi
}
function build_builder() {
NAMESPACE=$DEFAULT_NAMESPACE
REGISTRY=$DEFAULT_REGISTRY
ARGS=`getopt -o hr:n: -al help,registry:,namespace: -- "$@"`
if [ $? != 0 ];then
echo "Terminating..."
exit 1
fi
#重新排列参数顺序
eval set -- "${ARGS}"
#通过shift和while循环处理参数
while :
do
case $1 in
-r|--registry)
REGISTRY=$2
shift 2
;;
-n|--namespace)
NAMESPACE=$2
shift 2
;;
-h|--help)
show_builder_usage
exit 0
;;
--)
shift
break
;;
*)
show_builder_usage
exit 0
;;
esac done
IMAGE=${REGISTRY}/$NAMESPACE/frappe-builder:latest
echo "开始构建镜像:$IMAGE"
docker build \
--build-arg=DOCKER_REGISTRY=$REGISTRY \
--build-arg=DOCKER_NAMESPACE=$NAMESPACE \
--tag=$IMAGE \
--file=Dockerfile.builder .
docker push $IMAGE
echo "构建完成"
if [ $? -eq 0 ]; then
docker push $IMAGE
echo "推送完成"
fi
}
function build_builder_oob() {
NAMESPACE=$DEFAULT_NAMESPACE
REGISTRY=$DEFAULT_REGISTRY
CACHE_ARG=--no-cache
MAIN_VERSION=$DEFAULT_MAIN_VERSION
DATE_VERSION=$(date '+%y%m%d')
TAG=$MAIN_VERSION.$DATE_VERSION
FRAPPE_REPO=$DEFAULT_FRAPPE_REPO
FRAPPE_BRANCH=${DEFAULT_FRAPPE_BRANCH:-$MAIN_VERSION}
ERPNEXT_REPO=$DEFAULT_ERPNEXT_REPO
ERPNEXT_BRANCH=${DEFAULT_ERPNEXT_BRANCH:-$MAIN_VERSION}
ERPNEXT_CHINESE_REPO=$DEFAULT_ERPNEXT_CHINESE_REPO
ERPNEXT_CHINESE_BRANCH=${DEFAULT_ERPNEXT_CHINESE_BRANCH:-"master"}
ERPNEXT_OOB_REPO=$DEFAULT_ERPNEXT_OOB_REPO
ERPNEXT_OOB_BRANCH=${DEFAULT_ERPNEXT_OOB_BRANCH:=$MAIN_VERSION}
ARGS=`getopt -o hcr:n:v: -al help,cached,registry:,namespace:,version:,frappe-repo:,erpnext-repo:,erpnext-chinese-repo:,erpnext-oob-repo: -- "$@"`
if [ $? != 0 ];then
echo "Terminating..."
exit 1
fi
#重新排列参数顺序
eval set -- "${ARGS}"
#通过shift和while循环处理参数
while :
do
case $1 in
-r|--registry)
REGISTRY=$2
shift 2
;;
-n|--namespace)
NAMESPACE=$2
shift 2
;;
--frappe-repo)
FRAPPE_REPO=$2
shift 2
;;
--erpnext-repo)
ERPNEXT_REPO=$2
shift 2
;;
--erpnext-chinese-repo)
ERPNEXT_CHINESE_REPO=$2
shift 2
;;
--erpnext-oob-repo)
ERPNEXT_OOB_REPO=$2
shift 2
;;
-v|--version)
MAIN_VERSION=$2
shift 2
;;
-c|--cached)
CACHE_ARG=""
shift
;;
-h|--help)
show_builder_oob_usage
exit 0
;;
--)
shift
break
;;
*)
show_builder_oob_usage
exit 0
;;
esac done
IMAGE=${REGISTRY}/${NAMESPACE}/frappe-builder-oob:${TAG}
echo "开始构建镜像:$IMAGE"
docker build \
--build-arg=DOCKER_REGISTRY=$REGISTRY \
--build-arg=DOCKER_NAMESPACE=$NAMESPACE \
--build-arg=FRAPPE_REPO=$FRAPPE_REPO \
--build-arg=FRAPPE_BRANCH=$FRAPPE_BRANCH \
--build-arg=ERPNEXT_REPO=$ERPNEXT_REPO \
--build-arg=ERPNEXT_BRANCH=$ERPNEXT_BRANCH \
--build-arg=ERPNEXT_CHINESE_REPO=$ERPNEXT_CHINESE_REPO \
--build-arg=ERPNEXT_CHINESE_BRANCH=$ERPNEXT_CHINESE_BRANCH \
--build-arg=ERPNEXT_OOB_REPO=$ERPNEXT_OOB_REPO \
--build-arg=ERPNEXT_OOB_BRANCH=$ERPNEXT_OOB_BRANCH \
--tag=$IMAGE \
--file=Dockerfile.builder-oob $CACHE_ARG .
echo "构建完成 $IMAGE"
if [ $? -eq 0 ]; then
docker push $IMAGE
echo "推送完成 $IMAGE"
fi
}
function build_backend() {
MAIN_VERSION=$DEFAULT_MAIN_VERSION
DATE_VERSION=$(date '+%y%m%d')
TAG=$MAIN_VERSION.$DATE_VERSION
NAMESPACE=$DEFAULT_NAMESPACE
IMAGE_NAME=$NAMESPACE/$DEFAULT_IMAGE_NAME
REGISTRY=$DEFAULT_REGISTRY
APPS_FILE=apps.json
CACHE_ARG=--no-cache
FRAPPE_REPO=$DEFAULT_FRAPPE_REPO
ARGS=`getopt -o hcf:r:n:i:t:v: -al help,cached,apps_file:,registry:,namespace:,image:,tag:,version:,frappe-repo: -- "$@"`
if [ $? != 0 ];then
echo "Terminating..."
exit 1
fi
#重新排列参数顺序
eval set -- "${ARGS}"
#通过shift和while循环处理参数
while :
do
case $1 in
-f|--apps_file)
APPS_FILE=$2
shift 2
;;
-t|--tag)
TAG=$2
shift 2
;;
-r|--registry)
REGISTRY=$2
shift 2
;;
-i|--image)
IMAGE_NAME=$2
shift 2
;;
-n|--namespace)
NAMESPACE=$2
shift 2
;;
--frappe-repo)
FRAPPE_REPO=$2
shift 2
;;
-v|--version)
MAIN_VERSION=$2
shift 2
;;
-c|--cached)
CACHE_ARG=""
shift
;;
-h|--help)
show_backend_usage
exit 0
;;
--)
shift
break
;;
*)
show_backend_usage
exit 0
;;
esac done
if [ ! -f $APPS_FILE ]; then
echo "${APPS_FILE}文件不存在"
exit 1
fi
IMAGE=${REGISTRY}/${IMAGE_NAME}:${TAG}
echo "开始构建镜像:$IMAGE"
docker build \
--build-arg=DOCKER_REGISTRY=$REGISTRY \
--build-arg=DOCKER_NAMESPACE=$NAMESPACE \
--build-arg=FRAPPE_REPO=$FRAPPE_REPO \
--build-arg=FRAPPE_BRANCH=$MAIN_VERSION \
--build-arg=APPS_JSON_BASE64=$(base64 -w 0 ${APPS_FILE}) \
--tag=$IMAGE $CACHE_ARG .
echo "构建完成"
if [ $? -eq 0 ]; then
docker push $IMAGE
echo "推送完成"
fi
}
function build_custom() {
MAIN_VERSION=$DEFAULT_CUSTOM_MAIN_VERSION
# 这里可以将版本定到分钟级,有助于在频繁推送并用Helm更新时候可以正常拉去最新镜像
DATE_VERSION=$(date '+%y%m%d%H%M')
TAG=$MAIN_VERSION.$DATE_VERSION
NAMESPACE=$DEFAULT_NAMESPACE
IMAGE_NAME=$NAMESPACE/$DEFAULT_IMAGE_NAME
REGISTRY=$DEFAULT_REGISTRY
CUSTOM_APP_BRANCH=master
CUSTOM_APP_REPO=""
CUSTOM_APP_NAME=""
CUSTOM_APPS=""
ARGS=`getopt -o hr:n:i:t:v:f: -al help,registry:,namespace:,image:,tag:,version:,app-branch:,app-repo:,app-name:,app-file: -- "$@"`
if [ $? != 0 ];then
echo "Terminating..."
exit 1
fi
#重新排列参数顺序
eval set -- "${ARGS}"
#通过shift和while循环处理参数
while :
do
case $1 in
-t|--tag)
TAG=$2
shift 2
;;
-r|--registry)
REGISTRY=$2
shift 2
;;
-i|--image)
IMAGE_NAME=$2
shift 2
;;
-n|--namespace)
NAMESPACE=$2
shift 2
;;
-v|--version)
MAIN_VERSION=$2
shift 2
;;
--app-branch)
CUSTOM_APP_BRANCH=$2
shift 2
;;
--app-repo)
CUSTOM_APP_REPO=$2
shift 2
;;
--app-name)
CUSTOM_APP_NAME=$2
shift 2
;;
-f|--app-file)
if [ -e $2 ]; then
CUSTOM_APPS=$(cat $2)
fi
shift 2
;;
-h|--help)
show_custom_usage
exit 0
;;
--)
shift
break
;;
*)
show_custom_usage
exit 0
;;
esac done
if [ ! -n "${CUSTOM_APPS}" ]; then
if [ -n "${CUSTOM_APP_REPO}" ]; then
CUSTOM_APPS="${CUSTOM_APP_NAME},${CUSTOM_APP_REPO},${CUSTOM_APP_BRANCH:-"master"}"
elif [ -e "custom.txt" ]; then
CUSTOM_APPS=$(cat "custom.txt")
fi
fi
IMAGE=${REGISTRY}/${IMAGE_NAME}:${TAG}
echo "开始构建镜像:$IMAGE"
docker build \
--build-arg=DOCKER_REGISTRY=$REGISTRY \
--build-arg=DOCKER_NAMESPACE=$NAMESPACE \
--build-arg=MAIN_VERSION=$MAIN_VERSION \
--build-arg=CUSTOM_APPS="$CUSTOM_APPS" \
--tag=$IMAGE \
--file=Dockerfile.custom --no-cache .
echo "构建完成"
if [ $? -eq 0 ]; then
docker push $IMAGE
echo "推送完成"
fi
}
function get_default() {
echo -e "registry: $DEFAULT_REGISTRY
namespace: $DEFAULT_NAMESPACE
main_version: $DEFAULT_MAIN_VERSION
custom_main_version: $DEFAULT_CUSTOM_MAIN_VERSION
frappe_repo: $DEFAULT_FRAPPE_REPO
erpnext_repo: $DEFAULT_ERPNEXT_REPO
erpnext_chinese_repo: $DEFAULT_ERPNEXT_CHINESE_REPO
erpnext_oob_repo: $DEFAULT_ERPNEXT_OOB_REPO"
}
function set_default() {
for var in $@
do
arr=(${var//=/ })
case "${arr[0]}" in
"registry")
DEFAULT_REGISTRY=${arr[1]}
;;
"namespace")
DEFAULT_NAMESPACE=${arr[1]}
;;
"main_version")
DEFAULT_MAIN_VERSION=${arr[1]}
;;
"custom_main_version")
DEFAULT_CUSTOM_MAIN_VERSION=${arr[1]}
;;
"frappe_repo")
DEFAULT_FRAPPE_REPO=${arr[1]}
;;
"erpnext_repo")
DEFAULT_ERPNEXT_REPO=${arr[1]}
;;
"erpnext_chinese_repo")
DEFAULT_ERPNEXT_CHINESE_REPO=${arr[1]}
;;
"erpnext_oob_repo")
DEFAULT_ERPNEXT_OOB_REPO=${arr[1]}
;;
esac
done
echo -e "DEFAULT_REGISTRY=$DEFAULT_REGISTRY
DEFAULT_NAMESPACE=$DEFAULT_NAMESPACE
DEFAULT_MAIN_VERSION=$DEFAULT_MAIN_VERSION
DEFAULT_CUSTOM_MAIN_VERSION=$DEFAULT_CUSTOM_MAIN_VERSION
DEFAULT_FRAPPE_REPO=$DEFAULT_FRAPPE_REPO
DEFAULT_ERPNEXT_REPO=$DEFAULT_ERPNEXT_REPO
DEFAULT_ERPNEXT_CHINESE_REPO=$DEFAULT_ERPNEXT_CHINESE_REPO
DEFAULT_ERPNEXT_OOB_REPO=$DEFAULT_ERPNEXT_OOB_REPO" > .env
}
if [ -z $1 ]; then
show_usage
exit 0
fi
shift $((OPTIND -1)) # remove options
subcommand=$1; shift
case "$subcommand" in
"help")
show_usage
exit 0
;;
"base")
build_base $@
exit 0
;;
"builder")
build_builder $@
exit 0
;;
"builder-oob")
build_builder_oob $@
exit 0
;;
"backend")
build_backend $@
exit 0
;;
"custom")
build_custom $@
exit 0
;;
"get-default")
get_default $@
exit 0
;;
"set-default")
set_default $@
exit 0
;;
*)
show_usage
exit 0
;;
esac
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/yuzelin/frappe-deployer.git
[email protected]:yuzelin/frappe-deployer.git
yuzelin
frappe-deployer
frappe-deployer
master

搜索帮助