如何在TeamCity中安排自动备份?

23
我们正在使用Teamcity 6.5.6专业版,它提供了备份选项,但我没有看到任何安排备份运行时间的选项。
我不确定这个版本的Teamcity是否支持定期备份。如果无法通过Teamcity GUI实现,请问是否有其他选项可用?
请问是否可以帮忙解决问题?
谢谢。

这是一段工作正常的Python代码,用于REST TeamCity备份。 - webwesen
7个回答

20
我写了一个TeamCity自动备份的Powershell脚本,可以安排计划并运行备份。
以下是代码:
function Execute-HTTPPostCommand() {
    param(
        [string] $url,
        [string] $username,
        [string] $password
    )

    $authInfo = $username + ":" + $password
    $authInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes($authInfo))

    $webRequest = [System.Net.WebRequest]::Create($url)
    $webRequest.ContentType = "text/html"
    $PostStr = [System.Text.Encoding]::Default.GetBytes("")
    $webrequest.ContentLength = $PostStr.Length
    $webRequest.Headers["Authorization"] = "Basic " + $authInfo
    $webRequest.PreAuthenticate = $true
    $webRequest.Method = "POST"

    $requestStream = $webRequest.GetRequestStream()
    $requestStream.Write($PostStr, 0, $PostStr.length)
    $requestStream.Close()

    [System.Net.WebResponse] $resp = $webRequest.GetResponse();
    $rs = $resp.GetResponseStream();
    [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
    [string] $results = $sr.ReadToEnd();

    return $results;
}

function Execute-TeamCityBackup() {
    param(
        [string] $server,
        [string] $addTimestamp,
        [string] $includeConfigs,
        [string] $includeDatabase,
        [string] $includeBuildLogs,
        [string] $includePersonalChanges,
        [string] $fileName
    )
    $TeamCityURL = [System.String]::Format("{0}/httpAuth/app/rest/server/backup?addTimestamp={1}&includeConfigs={2}&includeDatabase={3}&includeBuildLogs={4}&includePersonalChanges={5}&fileName={6}",
                                            $server,
                                            $addTimestamp,
                                            $includeConfigs,
                                            $includeDatabase,
                                            $includeBuildLogs,
                                            $includePersonalChanges,
                                            $fileName);

    Execute-HTTPPostCommand $TeamCityURL "USER" "PASSWORD"
}

$server = "http://YOUR_SERVER"
$addTimestamp = $true
$includeConfigs = $true
$includeDatabase = $true
$includeBuildLogs = $true
$includePersonalChanges = $true
$fileName = "TeamCity_Backup_"

Execute-TeamCityBackup $server $addTimestamp $includeConfigs $includeDatabase $includeBuildLogs $includePersonalChanges $fileName

压缩文件应该放在哪里? - Paul Zahra
2
@PaulZahra,默认情况下,备份文件会创建在<TeamCity数据目录>/backup中。这里是一个链接,告诉你如何找到它 https://confluence.jetbrains.com/display/TCD10/TeamCity+Data+Directory - Ivan Leonenko
2
顺便说一下,我在这里找到了你的脚本...这可能会让你感兴趣(它有一些小改动)... https://blogs.endjin.com/2013/08/a-step-by-step-guide-to-automating-teamcity-backups/ - Paul Zahra

10

您可以使用REST API来运行备份。我们实际上使用TeamCity在每天的午夜运行预定构建。该构建会调用rest api来执行备份。


谢谢。REST API说我应该向我的TeamCity服务器发出POST请求,其中包含所有必需的参数。如果我在TeamCity中为此设置一个构建,我应该使用什么类型的构建运行器? - kranthi
@kranthi - 我们编写了一个简单的Python脚本并使用命令行运行器。任何脚本语言都可以。 - Mike Two
5
由于这个建议,我能够基于REST API构建一个解决方案。源代码托管在Github上,这是一篇描述它如何工作的博客文章:http://daniellang.net/how-to-automate-teamcity-backups-using-its-rest-api/ - Daniel Lang

9

如果您不想编写程序来执行您的任务,只需运行此命令:

wget --user=*** --password=*** "http://localhost:8085/httpAuth/app/rest/server/backup?includeConfigs=true&includeDatabase=true&includeBuildLogs=true&fileName=ScheduledBackup-" --post-data= 

将星号替换为您的TeamCity登录信息。

在Windows上,您可以通过安装Cygwin软件包来获取WGET。


如果您想要比Cygwin更轻量级的选项,那么wget也包含在unxutils中。获取unxutils.zipunxupdates.zip; 解压缩工具,解压缩更新,将更新移动到unxutils的usr/local/wbin文件夹中,然后在$PATH上注册它。 - Damon
对于使用UnxUtils的任何人:WGET不接受“--user”,“--password”和“--post-data”参数(我不知道它们是否在实际的Unix WGET中)。尝试使用“--http-user”和“--http-passwd”。在UnxUtils的wget帮助中没有找到“--post-data”的替代方法。另外,结果文件放在哪里? - Brandon

8

对于那些希望从Mac OS触发构建的人(在TeamCity上使用“命令行”运行程序):

curl --basic --user user:password -X POST "http://team.city.server:8111/httpAuth/app/rest/server/backup?includeConfigs=true&includeDatabase=true&includeBuildLogs=true&fileName=ScheduledBackup"

1
curl 应该是任何操作系统上的选项。在 Windows 上,您可以通过 msysgit 获取它,该工具使用 MinGW (http://www.mingw.org/),如果您让它为所有命令提示符安装 Git 命令,则使其成为每个人的候选。另外,根据手册,curl 默认为基本身份验证模式,因此,如果保持命令简单,则可能可以删除 --basic。YMMV 因此请在您的操作系统上进行测试。 - Damon

7
我们通过运行maintainDB.cmd并使用Windows任务计划程序来进行调度,这是一行命令,并且不需要额外的软件。maintainDB在TeamCity文档中有完整的说明。

1
maintainDB需要停止TeamCity服务才能使用,但可以通过命令行停止和启动服务。 - WhiteKnight
1
这是(在我看来)迄今为止最好的答案,主要是因为它不需要保留用户/密码,并且它使用了一个超级简单的内置工具。 - stijn

3
您可以使用环境变量,在构建时让Team City服务器地址解析:
curl --basic --user user:pasword -X POST "%teamcity.serverUrl%/httpAuth/app/rest/server/backup?includeConfigs=true&includeDatabase=true&includeBuildLogs=true&fileName=ScheduledBackup"

0

从@Ivan Leonenko的脚本开始,我添加了一些代码行以等待备份结束后再退出。

function Execute-HTTPCommand() {
    param(
        [string] $method,
        [string] $url,
        [string] $username,
        [string] $password
    )

    $authInfo = $username + ":" + $password
    $authInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes($authInfo))

    $webRequest = [System.Net.WebRequest]::Create($url)
    $webRequest.ContentType = "text/html"
    $PostStr = [System.Text.Encoding]::Default.GetBytes("")
    $webrequest.ContentLength = $PostStr.Length
    $webRequest.Headers["Authorization"] = "Basic " + $authInfo
    $webRequest.PreAuthenticate = $true
    $webRequest.Method = $method

    if ($method -ne "GET")
    {
        $requestStream = $webRequest.GetRequestStream()
        $requestStream.Write($PostStr, 0, $PostStr.length)
        $requestStream.Close()
    }

    [System.Net.WebResponse] $resp = $webRequest.GetResponse();
    $rs = $resp.GetResponseStream();
    [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
    [string] $results = $sr.ReadToEnd();

    return $results;
}

function Execute-TeamCityBackup() {
    param(
        [string] $server,
        [string] $addTimestamp,
        [string] $includeConfigs,
        [string] $includeDatabase,
        [string] $includeBuildLogs,
        [string] $includePersonalChanges,
        [string] $fileName,
        [string] $username,
        [string] $password
    )
    $TeamCityURL = [System.String]::Format("{0}/httpAuth/app/rest/server/backup?addTimestamp={1}&includeConfigs={2}&includeDatabase={3}&includeBuildLogs={4}&includePersonalChanges={5}&fileName={6}",
                                            $server,
                                            $addTimestamp,
                                            $includeConfigs,
                                            $includeDatabase,
                                            $includeBuildLogs,
                                            $includePersonalChanges,
                                            $fileName);

    Write-Host "Starting TeamCity backup"

    Execute-HTTPCommand "POST" $TeamCityURL $username $password
}

function Wait-TeamCityBackup() {
    param(
        [string] $server,
        [string] $username,
        [string] $password
    )

    $GetBackupStatusUrl = [System.String]::Format("{0}/httpAuth/app/rest/server/backup",
                                            $server);

    do {
        Start-Sleep -Seconds 1
        $backupStatus = Execute-HTTPCommand "GET" $GetBackupStatusUrl $username $password
        Write-Host $backupStatus
    } while ($backupStatus -eq 'Running')

}


$server = "http://YOUR_SERVER"
$addTimestamp = $true
$includeConfigs = $true
$includeDatabase = $true
$includeBuildLogs = $true
$includePersonalChanges = $true
$fileName = "TeamCity_Backup_"
$username = "USERNAME" # Must be a TeamCity Admin
$password = "PASSWORD"

Execute-TeamCityBackup $server $addTimestamp $includeConfigs $includeDatabase $includeBuildLogs $includePersonalChanges $fileName $username $password
Wait-TeamCityBackup $server $username $password

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接