【问题标题】:svn checkout to deploy via shellsvn checkout 通过 shell 部署
【发布时间】:2012-01-10 07:05:55
【问题描述】:

我有以下问题。我需要组织自动上传以从 svn 存储库部署服务器,但有一些功能。 这是我写的:

# $1 - project; $2 - version (optional)
#   rm -rf $projectDir
if [ "$2" == '' ]; then
    svn export $trunk $projectDir --force >> $log
    version=`svn info $trunk | grep Revision | awk '{print$2}'`
    svn copy $trunk $tags/$version -m "created while uploading last version of $1"
    echo "New stable version #$version of $1 is created
    Uploading to last version is completed successfully"
else
    version=$2
    svn export $tags/$version/ $projectDir --force >> $log
    echo "Revert to version #$version is completed successfully"
fi

echo $version > $projectDir/version

chown -R $1:$1 $projectDir

但是 svn export 不会删除通过 svn 删除的文件,所以每次导出前我都需要清理目录。这样不好。 在此之前,我使用结帐进行部署,如下所示:

svn co $trunk >> $log
cp -ruf trunk/* $projectDir
svn info $trunk | grep Revision > $projectDir/version
chown -R $project:$project $projectDir
echo "uploading finished"

与导出相比,这工作得非常好并且非常快(它只更改已更改的文件),但是:

  1. 不自动创建标签;
  2. 没有很好的还原机会。

在我的上一个脚本中 co 不起作用,因为它试图从不同的存储库目录(主干/某些标签)中检出一个目录,这不是真实的。

所以,问题:

  1. 我可以在结帐前搬迁项目吗?
  2. 我可以在导出前找到 co 版本和现有版本的差异吗?
  3. 我可以用差异结果做什么? (导出后删除不需要的文件?)

提前致谢。

【问题讨论】:

  • Shell位于项目服务器中,而svn服务器是外部的。

标签: shell svn deployment export svn-checkout


【解决方案1】:

你评估过Capistrano吗?它可以完成很多您想要实现的目标。

【讨论】:

  • 我是 Capistrano 的新手,对 Ruby 不熟悉,但似乎并不太难。但是我需要使用如此庞大的工具来完成简单的任务吗?我的意思是,Capistrano 不会做任何其他与 I 相同的操作。 >每次部署时,都会在“releases”目录下创建一个新目录,并将新版本放在那里。然后,“当前”符号链接将更新为指向该目录。所以,它不会更快地工作,因为它每次都会将整个项目上传到不同的文件夹中,我可以用符号链接做同样的事情。
  • 在这种情况下,我需要检查目录是否存在,如果不存在则导出。之后只更改符号链接源。但这是最简单的方法吗?
  • 此外,还有一个时刻 - 导出将执行提交,即使文件与上次导出相比没有更改。这使得有机会创建无限数量的重复版本。 Checkout 非常适合部署,但我已经在上面描述了我的问题。
  • 我更正了我的算法并得到了下一个:pastebin。你怎么看?
【解决方案2】:

解决方案的基础采用以下代码:

它更简单,完全解决了我的问题。

if [ "$2" == '' ]; then
    version=`svn info ${trunk} | grep Revision | awk '{print$2}'`
    if [ `cat ${projectWWW}/version` == "${version}" ]; then
        resultMessage="Project is up to date"
    else
        svn co ${trunk} ${projectRoot}/co >> ${log}
        cp -ruf ${projectRoot}/co/ ${projectRoot}/releases/${version}
        chown -R $1:$1 ${projectRoot}/releases/${version}
        resultMessage="New stable version #$version of $1 is created
        Uploading to last version is completed successfully"
   fi
else
    version=$2
    resultMessage="Revert to version #$version is completed successfully"
fi

ln -s ${projectRoot}/releases/${version} ${projectWWW}
echo ${version} > ${projectWWW}/version
echo ${resultMessage} >> ${log}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2022-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多