SVN服务器建站笔记(一):公司SVN服务器部署,一版本多仓库、多版本多仓库和客户端测试
SVN服务器建站笔记一公司SVN服务器部署一版本多仓库、多版本多仓库和客户端测试引言版本控制的基石在软件开发团队中版本控制是协作的基石。SVNSubversion作为经典的集中式版本控制系统以其简单、稳定、权限管理清晰等特点在许多公司中仍然占据重要地位。本文将从零开始带你掌握SVN服务器部署的核心技巧包括一版本多仓库和多版本多仓库两种架构并完成客户端测试。## 基础概念理解SVN架构在动手之前我们需要先理解SVN的核心概念。SVN采用客户端-服务器架构所有代码和历史记录存储在中央仓库中。仓库Repository是存储所有版本数据的核心而工作副本Working Copy是开发者在本地操作的代码目录。### 为什么需要多仓库-一版本多仓库同一个SVN版本下管理多个独立项目适用于项目之间无依赖关系的场景。-多版本多仓库不同版本如开发版、测试版、稳定版分别管理适用于需要并行开发多个版本的公司。## 环境准备我们将使用以下环境- 操作系统Ubuntu 20.04 LTS- SVN版本Subversion 1.13.0- 客户端TortoiseSVNWindows### 安装SVN服务器bash# 更新包管理器sudo apt update# 安装Apache和SVN模块sudo apt install apache2 apache2-utils subversion libapache2-mod-svn -y# 启动Apache服务sudo systemctl start apache2sudo systemctl enable apache2## 一、一版本多仓库部署### 创建仓库目录结构bash# 创建SVN根目录sudo mkdir -p /var/svn/repos# 创建三个独立仓库sudo svnadmin create /var/svn/repos/project_asudo svnadmin create /var/svn/repos/project_bsudo svnadmin create /var/svn/repos/project_c# 设置权限sudo chown -R www-data:www-data /var/svn/repossudo chmod -R 775 /var/svn/repos### 配置Apache虚拟主机apache# 编辑配置文件/etc/apache2/sites-available/svn.confVirtualHost *:80 ServerName svn.example.com # SVN仓库根目录 Location /svn DAV svn SVNParentPath /var/svn/repos AuthType Basic AuthName SVN Repository AuthUserFile /etc/apache2/dav_svn.passwd Require valid-user # 允许所有仓库访问 SVNListParentPath on /Location ErrorLog ${APACHE_LOG_DIR}/svn_error.log CustomLog ${APACHE_LOG_DIR}/svn_access.log combined/VirtualHost### 创建用户认证bash# 创建用户文件并添加用户sudo htpasswd -c /etc/apache2/dav_svn.passwd dev_user1sudo htpasswd /etc/apache2/dav_svn.passwd dev_user2# 启用站点sudo a2ensite svn.confsudo systemctl reload apache2## 二、多版本多仓库部署### 版本管理策略对于多版本场景我们采用目录隔离策略每个版本对应一个独立仓库。bash# 创建版本目录结构sudo mkdir -p /var/svn/versions# 创建不同版本的仓库sudo svnadmin create /var/svn/versions/v1.0sudo svnadmin create /var/svn/versions/v2.0sudo svnadmin create /var/svn/versions/dev# 设置仓库钩子post-commit用于版本控制sudo nano /var/svn/versions/dev/hooks/post-commit### 版本仓库钩子脚本bash#!/bin/bash# post-commit钩子提交后自动同步到测试环境REPOS$1REV$2LOG_FILE/var/log/svn_sync.log# 记录提交信息echo [$(date)] Repository: $REPOS, Revision: $REV $LOG_FILE# 如果提交到dev仓库触发测试环境更新if [ $REPOS /var/svn/versions/dev ]; then # 执行测试环境更新脚本 /usr/local/bin/sync_test_env.sh $REV fiexit 0### 高级权限控制apache# 多版本配置示例Location /svn/versions DAV svn SVNParentPath /var/svn/versions AuthType Basic AuthName SVN Multi-Version AuthUserFile /etc/apache2/dav_svn.passwd Require valid-user # 版本访问控制 LimitExcept GET PROPFIND OPTIONS REPORT Require group developers /LimitExcept/Location## 三、客户端测试### Python自动化测试脚本python#!/usr/bin/env python3# -*- coding: utf-8 -*-SVN客户端测试脚本测试一版本多仓库和多版本多仓库的访问import subprocessimport sysimport osdef test_svn_connection(repo_url, username, password): 测试SVN仓库连接 Args: repo_url: SVN仓库URL username: SVN用户名 password: SVN密码 Returns: bool: 连接是否成功 try: # 使用svn info命令测试连接 cmd [ svn, info, --username, username, --password, password, --non-interactive, --trust-server-cert-failuresunknown-ca, repo_url ] # 执行命令并捕获输出 result subprocess.run( cmd, capture_outputTrue, textTrue, timeout30 ) if result.returncode 0: print(f✓ 成功连接到仓库: {repo_url}) print(f 仓库路径: {result.stdout}) return True else: print(f✗ 连接失败: {repo_url}) print(f 错误信息: {result.stderr}) return False except subprocess.TimeoutExpired: print(f✗ 连接超时: {repo_url}) return False except Exception as e: print(f✗ 发生错误: {e}) return Falsedef test_svn_operations(repo_url, username, password): 测试SVN基本操作检出、添加、提交 Args: repo_url: SVN仓库URL username: SVN用户名 password: SVN密码 # 创建临时工作目录 work_dir f/tmp/svn_test_{int(time.time())} os.makedirs(work_dir, exist_okTrue) try: # 检出仓库 print(f\n 正在检出仓库到 {work_dir}) checkout_cmd [ svn, checkout, --username, username, --password, password, --non-interactive, repo_url, work_dir ] subprocess.run(checkout_cmd, checkTrue, capture_outputTrue) # 创建测试文件 test_file os.path.join(work_dir, test_file.txt) with open(test_file, w) as f: f.write(SVN测试文件 - 创建于 time.ctime()) # 添加文件到版本控制 add_cmd [svn, add, test_file] subprocess.run(add_cmd, checkTrue, capture_outputTrue) # 提交更改 commit_msg 测试提交添加测试文件 commit_cmd [ svn, commit, -m, commit_msg, --username, username, --password, password, --non-interactive, work_dir ] commit_result subprocess.run(commit_cmd, checkTrue, capture_outputTrue) print(f✓ 提交成功: {commit_result.stdout.decode()}) print(f 提交信息: {commit_msg}) except subprocess.CalledProcessError as e: print(f✗ 操作失败: {e.stderr.decode()}) except Exception as e: print(f✗ 发生错误: {e}) finally: # 清理临时目录 if os.path.exists(work_dir): subprocess.run([rm, -rf, work_dir])if __name__ __main__: import time # 测试配置 TEST_CONFIG { server_url: http://svn.example.com/svn, username: dev_user1, password: test123 } print( * 50) print(SVN服务器测试开始) print( * 50) # 测试一版本多仓库 print(\n 测试一版本多仓库) test_svn_connection( f{TEST_CONFIG[server_url]}/project_a, TEST_CONFIG[username], TEST_CONFIG[password] ) # 测试多版本多仓库 print(\n 测试多版本多仓库) test_svn_connection( fhttp://svn.example.com/svn/versions/dev, TEST_CONFIG[username], TEST_CONFIG[password] ) # 执行完整操作测试 print(\n 执行完整操作测试) test_svn_operations( f{TEST_CONFIG[server_url]}/project_b, TEST_CONFIG[username], TEST_CONFIG[password] ) print(\n * 50) print(测试完成) print( * 50)### 命令行测试bash# 测试一版本多仓库svn list http://svn.example.com/svn/project_a --username dev_user1 --password test123# 测试多版本多仓库svn checkout http://svn.example.com/svn/versions/dev --username dev_user1 --password test123# 创建测试文件并提交echo Hello SVN test.txtsvn add test.txtsvn commit -m 首次提交 --username dev_user1 --password test123## 总结通过本文的实践我们完成了SVN服务器的两种部署架构1.一版本多仓库适用于管理多个独立项目每个项目拥有独立的仓库便于权限隔离和管理。2.多版本多仓库适用于需要并行开发多个版本的企业通过版本目录结构实现清晰的分支管理。关键要点- Apache SVN模块提供了强大的Web访问能力- 钩子脚本hooks可以实现自动化流程- 客户端测试确保了服务的可用性和稳定性- 合理规划仓库结构可以提升团队协作效率在实际生产环境中建议结合LDAP认证、SSL加密和定期备份构建更安全可靠的版本控制平台。下一篇文章将深入探讨SVN的权限管理、备份策略和性能优化。