整理收集
该章节介绍一下
这里使用的是:
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 文件放在同一目录了,需要注意一下,该目录是否有写入权限