gitによるサイトのグループ開発-gitブランチからのサイトの自動作成/削除

この記事では、gitフックを使用してgitでサイトのグループ開発環境を作成する方法を示します。 この記事は経験豊富なシステム管理者向けに設計されており、アルゴリズムのみを説明します。

このトピックについてはすでに多くのことが議論されており、gitリポジトリでブランチを作成/削除するときにサイトを自動的に作成または削除する方法を追加します。 このような機会は、たとえば、さまざまなプログラマがサイトのさまざまな部分で作業し、さまざまなプラットフォーム(ブランチ)が必要な場合に役立ちます。 メインの開発とテストの後、メインブランチでマージが実行され、ブランチとテストサイトが削除またはアーカイブされます。







仕組み:デフォルトでは、メインサイトにアクセスできるマスターブランチが作成されます。 必要に応じて、プログラマはブランチ名を作成します。ブランチは、branchname.projectname.domain.ruで自動的に使用可能になります。 行われた変更はテストされ、メインブランチ(マスターまたはその他)にマージされます。 また、ブランチを削除すると、同じ名前のサイトが自動的に削除されます。



Gitセットアップ




gitリポジトリを作成し、factory.domain.ru / git / projectnameでその可用性を構成し、開発サーバーが動作するIPのパスワードなしで承認を許可します。 gitサーバーの構成は繰り返し説明されているため、この項目の詳細はスキップします。



gitフックを作成する




ファイル/ srv / git / projectname / hooks / post-updateを作成します(このスクリプトは、リポジトリに変更が加えられたときにサイトのコードを自動的に更新します。PROJECT変数には、プロジェクトの名前を割り当て、GIT_URLにはgitリポジトリへのリンクを割り当てます):

#!/bin/sh PATH=/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH PROJECT="projectname" GIT_URL="http://factory.domain.ru/git" git update-server-info if [ ! -f $1 ]; then exit 0 fi while [ -n "$1" ] do REF=`echo $1 | awk --field-separator="/" '{print $2}'` if [ $REF = "branches" -o $REF = "heads" ]; then BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'` if [ ! -d /srv/www/$PROJECT/repo/master ]; then mkdir -p /srv/www/$PROJECT/repo GIT_SSL_NO_VERIFY=true git clone $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/master fi if [ ! -d /srv/www/$PROJECT/repo/$BRANCH ]; then GIT_SSL_NO_VERIFY=true git clone -b $BRANCH $GIT_URL/$PROJECT /srv/www/$PROJECT/repo/$BRANCH else cd /srv/www/$PROJECT/repo/$BRANCH GIT_SSL_NO_VERIFY=true git fetch origin GIT_SSL_NO_VERIFY=true git reset --hard origin/$BRANCH GIT_SSL_NO_VERIFY=true git clean -d -f GIT_SSL_NO_VERIFY=true git checkout GIT_SSL_NO_VERIFY=true git pull fi fi shift done
      
      







ファイル/ srv / git / projectname / hooks / updateを作成します(このスクリプトは、新しいブランチを作成/削除するときにサイトを自動的に作成/削除します。プロジェクトの名前をPROJECT変数に割り当てます):

 #!/bin/sh refname="$1" oldrev="$2" newrev="$3" PROJECT="projectname" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 <ref> <oldrev> <newrev>)" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 exit 1 fi # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi BRANCH=`echo $1 | awk --field-separator="/" '{print $3}'` delete () { mv /srv/www/$PROJECT/repo/$BRANCH /srv/www/$PROJECT/repo/$BRANCH.removed_by_git rm -rf /srv/www/$PROJECT/repo/$BRANCH.removed_by_git } case "$refname","$newrev_type" in refs/heads/*,delete) # delete branch delete ;; refs/remotes/*,delete) # delete tracking branch delete ;; esac exit 0
      
      







branch.projectname.domain.ruドメインをサポートするためにnginxとapacheを構成します




vhost-configを作成し、メインのnginx構成に接続します。

 server { listen 80; # projectname    ,  domain -    . master-     projectname.domain.ru server_name ~^(?P<branch>.*)\.projectname\.domain\.ru$ projectname.domain.ru; if ($branch = "") { set $branch "master"; } access_log /srv/www/projectname/logs/projectname.domain.ru-acc main; error_log /srv/www/projectname/logs/projectname.domain.ru-err; #     apache mod_php location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 300; client_max_body_size 256m; proxy_buffer_size 16k; proxy_buffers 32 16k; } #    "data",      http://projectname.domain.ru/data.      ,      . #  ,    php     data,     git-,         . #          DOCUMENT_ROOT,        . #  ,   /srv/www/projectname/data ,  , apache:apache ( chmod 777),   /srv/www/projectname/repo - username:username. location ^~ /data/ { root /srv/www/projectname; } #     apache. location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|swf|flv|avi|djvu|mp3|mp4|ogv)$ { root /srv/www/projectname/repo/$branch/htdocs; } #     ".git". location ~ /\.git { deny all; } #      ,    /srv/www/robots.txt  ,    (     robots.txt  ): # User-Agent: * # Disallow: / #  ,   ,    robots.txt  ,      /srv/www,      . location = /robots.txt { root /srv/www; } }
      
      







残っているのは、Apacheの仮想ホスト設定だけです。

 <VirtualHost *> # -  master- DocumentRoot /srv/www/projectname/repo/master/htdocs ServerName projectname.domain.ru ErrorLog /srv/www/projectname/logs/projectname.domain.ru-err <Location /> php_admin_value open_basedir "/usr/share/pear:/srv/www/projectname:/tmp" php_admin_value upload_tmp_dir "/srv/www/projectname/tmp" php_admin_value session.save_path "/srv/www/projectname/tmp" php_admin_value memory_limit "256M" php_value post_max_size "256M" php_value upload_max_filesize "256M" </Location> <Directory /srv/www/projectname/repo> Options Includes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *> #  "  "   VirtualDocumentRoot #   rewrite-  .htaccess   VirtualDocumentRoot    500,       "RewriteBase /"  .htaccess. VirtualDocumentRoot /srv/www/projectname/repo/%1/htdocs ServerName dev.projectname.domain.ru ServerAlias *.projectname.domain.ru ErrorLog /srv/www/projectname/logs/projectname.domain.ru-err <Location /> php_admin_value open_basedir "/usr/share/pear:/srv/www/projectname:/tmp" php_admin_value upload_tmp_dir "/srv/www/projectname/tmp" php_admin_value session.save_path "/srv/www/projectname/tmp" php_admin_value memory_limit "256M" php_value post_max_size "256M" php_value upload_max_filesize "256M" </Location> <Directory /srv/www/projectname/repo> Options Includes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
      
      







以上です! このアルゴリズムは、たとえば、Redmineに固定して、新しいプロジェクトを作成するときにリポジトリを自動的に作成したり、アクセス権を管理したりできます。 アクセス権の差別化を備えたプラグインを作成することをお勧めします。これにより、実稼働環境への展開またはロールバックが可能になります(Capistranoの使用を含む)。



100人以上のスタッフを抱える大規模な広告代理店にも同様の実装を使用しており、自動化が人的要因によるミスを大幅に削減し、最も重要なこととして、新しい緊急プロジェクトを作成したり、アクセスを登録するために夜間に管理者を起こす必要がないため、彼らは本当に気に入っています。



このトピックに関するあなたが最も興味を持っている質問をコメントに書いてください-私は間違いなく新しい記事で説明します!



All Articles