我试图通过首先从bitbucket获取代码来自动化构建过程。
$output = "E:\FileName.xyz"
$url = 'https://bitbucket.org/WhatEver/WhatEverBranchName/get/master.zip'
$wc = New-Object -TypeName System.Net.WebClient
$wc.Headers.Add('Authorization','token oinksdilikncl--MyAccessToken--ioiwcnoisif89kfg9')
$wc.DownloadFile($url, $output)
当我执行此操作时,我在FileName.xyz收到的文件是一个html文件,它将我重定向到bitbucket的登录页面,基本上它要求输入信用卡,即使我提供了访问令牌。
我哪里错了?有没有其他方法可以做到这一点,Invoke-Webrequest?或者有人请我直接找一个代码示例?
答案 0 :(得分:2)
我对powershell没有任何经验,但我尝试在节点中执行类似的任务,这是我的发现。
首先,在bitbucket帐户设置的访问管理部分创建“Oauth”。这会给你一个“钥匙”和一个“秘密”。
现在使用这些Key和Secret,你会问Bitbucket一个令牌。在我的情况下,我向https://bitbucket.org/site/oauth2/access_token
发出了http请求。在你的情况下,你应该使用相当于CURL(可能是Invoke-RestMethod?)。 CURL命令是这样的:
$ curl -X POST -u "yourKeyHere:yourSecretHere" https://bitbucket.org/site/oauth2/access_token -d grant_type=client_credentials
我的http请求就像这样(在节点中使用superagent),Content-Type
设置为application/x-www-form-urlencoded
:
request.post("https://yourKeyHere:yourSecretHere@bitbucket.org/site/oauth2/access_token").send('grant_type=client_credentials');
现在您已拥有令牌,您的程序或命令可以使用它克隆私人仓库。但你的回购的网址应该是这样的(保持括号围绕代币):
https://x-token-auth:{tokenHere}@bitbucket.org/youRepoOwnerHere/RepoNameHere.git
现在您的计算机上已经有了整个代码库。但是你想要一个单独的文件,而不是整个仓库,我将你引用到这个Retrieve a single file from a repository,但是请记住使用上面的repo url和令牌而不是正常的repo url。
答案 1 :(得分:1)
实际上,至少现在(原帖后2年),事情比这更容易,因为它足以做基本身份验证。因此,只要脚本是私有的,你就没有问题写入其中的信用,以下应该是技巧
Invoke-WebRequest -uri '<url>' -Headers @{ Authorization = 'Basic <auth_str_b64>' } -OutFile <dest_path>
其中:
- url
类似https://bitbucket.org/<account>/<repo_name>/get/<branch_or_tag_or_whatever>.zip
,从所需存储库的“下载”页面获取
- auth_str_b64
是通常的<username>:<password>
对base64编码
您可以使用以下命令创建/计算编码字符串:
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes('<username>:<password>'))
为了避免在脚本中保留信誉,您可以将它们作为参数传递或在运行时提示它们。
答案 2 :(得分:0)
我已经解决了这个问题:
# Instanciate the WebClient
$wc = New-Object -TypeName System.Net.WebClient
# Add the base64 encoded credentials
$wc.Headers.Add('Authorization','Basic {0}' -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f '{USERNAME}','{TOKEN}'))))
# Download the file
$wc.DownloadFile( 'https://{BITBUCKET_URL}/projects/{PROJECT}/repos/{REPOSITORY}/raw/{FILE.EXT}?at=refs%2Fheads%2F{BRANCH}', 'C:\file.txt' )
我假设您正在使用Personal Access Token。哦,它比Invoke-WebRequest或Invoke-RestMethod快得多。