dockerの下でsvnのhookを使用して簡略版の自動配置を実現

6138 ワード

1.背景


ネット上では、svnの下でhooksを使用して自動化された導入を実現する方法について多くの記事があります.この文書では、docker環境の具体的な実装(docker以外の実装方法も含む)に関する環境について重点的に説明します.
  • svnのdocker容器
  • 使用するdocker容器
  • ホストローカルディレクトリ
  • /XX/svn:svn関連構成、ライブラリデータの格納
  • /XX/app:アプリケーション関連のプログラム、構成を格納

  • 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のライブラリデータのみが格納されます.他のいくつかの文書は以下のように説明されています.
  • httpdのプロファイルdav_svn.conf:
  • 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.
  • SVNパスワード設定passwd.conf:
  • ubuntu@VM:~/svn$ cat passwd.conf
    view:$apr1$/iL9B/Dn$UMyhxjh04gmtN7qSbo/K20
    

    このファイルはsvnコマンドhtpasswdで生成する必要があります.手動で作成しないでください.
  • SVN権限構成auth.conf:
  • [reps:/]
    view=r
    

    svnを表すURLの/svn/repsディレクトリはviewユーザーに読み取り専用権限を開放します.読者は実際の状況に応じて配置することができる.
  • コンテナ起動スクリプトstart.sh:
  • #!/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ライブラリにアクセスできます(ブラウザで検証をテストできます).次に、本格的な自動化導入の実装を開始します.
  • 先に/XX/appまたは/home/appの下でパッケージのコピーを作成する
    svn co http://localhost:80/svn/reps  /home/app/ --username 'view' --password 'xxxxxx'
    
    上記はsvnコンテナで実行し、ホストで実行する場合はIPとポートを修正する必要がある.いずれにしても、デフォルトのファイルの所属者の多くはapacheではないため、coが完了した後、【chown-R apache:apache/home/app/】を実行することを覚えておいてください.
  • フックpost-commitを作成する./home/svn/reps/hooksのpost-commit.tmplは1部コピーし、post-commit:
    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に異常エラーが表示されていない場合は、問題はないはずです.
  • hooksを検証【tail-f/home/svn/hooks_commit.log】してから、svnライブラリで勝手にファイルを更新して、ログファイルが更新されているかどうかを見て、エラーがあれば修正します.
  • よくある異常
    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ユーザー権限が必要です.