Powershell / VSTS构建 - 存储凭据独立/不可知用户运行脚本

时间:2017-08-30 08:51:51

标签: powershell tfs azure-devops azure-pipelines

我正在尝试为构建创建一个脚本来检出文件,对其进行编辑并重新检入。

我希望它在作为开发人员或构建代理程序运行时起作用。

我有一个类似于this的解决方案,其中密码存储在一个文件中并为构建检索。

文件创建:

read-host -prompt Password -assecurestring | convertfrom-securestring | out-file .\ps-password.pwd -ErrorAction Stop

文件使用:

# *VSTS Login*
$Username = $tfsUserName
$Password = Get-Content $tfsUserPasswordPath | ConvertTo-SecureString

$creds = New-Object -typename System.Management.Automation.PSCredential -ArgumentList $Username,$Password
$tfsServer = New-Object System.Uri("https://myaccount.visualstudio.com")
$tfsCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection($tfsServer,$creds)
$tfsCollection.Authenticate()
"***************** Authenticated *****************"

" *VSTS Check Out file* from $fileToUpdate"
Add-TfsPendingChange -Edit -Item $fileToUpdate -Verbose -ErrorAction Stop -wa 0


# read the file, update the number and save it back
$stuff = Get-Content $fileToUpdate
# modify stuff
Set-Content -Value $stuff -Path $fileToUpdate


# *VSTS Check In* Check in the file after changes.
" *VSTS Check In"
New-TfsChangeset -Item $fileToUpdate -Verbose -Comment "***NO_CI***" -Override true -ErrorAction Stop

SecureStrings基于计算机/用户帐户,因此当我从Powershell ISE作为我的帐户运行时,构建工作正常,但是当从构建服务器触发时(#{1运行)现在)。

我已尝试按照this post将密码文件创建为“网络服务”,并尝试使用key作为安全字符串,但无法在我的用户和网络服务。

如何只存储与运行脚本的用户相关的凭据?

或者这只是错误的方法,我应该以某种方式使用PAT?

1 个答案:

答案 0 :(得分:2)

构建允许您通过构建定义中的设置访问PAT令牌。这些是动态生成的PAT令牌,因此您无需在任何地方存储任何秘密。

要在开发人员的计算机上运行脚本,您可以要求开发人员输入PAT或者使用if else逻辑来向他询问用户名密码。

的更多信息

https://www.visualstudio.com/en-us/docs/build/scripts/#use-the-oauth-token-to-access-the-rest-api

更新(完整解决方案):

在您的版本中,您必须转到“选项”并启用“允许脚本访问OAuth令牌”。

您的最终脚本将如下所示。

Add-PSSnapin Microsoft.TeamFoundation.PowerShell
# This file requires the TFS Power Tools (2015+). When installing, you must select Custom Installation and select PowerShell Cmdlets

# *VSTS Login*
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=2.0"
Write-Host "URL: $url"
$definition = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Definition = $($definition | ConvertTo-Json -Depth 100)"
"***************** Authenticated *****************"

" *VSTS Check Out file* from $fileToUpdate"
Add-TfsPendingChange -Edit -Item $fileToUpdate -Verbose -ErrorAction Stop -wa 0


# read the file, update the number and save it back
$stuff = Get-Content $fileToUpdate
# modify stuff - make sure you actually make a change!
Set-Content -Value $stuff -Path $fileToUpdate


# *VSTS Check In* Check in the file after changes.
" *VSTS Check In"
New-TfsChangeset -Item $fileToUpdate -Verbose -Comment "***NO_CI***" -Override true -ErrorAction Stop