-
This commit is contained in:
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# 本地环境
|
||||||
|
**/.DS_Store
|
||||||
|
**/.local/*
|
||||||
|
**/.venv/*
|
||||||
|
**/.conda/*
|
||||||
|
**/.taskfile/.env
|
||||||
|
|
||||||
|
# 临时目录
|
||||||
|
**/tmp/**
|
||||||
|
**/log/**
|
||||||
|
**/logs/**
|
||||||
|
**/temp/**
|
||||||
|
**/cache/**
|
||||||
|
|
||||||
|
# 构建产物
|
||||||
|
**/dist/**
|
||||||
|
**/build/**
|
||||||
0
.taskfile/.env.template
Normal file
0
.taskfile/.env.template
Normal file
12
.taskfile/cmd.yml
Normal file
12
.taskfile/cmd.yml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# https://taskfile.dev
|
||||||
|
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
vars:
|
||||||
|
GREETING: 用于本项目的常用命令编写
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
default:
|
||||||
|
desc: 默认任务
|
||||||
|
cmds:
|
||||||
|
- echo "${GREETING}"
|
||||||
50
.taskfile/env.yml
Normal file
50
.taskfile/env.yml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
vars:
|
||||||
|
NAMESPACE: "wangsendi"
|
||||||
|
DEVELOPER: "https://yuque.com/wangsendi"
|
||||||
|
TIME_NOW:
|
||||||
|
sh: TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S %Z'
|
||||||
|
|
||||||
|
PATH_REALPATH:
|
||||||
|
sh: pwd
|
||||||
|
PATH_DIRNAME:
|
||||||
|
sh: dirname "{{.PATH_REALPATH}}"
|
||||||
|
PATH_BASENAME:
|
||||||
|
sh: basename "{{.PATH_REALPATH}}"
|
||||||
|
PATH_PROJECT:
|
||||||
|
sh: echo "{{.PATH_BASENAME}}" | cut -d'-' -f2-
|
||||||
|
|
||||||
|
GIT_TAG_LATEST:
|
||||||
|
sh: |
|
||||||
|
_latest_tag=$(git tag --sort=-v:refname | head -n 1 2>/dev/null) || true
|
||||||
|
if [[ "${_latest_tag}" == "" ]]; then
|
||||||
|
git tag v0.0.0 -m "init" 2>/dev/null || true
|
||||||
|
_latest_tag="v0.0.0";
|
||||||
|
fi
|
||||||
|
echo ${_latest_tag}
|
||||||
|
GIT_COMMIT:
|
||||||
|
sh: git log -n 1 --format=%h 2>/dev/null || echo "0000"
|
||||||
|
GIT_SOURCE:
|
||||||
|
sh: grep -A1 '^\[remote' .git/config | grep 'url' | head -n 1 | sed 's|.git$||; s|:|/|; s|git@|https://|' | awk '{print $NF}'
|
||||||
|
GIT_PROJECT:
|
||||||
|
sh: echo "{{.GIT_SOURCE}}" | awk -F/ '{print $NF}'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
env:
|
||||||
|
desc: "显示环境变量"
|
||||||
|
silent: true
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
echo "NAMESPACE: {{.NAMESPACE}}"
|
||||||
|
echo "DEVELOPER: {{.DEVELOPER}}"
|
||||||
|
echo "TIME_NOW: {{.TIME_NOW}}"
|
||||||
|
echo
|
||||||
|
echo "PATH_REALPATH: {{.PATH_REALPATH}}"
|
||||||
|
echo "PATH_DIRNAME: {{.PATH_DIRNAME}}"
|
||||||
|
echo "PATH_BASENAME: {{.PATH_BASENAME}}"
|
||||||
|
echo "PATH_PROJECT: {{.PATH_PROJECT}}"
|
||||||
|
echo
|
||||||
|
echo "GIT_TAG_LATEST: {{.GIT_TAG_LATEST}}"
|
||||||
|
echo "GIT_COMMIT: {{.GIT_COMMIT}}"
|
||||||
|
echo "GIT_SOURCE: {{.GIT_SOURCE}}"
|
||||||
76
.taskfile/git.yml
Normal file
76
.taskfile/git.yml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
clear:
|
||||||
|
desc: "清除历史提交记录"
|
||||||
|
silent: true
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
_branch_name_current=$(git branch --show-current 2>/dev/null || echo "")
|
||||||
|
_branch_name_backups="local/bak/${_branch_name_current}/$(date +'%Y/%m/%d/%H%M%S')"
|
||||||
|
if [[ "${_branch_name_current}" == "" ]]; then
|
||||||
|
echo "当前分支为空,跳过清除 git 缓存"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
git add -A && git commit -am "clear commit" || true
|
||||||
|
git rm -r --cached .
|
||||||
|
git branch -m ${_branch_name_backups}
|
||||||
|
git checkout --orphan ${_branch_name_current}
|
||||||
|
git add -A && git commit -am "clear commit" || true
|
||||||
|
git push -f origin ${_branch_name_current}
|
||||||
|
|
||||||
|
reinit:
|
||||||
|
desc: "重新初始化 git"
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
_remote_url=$(git remote get-url origin | head -n1)
|
||||||
|
rm -rf .git
|
||||||
|
git init --initial-branch=main
|
||||||
|
touch README.md
|
||||||
|
git add .
|
||||||
|
git commit -m "first commit"
|
||||||
|
git tag -a {{.GIT_TAG_LATEST}} -m "init"
|
||||||
|
git remote add origin ${_remote_url}
|
||||||
|
git config push.autoSetupRemote true
|
||||||
|
- task: clear
|
||||||
|
|
||||||
|
push:
|
||||||
|
desc: "推送代码"
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
git add .
|
||||||
|
git commit -m "- {{.CLI_ARGS}}" || true
|
||||||
|
git push origin main || true
|
||||||
|
|
||||||
|
tag:next:
|
||||||
|
desc: "创建 tag"
|
||||||
|
vars:
|
||||||
|
GIT_TAG_NEXT:
|
||||||
|
sh: |
|
||||||
|
echo {{.GIT_TAG_LATEST}} | awk -F. '{print $1"."$2"."$3+1}'
|
||||||
|
cmds:
|
||||||
|
- echo '__version__ = "{{.GIT_TAG_NEXT}}"' > $(find . -maxdepth 3 -name version.py) || true
|
||||||
|
- task: push
|
||||||
|
- |
|
||||||
|
git tag -a {{.GIT_TAG_NEXT}} -m "- {{.CLI_ARGS}}"
|
||||||
|
git push origin {{.GIT_TAG_NEXT}}
|
||||||
|
|
||||||
|
keys:gen:
|
||||||
|
desc: "设置并使用部署秘钥"
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
_path_keys=".taskfile/git/keys"
|
||||||
|
mkdir -p ${_path_keys}
|
||||||
|
if [[ ! -f "${_path_keys}/id_ed25519" ]]; then
|
||||||
|
ssh-keygen -t ed25519 -N '' -f ${_path_keys}/id_ed25519 -C "{{.GIT_PROJECT}}"
|
||||||
|
fi
|
||||||
|
chmod 600 ${_path_keys}/id_ed25519
|
||||||
|
chmod 644 ${_path_keys}/id_ed25519.pub
|
||||||
|
|
||||||
|
keys:set:
|
||||||
|
desc: "设置部署秘钥"
|
||||||
|
cmds:
|
||||||
|
- |
|
||||||
|
_path_keys=".taskfile/git/keys"
|
||||||
|
git config push.autoSetupRemote true
|
||||||
|
git config core.sshCommand "ssh -i ${_path_keys}/id_ed25519 -o StrictHostKeyChecking=no -F /dev/null"
|
||||||
18
Taskfile.yml
Normal file
18
Taskfile.yml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# https://taskfile.dev
|
||||||
|
|
||||||
|
version: "3"
|
||||||
|
dotenv: [".env", ".taskfile/.env", "{{.HOME}}/.env", ".taskfile/.env.template"]
|
||||||
|
|
||||||
|
includes:
|
||||||
|
env:
|
||||||
|
taskfile: .taskfile/env.yml
|
||||||
|
optional: true
|
||||||
|
flatten: true
|
||||||
|
|
||||||
|
cmd:
|
||||||
|
taskfile: .taskfile/cmd.yml
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
git:
|
||||||
|
taskfile: .taskfile/git.yml
|
||||||
|
optional: true
|
||||||
15
boot/auto.sh
Normal file
15
boot/auto.sh
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
|
||||||
|
}
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'AEOF'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AEOF
|
||||||
|
}
|
||||||
22
boot/conflict.sh
Normal file
22
boot/conflict.sh
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
|
||||||
|
if [[ -d "/host/proc/1/" ]]; then source /apps/gitrce/hook/singleton.sh "$0"; fi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# __main
|
||||||
|
|
||||||
|
nsenter --mount=/host/proc/1/ns/mnt bash <<<"$(declare -f __main | sed "\$a __main")"
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'EOF'
|
||||||
|
|
||||||
|
bash -c 'cd /apps/gitrce/ && git pull -f; bash /apps/gitrce/boot/conflict.sh'
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
17
boot/cron.sh
Normal file
17
boot/cron.sh
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
# shellcheck disable=SC2009
|
||||||
|
# Admin https://www.yuque.com/wangsendi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
: # TODO
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'AEOF'
|
||||||
|
|
||||||
|
AEOF
|
||||||
|
}
|
||||||
8
boot/env.sh
Normal file
8
boot/env.sh
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
# 在每一次间隔时间后读取的变量, 作用容易入口文件
|
||||||
|
# 用于在容器运行的状态下, 远程修改 git 拉取间隔时间
|
||||||
|
# 注意,最小值不能大于最大值, 否则客户端 Git 死循环
|
||||||
|
|
||||||
|
INTERVAL_MIN=200 # 间隔最小值
|
||||||
|
INTERVAL_MAX=300 # 间隔最大值
|
||||||
84
boot/install.sh
Normal file
84
boot/install.sh
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC2317,SC2086
|
||||||
|
# Admin https://www.yuque.com/wangsendi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
|
||||||
|
{
|
||||||
|
# 判断是否有 docker 和 docker-compose
|
||||||
|
if ! command -v docker >/dev/null 2>&1; then
|
||||||
|
echo "docker not installed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$(docker compose version 2>/dev/null | grep version -c)" != "1" ]]; then
|
||||||
|
echo "docker compose not installed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
# 镜像准备
|
||||||
|
_image1="1181.s.kuaicdn.cn:11818/ghcr.io/wangsendi/gitrce:bbiz-t2507281"
|
||||||
|
_image2="$(echo "$_image1" | awk -F '/' '{print $NF}')"
|
||||||
|
if [[ "$(docker images "$_image2" | wc -l)" != "2" ]]; then
|
||||||
|
docker pull $_image1 && docker tag "$_image1" "$_image2"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
_gre_remote_repo="https://codeberg.org/umi-edge/250924-s-speedtest.git"
|
||||||
|
_container_name="250924-s-speedtest"
|
||||||
|
_apps_data="/data/umi/gitrce/$_container_name/master"
|
||||||
|
_compose_file="$_apps_data/boot/docker-compose.yaml"
|
||||||
|
mkdir -p ${_compose_file%/*}
|
||||||
|
cat >$_compose_file <<EOF
|
||||||
|
services:
|
||||||
|
master:
|
||||||
|
container_name: $_container_name
|
||||||
|
image: $_image2
|
||||||
|
restart: always
|
||||||
|
network_mode: host
|
||||||
|
privileged: true
|
||||||
|
security_opt:
|
||||||
|
- apparmor:unconfined
|
||||||
|
environment:
|
||||||
|
- GIT_REMOTE_REPO=$_gre_remote_repo
|
||||||
|
- APPS_DATA=$_apps_data
|
||||||
|
- CONTAINER_NAME=$_container_name
|
||||||
|
volumes:
|
||||||
|
- /dev:/host/dev:ro
|
||||||
|
- /sys:/host/sys:ro
|
||||||
|
- /proc:/host/proc:ro
|
||||||
|
- /run:/host/run:rw
|
||||||
|
- /etc:/host/etc:rw
|
||||||
|
- /data:/data:rw,rshared
|
||||||
|
- /disk:/disk:rw,rshared
|
||||||
|
- "$_apps_data/:/apps/data"
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
# run
|
||||||
|
docker ps -f name="[0-9a-z]{12}_$_container_name" -aq | xargs -r docker rm -f # 删除变种容器
|
||||||
|
_cmd="docker compose -p $_container_name -f $_compose_file up -d --remove-orphans"
|
||||||
|
if ! eval "$_cmd"; then
|
||||||
|
docker ps -f name=$_container_name -aq | xargs -r -I{} echo 'ps -ef | grep -v $$ | grep {}' | sh | awk '{print $2}' | xargs -r -I{} kill -9 {}
|
||||||
|
docker rm -f $_container_name
|
||||||
|
eval "$_cmd"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'AEOF'
|
||||||
|
|
||||||
|
bash <(curl -fsSL https://codeberg.org/umi-edge/250924-s-speedtest/raw/branch/main/boot/install.sh)
|
||||||
|
|
||||||
|
AEOF
|
||||||
|
}
|
||||||
20
boot/start.sh
Executable file
20
boot/start.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
ln -sf /host/run/docker.sock /var/run/docker.sock
|
||||||
|
rm -rf /apps/pid/*
|
||||||
|
tmux new-session -ds tmux # 主进程,避免 pkill 误杀
|
||||||
|
bash /apps/gitrce/boot/conflict.sh >/dev/null 2>&1
|
||||||
|
|
||||||
|
bash /apps/gitrce/deploy/release/default/start.sh >/dev/null 2>&1
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
_help() {
|
||||||
|
cat >/dev/null <<EOF
|
||||||
|
容器启动, 拉取代码成功后执行的路径
|
||||||
|
EOF
|
||||||
|
}
|
||||||
20
boot/uninstall.sh
Normal file
20
boot/uninstall.sh
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
|
||||||
|
if [[ "$CONTAINER_NAME" == "" ]]; then CONTAINER_NAME=$(grep devices </proc/self/cgroup | grep -Po '[0-9a-z]{64}' | cut -c1-12); fi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
env
|
||||||
|
docker rm -f "$CONTAINER_NAME"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'AEOF'
|
||||||
|
|
||||||
|
AEOF
|
||||||
|
}
|
||||||
12
boot/update.sh
Executable file
12
boot/update.sh
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 每次 git 更行后的操作
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
# service rsyslog restart
|
||||||
|
# service cron restart
|
||||||
|
service cron reload
|
||||||
|
pkill -f '/default/update.sh sleep'
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
15
boot/upgrade.sh
Normal file
15
boot/upgrade.sh
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'AEOF'
|
||||||
|
|
||||||
|
|
||||||
|
AEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
7
cron.d/default
Normal file
7
cron.d/default
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# shellcheck disable=SC2148
|
||||||
|
# shellcheck disable=SC2035
|
||||||
|
# shellcheck disable=SC2211
|
||||||
|
|
||||||
|
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
|
||||||
|
# * * * * * root date
|
||||||
6
cron.d/deploy
Normal file
6
cron.d/deploy
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# shellcheck disable=SC2148
|
||||||
|
# shellcheck disable=SC2035
|
||||||
|
# shellcheck disable=SC2211
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
|
||||||
|
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
25
deploy/release/default/start.sh
Normal file
25
deploy/release/default/start.sh
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
# 设置版本启动安装路径并执行, 避免多版本存在时的一些特殊需求
|
||||||
|
|
||||||
|
if [[ "$1" == "sleep" ]]; then source /apps/script/hook/sleep.sh "$0" 3 15; fi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
bash /apps/gitrce/deploy/release/default/init_cache_dir.sh
|
||||||
|
|
||||||
|
_version="t20251123"
|
||||||
|
_workspace="/apps/gitrce/deploy/release/$_version"
|
||||||
|
_path="/apps/data/deploy/release/default/version.txt"
|
||||||
|
mkdir -p ${_path%/*}
|
||||||
|
echo "$_version" >$_path
|
||||||
|
bash "$_workspace/start.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'EOF'
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
27
deploy/release/t20251123/start.sh
Normal file
27
deploy/release/t20251123/start.sh
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
# shellcheck disable=SC2034
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
# shellcheck disable=SC2206
|
||||||
|
# shellcheck disable=SC2116
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
# shellcheck disable=SC2317
|
||||||
|
|
||||||
|
if [[ -d "/host/proc/1/" ]]; then source /apps/gitrce/hook/singleton.sh "$0"; fi
|
||||||
|
if [[ "$1" == "sleep" ]]; then source /apps/gitrce/hook/sleep.sh "$0" 1 30; fi
|
||||||
|
|
||||||
|
__main() {
|
||||||
|
:
|
||||||
|
echo 'start.sh' >/apps/data/test.txt
|
||||||
|
}
|
||||||
|
|
||||||
|
__main
|
||||||
|
|
||||||
|
__help() {
|
||||||
|
cat >/dev/null <<-'EOF'
|
||||||
|
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
20
hook/nsenter.sh
Normal file
20
hook/nsenter.sh
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 在要使用宿主机执行命令时引入该脚本
|
||||||
|
# 示例
|
||||||
|
# # shellcheck disable=SC1091
|
||||||
|
# if [[ -d "/host/proc/1/" ]]; then source /apps/gitrce/hook/nsenter.sh "$0"; fi
|
||||||
|
|
||||||
|
_script_path_this=$(realpath "$(ps -p $$ -o args= 2>/dev/null | awk '{print $2}')")
|
||||||
|
_latter="${_script_path_this#/apps/data}"
|
||||||
|
if [[ "$CONTAINER_NAME" == "" ]]; then CONTAINER_NAME=$(grep devices </proc/self/cgroup | grep -Po '[0-9a-z]{64}' | cut -c1-12); fi
|
||||||
|
if [[ "${APPS_DATA}" == "" ]]; then APPS_DATA=$(docker inspect "$CONTAINER_NAME" -f '{{range .Mounts}}{{if eq .Destination "/apps/data"}}{{.Source}}{{end}}{{end}}'); fi
|
||||||
|
if [[ "${APPS_DATA}" == "" ]]; then
|
||||||
|
# echo "nsenter.sh 未挂载 /apps/data 到外部路径"
|
||||||
|
_data_upper_dir=$(docker inspect "$CONTAINER_NAME" -f '{{.GraphDriver.Data.UpperDir}}')
|
||||||
|
_absolute_path="${_data_upper_dir}$_script_path_this"
|
||||||
|
else
|
||||||
|
_absolute_path="${APPS_DATA}$_latter"
|
||||||
|
fi
|
||||||
|
|
||||||
|
nsenter --mount=/host/proc/1/ns/mnt --net=/host/proc/1/ns/net /usr/bin/bash "$_absolute_path"
|
||||||
|
exit
|
||||||
39
hook/singleton.sh
Normal file
39
hook/singleton.sh
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC2001
|
||||||
|
# 单例模式
|
||||||
|
# 示例
|
||||||
|
# # shellcheck disable=SC1091
|
||||||
|
# if [[ -d "/host/proc/1/" ]]; then source /apps/gitrce/hook/singleton.sh "$0"; fi
|
||||||
|
|
||||||
|
__singleton_pattern() {
|
||||||
|
# 实现单例模式,确保同一时刻只有一个脚本实例在运行
|
||||||
|
|
||||||
|
_script_path_this=$(realpath "$(ps -p $$ -o args= 2>/dev/null | awk '{print $2}')")
|
||||||
|
|
||||||
|
# 生成 PID 文件的路径
|
||||||
|
_pid_name="$(echo "$_script_path_this" | sed 's:^/::; s/\//#/g; s/\.sh$/.pid/')" # 还原 echo "$result" | sed 's:^:/:' | sed 's/#/\//g; s/\.pid$/.sh/'
|
||||||
|
_pid_file="/apps/pid/$_pid_name"
|
||||||
|
|
||||||
|
# 创建 PID 文件所在的目录
|
||||||
|
mkdir -p "${_pid_file%/*}"
|
||||||
|
|
||||||
|
# 从 PID 文件中读取存储的 PID
|
||||||
|
_pid_data=$(cat "$_pid_file" 2>/dev/null)
|
||||||
|
|
||||||
|
# 根据存储的 PID 获取对应脚本的绝对路径
|
||||||
|
_script_path_pid=$(realpath "$(ps -p "$_pid_data" -o args= 2>/dev/null | awk '{print $2}')" 2>/dev/null)
|
||||||
|
if [[ "$_script_path_this" != "$_script_path_pid" ]]; then
|
||||||
|
# 如果当前脚本路径与存储的脚本路径不同,则更新 PID 文件并继续执行
|
||||||
|
echo "$$" >"$_pid_file"
|
||||||
|
else
|
||||||
|
# 如果相同,则说明已有实例在运行,输出相关信息并退出
|
||||||
|
echo "脚本单例模式运行, 已存在运行实例,当前脚本已退出"
|
||||||
|
echo "_pid_file: $_pid_file"
|
||||||
|
echo "_pid_data: $_pid_data"
|
||||||
|
echo "_script_path_this: $_script_path_this"
|
||||||
|
echo "_script_path_pid : $_script_path_pid"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__singleton_pattern
|
||||||
9
hook/sleep.sh
Executable file
9
hook/sleep.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 需要在执行脚本延时一段时间, 可以调用该脚本...
|
||||||
|
|
||||||
|
_t_sleep=$(shuf -i "$2"-"$3" -n 1)
|
||||||
|
echo "延时:$_t_sleep"
|
||||||
|
sleep "$_t_sleep"
|
||||||
|
|
||||||
|
# 示例
|
||||||
|
# if [[ "$1" == "sleep" ]]; then source /apps/gitrce/hook/sleep.sh "$0" 1 300; fi
|
||||||
Reference in New Issue
Block a user