DevOps+Terraform部署Infra+Azure Functions部署二
部署准备
推项目,创建Self-Host Agent或者使用微软自带的编译机(这里我们使用微软自带的编译机)
ok,本地代码都搞好之后,我们在Azure DevOps上创建一个组织,然后初始化一个项目,将本地的项目推到AzureRepos里面。然后我们配置一台编译机,这里我们可以看之前的文章Selfhost Agent配置
创建Service Principal
这个是用于来连接到Azure,给这个管道权限来操作Azure资源。
我们进入到我们创建的项目中,然后点击”项目设置“>然后点击“服务连接”>“新建一个服务连接”
然后我们点击Azure 资源管理,
然后我们选择自动的Serviceprincipal(automatic),然后点击“Next”,
然后我们可以给到订阅权限。
选好订阅然后保存就可以了。
创建一个存储账户和一个容器用于存放Terraform运行所产生的文件
我们事先需要在AzurePortal上创建一个存储账户然后在里面创建一个容器,这里我们创建了一个存储账户名为“lslsls”,
容器名为“lsls”用于存放Terraform运行产生的文件。
部署创建代码
我们在Pipelines里面创建一个CI,我们可以先创建一个空的。
然后如下代码:
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger:
- master
pool:
vmImage: ubuntu-latest
variables:
- group: varls
steps:
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'init'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraforminfra'
backendAzureRmResourceGroupName: 'RG-LS-TRANING'
backendAzureRmStorageAccountName: 'lslsls'
backendAzureRmContainerName: 'lsls'
backendAzureRmKey: 'tf/terraform.tfstate'
backendServiceArm: 'll'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'plan'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraforminfra'
environmentServiceNameAzureRM: 'll'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'apply'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraforminfra'
environmentServiceNameAzureRM: 'll'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'output'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraforminfra'
environmentServiceNameAzureRM: 'll'
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
replaceExistingArchive: true
# - task: AzureFunctionApp@2
# inputs:
# connectedServiceNameARM: 'll'
# appType: 'functionApp'
# appName: $(funcname)
# package: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
# deploymentMethod: 'auto'
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
publishLocation: 'pipeline'
- task: AzureFunctionApp@2
inputs:
connectedServiceNameARM: 'll'
appType: 'functionAppLinux'
appName: 'ls-exale-func'
package: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
runtimeStack: 'PYTHON|3.10'
deploymentMethod: 'auto'
里面有触发分支,编译池,参数,
然后就是我们的infra环境部署了,infra环境部署总共分为以下几步:
Terraform init : 初始化会下载一些所需要的依赖插件等
Terraform plan: 指定部署计划
Terraform apply: 应用部署,按照我们的代码应用部署
成功的话,下一步就是我们部署项目了。
声明一下(这里我们用的是微软自带的编译机,所以依赖都有比如Python,Azure CLI等,如果是自己配制的代理机,则需要我们去安装所需要的工具)
Terraform 控件
我们可以在右侧搜索Terraform,点击Terraform,
Provider:云的提供者,这里我们选用Azurerm
Command:按照我们上面的步骤,第一步应该是init
Configuration directory:我们Infra代码所在的工作目录,默认是最外层目录
项目及infra代码机构如下:
按照我们的目录结构直接在后面加/terraforminfra就可以了,接下来几步都是一样的。
发布代码
我们可以将我们的项目代码打包为Zip,文件(Archive files控件)
然后找到控件deploy Azure Functions发布就OK了。
然后我们可以部署一下,运行一下Pipeline;
我们到Azure找到我们的函数,转到概述,看到我们所部署的函数:
进入之后我们点击获取函数URL,访问就OK了。
ok,完美收工。