使用PowerShell将代码从GitLab存储库部署到Azure Web App

时间:2018-10-05 11:13:37

标签: azure powershell gitlab

我想使用PowerShell脚本设置从GitLab存储库到Azure应用的连续部署。我知道您可以按照以下步骤手动执行此操作:

https://christianliebel.com/2016/05/auto-deploying-to-azure-app-services-from-gitlab/

但是,我正在尝试使用Powershell使其自动化。我查看了GitHub的示例脚本:

https://docs.microsoft.com/en-us/azure/app-service/scripts/app-service-powershell-continuous-deployment-github

但是由于没有GitLab的提供程序,并且现有的提供程序都没有接受GitLab URL,所以我不确定如何继续。我已经看过在Azure门户中使用GitLab设置手动部署(使用“外部存储库”选项),并导出资源组模板以获取存储库如何连接到App的详细信息,但出现错误:

Could not get resources of the type 'Microsoft.Web/sites/sourcecontrols'. 
Resources of this type will not be exported. (Code: ExportTemplateProviderError, Target: Microsoft.Web/sites/sourcecontrols)

目前,我正在通过镜像GitHub中的GitLab存储库并使用从那里到Azure的连续部署管道来解决此问题。请注意,这是针对在GitLab.com中托管的存储库,而不是在自托管的GitLab服务器中。该项目没有Windows Runner安装程序。

如何使用PowerShell脚本直接从GitLab到Azure设置持续部署?一旦运行了安装脚本,随后对GitLab存储库的每个后续提交/合并都应自动部署到Azure。最好,此PowerShell脚本应使用AzureRM模块,但我愿意接受使用PowerShell Core和新的Az模块(基于Azure CLI)的解决方案。我正在使用的特定测试存储库是公共的(https://gitlab.com/MagicAndi/geekscode.net),但这不是解决方案与私有存储库一起使用的特定要求(但如果可以,甚至更好!)。

更新17/12/2018

我将赏金授予the-fish,因为他的回答最能满足我的特定需求。但是,鉴于已弃用Windows Powershell和Azure RM模块,而转而使用PowerShell Core和新的Az模块(使用Azure CLI),我创建了一个new question,专门使用Azure来寻求规范答案CLI和Powershell核心。我计划在两天内向我开放此问题的悬赏计划。谢谢。

3 个答案:

答案 0 :(得分:4)

听起来您正在寻找从GitLab到Azure Apps的直接部署,但是我建议使用部署管道工具为您提供更多选择。

Azure DevOps Services管道可能是一个安全的选择,并且有免费层,这里是very brief getting started guide for Web Apps deploys

但是它并未内置对GitLab的支持,但似乎有一个marketplace tool for integrations with GitLab

此功能似乎没有释放触发器的功能,但可以手动触发。有人对release triggers in the marketplace Q&A有疑问,所以也许会在路线图中。

答案 1 :(得分:4)

为了重现您的情况,我使用了Azure CLI:

https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest

愿意在Powershell中的脚本中随意使用它。

首先,我尝试使用Bitbucket存储库获取有关当前部署的所有信息,该存储库配置为Microsoft.Web / sites / sourcecontrols / Bitbucket:

az webapp deployment source show --name XXXXXXX --resource-group YYYYY

得到答案:

{
  "branch": "master",
  "deploymentRollbackEnabled": false,
  "id": "/subscriptions/00000/resourceGroups/YYYYY/providers/Microsoft.Web/sites/XXXXXXX/sourcecontrols/web",
  "isManualIntegration": false,
  "isMercurial": false,
  "kind": null,
  "location": "North Europe",
  "name": "XXXXXXX",
  "repoUrl": "https://bitbucket.org/myAccount/myRepo",
  "resourceGroup": "YYYYY",
  "type": "Microsoft.Web/sites/sourcecontrols"
}

我断开了连接,并对其进行了手动配置,完全像您的链接中那样指定了 External Repository ,定义了SAME Git存储库并进行分支,最后得到的结果几乎相同:

{
  "branch": "master",
  "deploymentRollbackEnabled": false,
  "id": "/subscriptions/00000/resourceGroups/YYYYY/providers/Microsoft.Web/sites/XXXXXXX/sourcecontrols/web",
  "isManualIntegration": true,
  "isMercurial": false,
  "kind": null,
  "location": "North Europe",
  "name": "XXXXXXX",
  "repoUrl": "https://bitbucket.org/myAccount/myRepo",
  "resourceGroup": "YYYYY",
  "tags": {
    "hidden-related:/subscriptions/00000/resourcegroups/YYYYY/providers/Microsoft.Web/serverfarms/XXXXXXX-sp": "empty"
  },
  "type": "Microsoft.Web/sites/sourcecontrols"
}

您可以看到不同之处:

  • isManualIntegration 现在为True,而不是False
  • 隐藏相关的标签,但我不确定此处是否有趣

总而言之,您可以使用官方Azure Azure Cli(即部署定义)通过以下方式轻松编写脚本:

az webapp deployment source config --manual-integration --repository-type git --repo-url https://bitbucket.org/myAccount/myRepo --branch master --name XXXXXXX --resource-group YYYYY

编辑15/11/2018:

完成此部署设置后,每次将新的提交推送到相关分支(例如,先前示例中的master)都会自动触发新的部署。

要注意,有时触发部署需要花费几分钟。

最终,如果您希望自动执行某些操作(Powershell命令,GNU / Bash脚本,.py,.bat或任何其他内容),则可以创建一个 .deployment 文件在您存储库的根目录中。

例如:

[config]
SCM_COMMAND_IDLE_TIMEOUT = 9000
command = bash.exe build_my_project_on_azure.sh

您可以在official documentation中获取更多信息。

答案 2 :(得分:2)

假设存储库是公共的,则可以使用以下内容:

$gitrepo="<replace-with-URL-of-your-own-repo>"
$webappname="mywebapp$(Get-Random)"
$location="West Europe"

# Create a resource group.
New-AzureRmResourceGroup -Name myResourceGroup -Location $location

# Create an App Service plan in Free tier.
New-AzureRmAppServicePlan -Name $webappname -Location $location `
    -ResourceGroupName myResourceGroup -Tier Free

# Create a web app.
New-AzureRmWebApp -Name $webappname -Location $location -AppServicePlan $webappname `
    -ResourceGroupName myResourceGroup

# Configure deployment from your repo and deploy once.
$PropertiesObject = @{
    repoUrl = "$gitrepo";
    branch = "master";
    isManualIntegration = $true
}
Set-AzureRmResource -PropertyObject $PropertiesObject -ResourceGroupName myResourceGroup `
    -ResourceType Microsoft.Web/sites/sourcecontrols -ResourceName $webappname/web `
    -ApiVersion 2018-02-01 -Force

让我知道它是否私有,这可能会更困难。如果您查看CLI源代码,则可以看到它们当前仅支持GitHub上的访问令牌。

https://github.com/Azure/azure-cli/blob/4f87cb0d322c60ecc6449022467bd580a0accd57/src/command_modules/azure-cli-appservice/azure/cli/command_modules/appservice/custom.py#L964-L1027