整理收集
该章节介绍一下
这里使用的是:
svn
sudo apt update
sudo apt install subversion
# 安装完成,检测一下
svn
svn help
svnadmin help
# 新建一个空文件夹,这里是:/home/ddz/1-code/svn/repository
# 如果文件非空,会报错
# 不用 sudo 也可以
sudo svnadmin create /home/ddz/1-code/svn/repository
sudo chmod 777 -R /home/ddz/1-code/svn/repository
配置文件在仓储目录中的
在这里配置用户民和密码
[users]
# harry = harryssecret
# sally = sallyssecret
all1 = all1666
all2 = all2666
f1 = f1666
f2 = f2666
b1 = b1666
b2 = b2666
在这里配置哪些用户可以可读、可写哪些目录,支持根据角色授权
[groups]
all = all1,all2
f = f1,f2
b = b1,b2
[/]
@all = rw
* = r
[/python]
@all = rw
@b = rw
@f = r
* = r
[/web]
@all = rw
@f = rw
@b = r
* = r
这里应该算是仓储的入口配置文件,其中 password-db 指向上面的 passwd 文件,authz-db 指向上面的 authz 文件
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
如果你也有这样的习惯:原来的配置文件不动,将这些添加到最后。你一定要注意,这四个配置属于
这里是错误的示范,
在这种配置之下,用户获取代码时,不用输入用户名和密码,直接可以获取代码。当然,想要修改之后签入代码也是不可能的
导入两个示例项目:基于 fastapi 的 python 项目和前端类库 a2bei4 项目。代码给你准备好了,你可以点击下载:fastapi-demo、a2bei4
svn import /home/ddz/桌面/fastapi-demo file:///home/ddz/1-code/svn/repository/python/fastapi-demo -m "添加一个 Python 项目"
svn import /home/ddz/桌面/a2bei4 file:///home/ddz/1-code/svn/repository/web/a2bei4 -m "添加前端项目 a2bei4"
svnserve -d -r /home/ddz/1-code/svn/repository --listen-port 3690
# 查看服务
ps -ef | grep svnserve
# 干掉他
killall svnserve
到这里,客户端再次尝试拉取代码就能弹出认证的弹窗了
这里选择的是
敬请期待……
之所以出现这种情况是:在命令行使用 svn 或者写一些 *.bat 批处理时(例如:
如果安装时没有选择
测试的项目是:前端类库 a2bei4 。上面已经提到。这里分别在两个文件夹都拉去了上文中初始化的基于 fastapi 的 python 项目和前端类库 a2bei4 项目,来模拟两个用户,一个用户修改 a2bei4 项目,另一个用户执行 .bat 文件(拉取更新、安装依赖和构建)
@echo off
setlocal
:: 1、进入项目目录
cd /d E:\DDZ\svn\user2\web\a2bei4
:: 2、拉取更新
:: 时间戳
set "timestamp=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%%time:~9,2%"
set "timestamp=%timestamp: =0%"
:: 开始拉取更新并将输出信息写入到 *.txt 临时文件
svn update . > "%timestamp%.txt"
:: 3、更新中是否包含 package.json 文件
:: 读取文件并逐行判断,如果存在,直接跳出循环
set "PACKAGE_JSON_CHANGED=false"
for /f "delims=" %%a in ('type "%timestamp%.txt"') do (
if /i "%%a" neq "" (
echo %%a | findstr /i "package.json" >nul && (
set PACKAGE_JSON_CHANGED=true
goto :check_done
)
)
)
:check_done
:: 删除 *.txt 临时文件
del /q "%timestamp%.txt"
:: 4、根据 package.json 是否被修改执行相应操作
if "%PACKAGE_JSON_CHANGED%" == "true" (
echo 》》》》》》 package.json has changed. Cleaning up...
if exist node_modules (
echo 》》》》》》 node_modules exists. delete node_modules...
rd /s /q node_modules
)
echo 》》》》》》 Installing dependencies...
call npm install
echo 》》》》》》 build project...
call npm run c
) else (
echo package.json has not changed.
if not exist node_modules (
echo 》》》》》》 node_modules does not exist. Installing dependencies...
call npm install
echo 》》》》》》 build project...
call npm run c
) else (
echo 》》》》》》 node_modules exists. build project...
call npm run c
)
)
echo.
pause
endlocal
这个钩子还是挺重要的,好多都是从他这里触发的
用户提交更新之后,这里稍作判断,发送 HTTP 请求通知
REPOS="$1"
REV="$2"
TXN_NAME="$3"
LOG_FILE="/home/ddz/1-code/svn/repository/log/post-commit.log" # 定义日志文件路径
# 记录提交信息到日志文件
echo "》》》》》》监听到提交,信息如下:" >> $LOG_FILE
echo "REPOS: $REPOS" >> $LOG_FILE
echo "REV: $REV" >> $LOG_FILE
echo "TXN_NAME: $TXN_NAME" >> $LOG_FILE
echo " " >> $LOG_FILE
# 遍历提交的文件列表并记录到日志文件
echo "变化的文件如下:" >> $LOG_FILE
svnlook changed -r $REV $REPOS >> $LOG_FILE
echo " " >> $LOG_FILE
# 检查本次提交中是否包含 vue 项目的变更
if svnlook changed -r $REV $REPOS | grep 'web/a2bei4'; then
# 使用 cURL 发送 GET 请求通知 Jenkins 构建 a2bei4 项目
echo "Calling Jenkins to build a2bei4..." >> $LOG_FILE
curl -u admin:admin666 -X GET http://192.168.xxx.xxx:9966/job/task-001/build?token=user2-a2bei4 >> $LOG_FILE
fi
echo " " >> $LOG_FILE
echo " " >> $LOG_FILE
echo " " >> $LOG_FILE
一些简单的逻辑放在
下面是
REPOS="$1"
REV="$2"
TXN_NAME="$3"
SVN_CHANGED=$(svnlook changed -r $REV $REPOS)
# 执行 Python 脚本并传递参数
python3 /home/ddz/1-code/svn-post-commit/main.py "$REPOS" "$REV" "$TXN_NAME" "$SVN_CHANGED"
需要注意一下:
在看一下 python 脚本的内容
import os
import sys
import time
import datetime
# 接收参数
REPOS = sys.argv[1]
REV = sys.argv[2]
TXN_NAME = sys.argv[3]
SVN_CHANGED = sys.argv[4]
log_list = [
f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')} 》》》》》》监听到提交,信息如下:\n",
f"REPOS :{REPOS}\n",
f"REV :{REV}\n",
f"TXN_NAME :{TXN_NAME}\n",
"变更的文件列表:\n",
str(SVN_CHANGED)
]
timestamp = time.time()
file_name = str(int(timestamp)) + ".txt"
file_path = os.path.dirname(os.path.abspath(__file__)) + "/" + file_name
with open(file_path,"w",encoding='utf-8') as f:
f.writelines(log_list)
这里为了方便测试,直接将 *.txt 文件放在同一目录了,需要注意一下,该目录是否有写入权限