使用PowerShell和Azure的CLI部署代码从GitLab库到Azure的Web应用程序(D

2019-10-16 12:39发布

我想建立持续部署从GitLab库到Azure的应用程序使用PowerShell脚本和Azure的CLI。 已经有这样做使用应答Azure的RM模块和Windows PowerShell中 ,但因为这些都是现在已经过时 ,我对于使用新的解决方案专门找了Az模块和PowerShelll核心 。

该解决方案应该给予AA PowerShell的(核心)脚本设置一个持续部署直接从GitLab到Azure上。 它必须利用的了Az模块 。 一旦安装脚本运行,以后每次提交/合并到GitLab库应再自动部署到Azure上。 最好,这PowerShell脚本应适用于那些在GitLab托管公共和私人仓库,但我愿意接受的解决方案,只能在公共仓库工作。

Answer 1:

我与gitlab和捻的REST API玩耍,并计算出如何自动手动解决方案 ,你提到的。 唯一的额外步骤是gitlab API令牌添加到您的代码,但你只是做一次所有项目。 您可以从gitlab帐户设置的“访问令牌”得到它。 其他一些注意事项:

与捻API进行交互脚本自动生成使用部署凭据。 但是,您可以创建部署一个单独的用户,并用它在所有其他项目(跳过步骤)。 你可以做到这一点在蔚蓝的CLI:

az webapp deployment user set --user-name someUser --password somepassword

GitLab API使用项目ID,而不是项目的名称。 该脚本试图从回购URL自动检索项目ID,但你可能会从项目一般设置复制/粘贴上gitlab是安全的。

该解决方案适用于私有回购了。 你会看到一些错误,同时创建资源(因为SSH密钥尚未设定)的唯一的事。 但脚本完成后应该没事,所以忽略错误。 对于公众的回购协议,你可以跳过该项设置的东西可言

下面是该脚本:

function log {param($memo); Write-Host "[$((get-date).ToString("HH:mm:ss"))]: $memo" -ForegroundColor Green}

# =============== App and GitLab settings ==============


$webapp="geekscodeStackOverflow"
$resgroup = $webapp + "Group"
$plan = $webapp + "Plan"
$location="centralus"

$gitToken = "yourGitLabTokenHere"  
$repoUrl = "https://gitlab.com/MagicAndi/geekscode.net"
# $projID =  "99..."



# ============== DEPLOYMENT SCRIPT ==========================#

log "Setting up the app on azure"

New-AzResourceGroup -Name $resgroup -Location $location
New-AzAppServicePlan -Name $plan -Location $location -ResourceGroupName $resgroup -Tier Free
New-AzWebApp -Name $webapp -Location $location -AppServicePlan $plan -ResourceGroupName $resgroup

$appInfo = Get-AzWebApp -Name $webapp
$appRef = @{Name=$appInfo.Name; ResourceGroupName = $appInfo.ResourceGroup}
if(!$appInfo){Write-Host "app deployment failed" -ForegroundColor Red; return} else {Write-Host "App created:" -ForegroundColor Green}


# ================= linking web app to gitlab ========================= 
# you can do this manually: app dashboard / Deployment Centrer / External / App Service Kudu / git

log "setting up deployment "

$deployment = @{
  PropertyObject = @{ repoUrl = $repoUrl; branch = "master"; isMercurial= $false; isManualIntegration = $true }
  ResourceGroupName = $appInfo.ResourceGroup
  ResourceType = "Microsoft.Web/sites/sourcecontrols"
  ResourceName = $appInfo.Name + "/web"
  ApiVersion = "2018-02-01"
}

# you'll get error on this step for private repos because the key is not set up yet. You can ignore that error
Set-AzResource @deployment -Force

log "Extracting Deployment credentials"
# you can also create a user credentials in AZ CLI and skip this or manually get it in App's deployment center
$prof = Get-AzWebAppPublishingProfile @appRef | Select-Xml -XPath "//*[@publishMethod='MSDeploy']"
$deployCreds = $prof.node.userName + ":" + $prof.node.userPWD


log "Extracting Deployment key"
# Can skip for public repors
$keyUrl = "https://$webapp.scm.azurewebsites.net/api/sshkey?ensurePublicKey=1"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($deployCreds))
$head = @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$deployKey =  Invoke-RestMethod -Uri $keyUrl -Headers $head -Method Get


#============== Setting Up GIT LAB ================ #

$gitApi = "https://gitlab.com/api/v4"
$gitHead = @{'PRIVATE-TOKEN'= $gitToken; 'Content-Type'='application/json'} 

# looking up project id by user/repo name. You can skip that and get the id from project general setting on GitLab
$repo = $repoUrl.Split("/")[-2,-1] -join "%2F"
$project = Invoke-RestMethod -Uri "$gitApi/projects/$repo" -Headers $head
$projID = $project.id
log "Setting up $repoUrl (project id $projID)"

# --- Adding deploy key to GitLab project (public repos can skip) ---
# You can copy the key manually - Go to Project / Settings / Repository / Deploy Keys
log "Adding deploy keys to GitLab project"
$keyBody = @{title="Azure_Key";key=$deployKey; can_push=$true} | ConvertTo-Json
Invoke-RestMethod "$gitApi/projects/$projID/deploy_keys/" -Headers $gitHead -Body $keyBody -Method Post

log "Setting up a webhook"
# this can be set manualy - go to Project / Settings / Integrations.
$whBody = @{url = "https://$deployCreds@$webapp.scm.azurewebsites.net/deploy"} | ConvertTo-Json
Invoke-RestMethod -Uri "$gitApi/projects/$projID/hooks/" -Headers $gitHead -Body $whBody -Method Post

log "deployment completed `ncheck out your app at https://$webapp.azurewebsites.net"


Answer 2:

尝试下面的命令Az ,我的仓库是公开的,它工作正常,在我的身边。

$gitrepo="your git repository url"
$webappname="joyazapp"
$location="centralus"

New-AzResourceGroup -Name joyazgroup -Location $location

New-AzAppServicePlan -Name joyazplan -Location $location -ResourceGroupName joyazgroup -Tier Free

New-AzWebApp -Name joyazapp -Location $location -AppServicePlan joyazplan -ResourceGroupName joyazgroup

$PropertiesObject = @{
    repoUrl = "$gitrepo";
    branch = "master";
    isManualIntegration = $false
}

Set-AzResource -PropertyObject $PropertiesObject -ResourceGroupName joyazgroup -ResourceType Microsoft.Web/sites/sourcecontrols -ResourceName $webappname/web -ApiVersion 2018-02-01 -Force


文章来源: Deploy Code from GitLab Repository to Azure Web App using PowerShell and Azure CLI