dockerの下でsvnのhookを使用して簡略版の自動配置を実現
6138 ワード
1.背景
ネット上では、svnの下でhooksを使用して自動化された導入を実現する方法について多くの記事があります.この文書では、docker環境の具体的な実装(docker以外の実装方法も含む)に関する環境について重点的に説明します.
2.SVNの構成変更
2.1.ミラーリング
[docker pull docker.io/elleflorio/svn-server:latest]からsvnのミラーをダウンロードするか、他のミラーをダウンロードして、公式の説明に従ってデバッグします.
2.2.コンフィギュレーション
2.2.1.SVNローカルディレクトリ構造
/XX/svnのディレクトリ構造:
ubuntu@VM:~/svn$ ls -lrt
total 24
-rw-rw-r-- 1 ubuntu ubuntu 384 May 11 22:17 dav_svn.conf
-rw-rw-r-- 1 ubuntu ubuntu 125 May 11 22:24 passwd.conf
-rw-rw-r-- 1 ubuntu ubuntu 1142 May 11 22:26 auth.conf
drwxr-xr-x 6 root root 4096 May 11 22:26 seventy
-rwxrwxr-x 1 ubuntu ubuntu 381 Jun 6 10:59 start.sh
ここでseventyディレクトリは、コンテナの実行前に手動で作成し、svnコンテナでsvnライブラリ作成コマンドを実行する必要があります.このディレクトリにはsvnのライブラリデータのみが格納されます.他のいくつかの文書は以下のように説明されています.
LoadModule dav_svn_module /usr/lib/apache2/mod_dav_svn.so
LoadModule authz_svn_module /usr/lib/apache2/mod_authz_svn.so
DAV svn
SVNParentPath /home/svn
SVNListParentPath On
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /home/svn/passwd.conf
AuthzSVNAccessFile /home/svn/auth.conf
Require valid-user
これはapacheに対するhttp構成です.具体的な構成の説明では、私のもう一つのlinux+httpd+svnを参照してhttpアクセスとパスワードの変更を実現できます.ポイントは、AuthUserFileとAuthzSVNAccessFileです.パスは/home/svnディレクトリを指し、このディレクトリはホストにマウントされます.したがって、/home/svn/passwd.confは/XX/svn/passwd.conf,同理auth.conf.
ubuntu@VM:~/svn$ cat passwd.conf
view:$apr1$/iL9B/Dn$UMyhxjh04gmtN7qSbo/K20
このファイルはsvnコマンドhtpasswdで生成する必要があります.手動で作成しないでください.
[reps:/]
view=r
svnを表すURLの/svn/repsディレクトリはviewユーザーに読み取り専用権限を開放します.読者は実際の状況に応じて配置することができる.
#!/bin/bash
#
# svn app /home/svn /home/app
docker run --name svns \
-v /XX/svn:/home/svn \
-v /XX/app:/home/app \
-h svns \
-p 3380:80 \
-p 3360:3960 \
-m 305m \
-d docker.io/elleflorio/svn-server:latest
#
docker exec -d svns sh -c "cp /home/svn/dav_svn.conf /etc/apache2/conf.d/dav_svn.conf && chown -R apache:apache /home/app/"
説明:1)コンテナを起動するときに指定したパラメータは、elleflorio/svn-serverの公式説明を参照することもできます.他のミラーの場合は、その具体的なパラメータの説明を参照してください.2)次の2つの-vパラメータを重点的に説明します.前者はsvn独自のライブラリファイル、構成を格納するためのディレクトリで、後者はappを格納するためのプログラムコードまたは構成で、次の節で詳しく説明します.3)最後のcpコマンドは,コンテナに既に存在するhttpd構成を上書きし,/home/appディレクトリを変更する所属者をapacheユーザとする.
ポイント:svnコンテナで実際に実行する場合は、コンテナのデフォルトのrootユーザーではなく、apacheユーザーによってsvn関連操作を実行する必要があります.apacheユーザーが/home/appディレクトリにファイルを書く権限があることを保証する必要があります.いいえ、後期のhooksは実行時にエラーが発生します.
2.2.2.フック本
前述の操作が完了したら、svnをオンにしたとします.http://3380/svn/repsでsvnライブラリにアクセスできます(ブラウザで検証をテストできます).次に、本格的な自動化導入の実装を開始します.
svn co http://localhost:80/svn/reps /home/app/ --username 'view' --password 'xxxxxx'
上記はsvnコンテナで実行し、ホストで実行する場合はIPとポートを修正する必要がある.いずれにしても、デフォルトのファイルの所属者の多くはapacheではないため、coが完了した後、【chown-R apache:apache/home/app/】を実行することを覚えておいてください.cd /home/svn/reps/hooks
cp post-commit.tmpl post-commit
chown apache:apache post-commit # ,
chmod u+x post-commit
touch /home/svn/hooks_commit.log # hook
chown apache:apache /home/svn/hooks_commit.log
post-commitファイル内容:##
TXN_NAME="$3"
# mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
logs="/home/svn/hooks_commit.log" ## apache:apache ,
echo "${REPOS},${REV},${TXN_NAME}" >> ${logs}
export LANG=en_US.utf8
SVN_PATH="/usr/bin/svn"
APP_PATH="/home/app/"
${SVN_PATH} update ${APP_PATH} --username 'view' --password 'xxxxxx' --no-auth-cache 1>>${logs} 2>&1
echo "Updated. ${APP_PATH}" >> ${logs}
ここではsvnのupdateに重点を置き、前述のsvnのco形成前後に呼応する.post-commitスクリプトに問題があるかどうかを手動で確認できますsu -s /bin/sh -c '/home/svn/reps/hooks/post-commit' apache
もちろんこの実行はsvnコンテナで、apacheユーザーと/bin/shというshell(ミラーにbashがある場合は置き換えても使用できます)を使用してpost-commitというスクリプトを実行し、hooks_commit.logに異常エラーが表示されていない場合は、問題はないはずです.svn: E155004: Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)
svn: E155004: Failed to lock working copy '/home/app'.
svn: E200031: sqlite[S8]: attempt to write a readonly database
svn: E200042: Additional errors:
svn: E200031: sqlite[S8]: attempt to write a readonly database
/home/appバージョンの所属者がapacheではないことを示しますので、chownで修正してください.3.appの適用
アプリケーションappには、python 3で適切なミラーをダウンロードしたと仮定するものがいくつかあります.6+django2.0.5ミラーを例に、appミラーのstartを起動する.sh
#!/bin/bash
#
docker run --name app \
-v /XX/app:/datavol \
-h appserver \
-p 8089:8089 \
-m 500m \
--entrypoint /datavol/entrypoint-docker.sh \ #
-d py365django205:latest # app
そのうち/XX/app/entrypoint-docker.shスクリプトは次のとおりです.
#!/bin/sh
tail -f /dev/null
コンテナを停止させないだけで、もちろん自分の起動スクリプトを書くこともできます.djangoではmanageを使用する.py runserver方式で起動すると、プログラムコードが更新されるとdjangoサーバが自動的に再起動します.他のプログラムでは、読者は関連ドキュメントを参照して、サーバのステータスを自動的に更新する合理的な方法を見つけることができます.
4.完了
これで、すべての構成が完了しました.コードを開発してsvn(http://xxx:xx/svn/reps/)が完了すると、svnコンテナはpost-commitスクリプトをアクティブに実行し、/XX/app/ディレクトリの下で対応するエンジニアリングコードをアクティブに更新し、最後にappコンテナを適用して自動的にサービスを再起動し、最終的に最も簡素な自動化配置の目的を達成します.
核心思想:ホストの/XX/appディレクトリを通じてsvnコンテナとappコンテナ間のコードの共有を実現し、生産者-消費者関係を形成する./XX/appディレクトリにはapacheユーザー権限が必要です.