案例1:Subversion基本操做
案例2:使用Subversion協同工做
案例3:製做nginx的RPM包
1 案例1:Subversion基本操做
1.1 問題html
本案例要求先快速搭建好一臺Subversion服務器,並測試該版本控制軟件:
建立版本庫
導入初始化數據
檢出數據至用戶本地副本
對本地副本進行增刪改查等操做
1.2 方案nginx
使用YUM安裝subversion軟件,使用svn客戶端工具鏈接svnserver服務器並測試版本控制軟件。
1.3 步驟web
實現此案例須要按照以下步驟進行。
步驟一:安裝Subversion服務器vim
1)YUM安裝subversion軟件
[root@web1 ~]# yum -y install subversion
[root@web1 ~]# rpm -q subversion
2)建立版本庫
[root@web1 ~]# mkdir /var/svn/
[root@web1 ~]# svnadmin create /var/svn/project
[root@web1 ~]# ls /var/svn/project/
conf/ db/ format hooks/ locks/ README.txt
3)本地導入初始化數據
[root@web1 ~]# cd /usr/lib/systemd/system/
[root@web1 ~]# svn import . file:///var/svn/project/ -m "Init Data"
4)修改配置文件,建立帳戶與密碼
[root@web1 ~]# vim /var/svn/project/conf/svnserve.conf
[general]服務器
anon-access = none
//19行,匿名無任何權限
auth-access = write
//20行,有效帳戶可寫app
password-db = passwd
//27行,密碼文件less
authz-db = authz
//34行,ACL訪問控制列表文件curl
[root@web1 ~]# vim /var/svn/project/conf/passwd
… …
[users]
harry = pass
//用戶名和密碼
tom = pass
//用戶名和密碼
[root@web1 ~]# cat /var/svn/project/conf/authz
[/] //定義ACL訪問控制
harry = rw //用戶對項目根路徑可讀可寫
tom = rwtcp
Store password unencrypted (yes/no)? yes //提示是否保存密碼
[root@web2 ~]# cd /tmp/code
[root@web2 code]# ls
[root@web2 code]# vim user.slice //挑選任意文件修改其內容
[root@web2 code]# svn ci -m "modify user" //將本地修改的數據同步到服務器
[root@web2 code]# svn update //將服務器上新的數據同步到本地
[root@web2 code]# svn info svn://192.168.2.100 //查看版本倉庫基本信息
[root@web2 code]# svn log svn://192.168.2.100 //查看版本倉庫的日誌
[root@web2 code]# echo "test" > test.sh //本地新建一個文件
[root@web2 code]# svn ci -m "new file" //提交失敗,該文件不被svn管理
[root@web2 code]# svn add test.sh //將文件或目錄加入版本控制
[root@web2 code]# svn ci -m "new file" //再次提交,成功
[root@web2 code]# svn mkdir subdir //建立子目錄
[root@web2 code]# svn rm timers.target //使用svn刪除文件
[root@web2 code]# svn ci -m "xxx" //提交一次代碼
[root@web2 code]# vim umount.target //任意修改本地的一個文件
[root@web2 code]# svn diff //查看全部文件的差別
[root@web2 code]# svn diff umount.target //僅查看某一個文件的差別
[root@web2 code]# svn cat svn://192.168.2.100/reboot.target //查看服務器文件的內容
[root@web2 code]# sed -i 'd' tmp.mount
//刪除文件全部內容,但未提交
[root@web2 code]# svn revert tmp.mount
//還原tmp.mount文件
[root@web2 code]# rm -rf *.target
//任意刪除若干文件
[root@web2 code]# svn update
//還原
[root@web2 code]# sed -i '1a #test###' tuned.service
//修改本地副本中的代碼文件
[root@web2 code]# svn ci -m "xxx"
//提交代碼
[root@web2 code]# svn merge -r7:2 tuned.service
//將文件從版本7還原到版本2
使用svn命令測試svnserver服務時可使用的命令列表如表-1所示。
表-1 svn命令列表ide
2 案例2:使用Subversion協同工做
2.1 問題
沿用練習一,經過svn工具,對subversion版本庫進行多人協同工做測試,要求以下:
該版本庫支持多個帳戶同時協做編輯文件
測試演示多人協做編輯的具體操做
手動解決版本衝突問題
備份版本庫數據
2.2 方案
使用svn客戶端工具鏈接subversion服務器並測試多人協同工做以及如何手動解決衝突問題,帳戶名稱分別爲harry和tom,最後使用svnadmin dump指令對版本庫進行備份工做。
2.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:多人協同工做
1)遠程鏈接兩個終端,每一個人下載代碼本地副本,注意web1(192.168.2.100)和web2(192.168.2.200)表明了兩個不一樣的主機,看清楚操做是在哪一臺計算機上執行!
[root@web1 ~]# cd /tmp
[root@web1 ~]# svn --username harry --password pass \
co svn://192.168.2.100/project mycode
[root@web2 ~]# cd /tmp
[root@web2 ~]# svn --username tom --password pass \
co svn://192.168.2.100/project mycode
[root@web1 ~]# cd mycode
[root@web2 ~]# cd mycode
2) harry和tom修改不一樣的文件
[root@web1 mycode]# sed -i "3a ###harry modify#####" tmp.mount
[root@web1 mycode]# svn ci -m "has modified"
[root@web2 mycode]# sed -i "3a ###tom modify#####" umount.target
[root@web2 mycode]# svn ci -m "has modified"
[root@web2 mycode]# svn update
[root@web1 mycode]# svn update
3)harry和tom修改相同文件的不一樣行
[root@srv5 ~]# cd harry
[root@web1 mycode]# sed -i "3a ###harry modify#####" user.slice
[root@web1 mycode]# svn ci -m "modified"
[root@web2 mycode]# sed -i "6a ###tom modify#####" user.slice
[root@web2 mycode]# svn ci -m "modified" //提交失敗
Sending svnserve
Transmitting file data .svn: Commit failed (details follow):
svn: File '/user.slice' is out of date(過時)
[root@web2 mycode]# svn update //提示失敗後,先更新再提交便可
[root@web2 mycode]# svn ci -m "modified" //提交成功
Sending user.slice
Transmitting file data .
4) harry和tom修改相同文件的相同行
[root@web1 mycode]# sed -i '1c [UNIT]' tuned.service
[root@web1 mycode]# svn ci -m "modified"
[root@web2 mycode]# sed -i '1c [unit]' tuned.service
[root@web2 mycode]# svn ci -m "modified"
Sending tuned.service
Transmitting file data .svn: Commit failed (details follow):
svn: File '/tuned.service' is out of date(過時)
[root@web2 mycode]# svn update //出現衝突,須要解決
Conflict discovered in 'tuned.service'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:p //選擇先標記p,隨後解決
[root@web2 mycode]# ls
tuned.service tuned.service.mine tuned.service.r10 tuned.service.r9
[root@web2 mycode]# mv tuned.service.mine tuned.service
[root@web2 mycode]# rm -rf tuned.service.r10 tuned.service.r9
[root@web2 mycode]# svn ci -m "modified" //解決衝突
步驟二:使用dump指令備份版本庫數據
[root@web1 ~]# svnadmin dump /var/svn/project > project.bak //備份
本案例使用nginx-1.12.2版本的源碼軟件,生產對應的RPM包軟件,具體要求以下:
軟件名稱爲nginx
軟件版本爲1.12.2
RPM軟件包能夠查詢描述信息
RPM軟件包能夠安裝及卸載
3.2 方案
安裝rpm-build軟件包,編寫SPEC配置文件,建立新的RPM軟件包。
配置文件中的描述信息如表-2:
表-2 SPEC描述信息
3.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:安裝rpm-build軟件
1)安裝rpm-build軟件包
[root@web1 ~]# yum -y install rpm-build
2)生成rpmbuild目錄結構
[root@web1 ~]# rpmbuild -ba nginx.spec //會報錯,沒有文件或目錄
[root@web1 ~]# ls /root/rpmbuild //自動生成的目錄結構
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
3)準備工做,將源碼軟件複製到SOURCES目錄
[root@web1 ~]# cp nginx-1.12.2.tar.gz /root/rpmbuild/SOURCES/
4)建立並修改SPEC配置文件
[root@web1 ~]# vim /root/rpmbuild/SPECS/nginx.spec
Name:nginx
Version:1.12.0
Release: 10
Summary: Nginx is a web server software.
License:GPL
URL: www.test.com
Source0:nginx-1.12.2.tar.gz
#BuildRequires:
#Requires:
%description
nginx [engine x] is an HTTP and reverse proxy server.
%prep
%setup –q //自動解壓源碼包,並cd進入目錄
%build
./configure
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
cp /root/rpmbuild/SPECS/nginx.sh %{buildroot}/usr/local/nginx/
##注意,cp非必須操做,注意,這裏是將一個腳本拷貝到安裝目錄,必須提早準備該文件
%files
%doc
/usr/local/nginx/* //對哪些文件與目錄打包
%changelog
步驟二:使用配置文件建立RPM包
1)安裝依賴軟件包
[root@web1 ~]# yum -y install gcc pcre-devel zlib-devel openssl-devel
2)rpmbuild建立RPM軟件包
[root@web1 ~]# rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec
[root@web1 ~]# ls /root/rpmbuild/RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
[root@web1 ~]# rpm -qpi RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
Name : nginx Relocations: (not relocatable)
Version : 1.12.2 Vendor: (none)
Release : 10 Build Date: Mon 02 May 2016 02:30:53 AM PDT
Install Date: (not installed) Build Host: localhost
Group : Applications/Internet Source RPM: nginx-1.8.0-1.src.rpm
Size : 721243 License: GPL
Signature : (none)
URL : www.nginx.org
Summary : Nginx is a web server software.
Description :
nginx [engine x] is an HTTP and reverse proxy server.
[root@web1 ~]# rpm -qpl nginx-1.12.2-10.x86_64.rpm
/usr
/usr/local
/usr/local/nginx
/usr/local/nginx/conf
/usr/local/nginx/conf/fastcgi.conf
/usr/local/nginx/conf/fastcgi.conf.default
/usr/local/nginx/conf/fastcgi_params
/usr/local/nginx/conf/fastcgi_params.default
/usr/local/nginx/conf/koi-utf
/usr/local/nginx/conf/koi-win
/usr/local/nginx/conf/mime.types
/usr/local/nginx/conf/mime.types.default
/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf.default
/usr/local/nginx/conf/scgi_params
/usr/local/nginx/conf/scgi_params.default
/usr/local/nginx/conf/uwsgi_params
/usr/local/nginx/conf/uwsgi_params.default
/usr/local/nginx/conf/win-utf
/usr/local/nginx/html
/usr/local/nginx/html/50x.html
/usr/local/nginx/html/index.html
/usr/local/nginx/logs
/usr/local/nginx/sbin
/usr/local/nginx/sbin/nginx
步驟三:安裝、卸載軟件
[root@web1 ~]# rpm -ivh RPMS/x86_64/nginx-1.12.2-10.x86_64.rpm
[root@web1 ~]# rpm -qa |grep nginx
[root@web1 ~]# /usr/local/nginx/sbin/nginx
[root@web1 ~]# curl http://127.0.0.1/