使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制台应用 CI/CD

news/2024/9/13 23:50:59/ 标签: azure, devops, .netcore, ci/cd, microsoft

    Web 应用程序通常需要作为后台任务运行的进程,并在特定时间间隔进行计划或在事件中触发。它们不需要花哨的 IO 接口,因为重点是过程而不是输出。Azure WebJobs 提供了出色的支持,通常在云环境中通过 Web 控制台应用程序来实现此目的。WebJob 是 Azure 应用服务的一项功能,可用于在与 Web 应用、API 应用或移动应用相同的实例中运行程序或脚本。 Azure 应用服务是一种基于 HTTP 的服务,用于托管 Web 应用程序、REST API 和移动后端。

    .NET Framework 中的 Web 控制台应用可轻松使用 Azure 服务生成和部署 WebJobs。此外,可以使用 Azure DevOps Pipelines 轻松为 CI/CD 配置 WebJobs 控制台应用,以便在每次成功生成时自动将 Web 应用部署到 Azure 应用服务。因此,Azure 管道支持使用 Azure DevOps 服务以持续集成 (CI) /持续交付 (CD) 方式进行生成、测试和部署。

    如果在 .NET Framework 中生成 WebJob 控制台应用,则通过将父 API 或 Web 应用链接到 Web/API 应用,可以非常轻松地生成和部署 WebJob,如下所示:

846318f91cd7297e2f995b45886dabca.png

3b7b824097666c64b6a870fa0cd0b994.png

    .NET Core 中的设计不支持上述 WebJob 控制台应用程序与父 Web/API 应用的链接。那么我们该怎么做呢?

    在本文中,我们将了解如何独立于父 Web/API 应用生成 .NET Core WebJob 控制台应用,并使用 Azure DevOps 生成和发布管道将其部署在现有的父 Web/API 应用下。

生成管道:生成 .NET Core 控制台应用

若要生成 .NET Core 控制台应用,我们需要在 Azure DevOps 生成管道中执行四个基本生成任务。

  • dotnet restore

  • dotnet build

  • dotnet publish

  • 将生成项目发布到放置位置

Azure Web 作业仅支持以下文件类型:

  • .cmd、.bat、.exe

  • .ps1(使用 PowerShell.ps1 (using PowerShell)

  • .sh(使用 Bash)

  • .php(使用 PHP)

  • .py(使用 Python)

  • .js(使用Node.js)

  • .jar(使用 Java)

由于我们位于 .NET Core 中,因此我们期望有一个 .exe 文件作为控制台应用的输出。如果仅通过运行来生成 .NET Core 应用,它将生成一个 .DLL 文件,但不会生成.EXE文件。若要生成.EXE文件作为生成输出,请在步骤中使用以下参数:dotnet buildpublish

--configuration $(BuildConfiguration) --self-contained -r win10-x64 --output $(build.artifactstagingdirectory)

    这个参数在这里会有所不同,因为这将在构建中生成一个.EXE文件。--self-contained -r win10-x64

    接下来,选择该选项。这将从生成输出中创建一个 ZIP 文件。Enable Zip Published Projects

f0c30f9c8c21859d35ee959642671497.png

一旦它被发布到ZIP文件夹并完成,我们需要将此ZIP文件拖放到放置位置。用作要发布的路径。使用您选择的任何项目名称。在此示例中,项目名称为:$(Build.ArtifactStagingDirectory)webjobs_drop

5fc241b55d92e65d0bcfe8e701aa9b44.png

发布管道:将生成项目部署到 Azure 应用服务

运行生成管道后,你将在位置获取生成输出。webjobs_drop/.zip

若要将其部署到 Azure 应用服务中运行的任何现有 Web/API 应用的 WebJob,我们必须运行 Azure PowerShell 脚本任务来实现此目的。

我们将用于将生成输出部署到应用服务。这会将压缩的生成输出解压缩到文件夹中。KUDU Zip Deploy APIwwwroot\App_Data\Jobs\\ 

若要设置发布管道,我们需要使用以下管道变量创建一个空管道:

  • resourceGroupName- 应用程序的资源组名称

  • scheduleName- 有争议/触发(在本例中,它是连续的)

  • scmApiUrl- SCM API 网址;示例:https://.scm.azurewebsites.net/api

  • webJobName- 您的 WebJob 名称;您的代码将部署在 wwwroot\App_Data\Jobs\scheduleName\webJobName 文件夹下

  • zippedArtifactPath- 构建输出文件的压缩工件路径

28f7d116959675526c103d9f58c37cd7.png


946ec439b9ad7df81e84e2ef39db6339.png

设置变量后,我们需要执行以下操作:

  • 添加一个Azure PowerShell script task

  • 选择“Azure 连接”类型

  • 选择 WebApp 所在的 Azure 订阅

  • 选择“脚本类型”作为内联脚本

71c6200c397858bc85042e49a1708868.png

在内联脚本编辑器中,添加以下 PowerShell 脚本:

#Zipped artifact path - get the path from Azure DevOps Pipeline variables
$path = "$(System.DefaultWorkingDirectory)\$($env:zippedArtifactPath)"#Test the path if exists
if (-not (Test-Path $path)) 
{throw [System.IO.FileNotFoundException] "$($path) not found."
}#Resource type and details
$resourceType = "Microsoft.Web/sites/config"
$resourceName = "$($env:webAppName)/publishingcredentials"#Get the Publishing Profile details
$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $($env:resourceGroupName) -ResourceType $resourceType -ResourceName $resourceName -Action list -Force#Creating the Auth Token using user name and password from Publish profile credentials
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName,$publishingCredentials.Properties.PublishingPassword)))#Get the file from the Build Artifacts path 
$files = Get-ChildItem -Path $path -Recurse
Test-Path -Path $files[0]   #Authentication Header
$authHeader = " Basic " + $base64AuthInfo#Kudu Zip Deploy API URL
$deployUrl = "$($env:scmApiUrl)/zip/site/wwwroot/App_Data/jobs/$($env:scheduleName)/$($env:webJobName)/"#Invoke Kudu Zip Deploy API to deploy the WebJob
$contentType = "multipart/form-data"
$userAgent = "powershell/1.0"
$ZipHeaders = @{
Authorization = $authHeader
}$response = Invoke-RestMethod -Uri  ([System.Uri]::new($deployUrl)) -Headers $ZipHeaders  -UserAgent $userAgent -Method PUT -InFile $files[0] -ContentType $contentTypeWrite-Host "Deployment Successful"

此 PowerShell 脚本将获取 Web 应用的发布配置文件详细信息,并使用此信息登录到 KUDU ZipDeploy API,以将 Zipped 生成输出上传到所需位置。

部署位置定义如下:

  • SCM API URL 和虚拟目录路径 https://<>.scm.azurewebsites.net/api/zip 
    site/wwwroot/App_Data/jobs/<continuous/triggered>/

访问特定于环境的配置

上述生成和发布管道将为 .NET Core 控制台应用程序生成并生成.EXE文件,并将生成输出部署到 Azure 应用服务虚拟目录。在某些情况下,Web 作业可能需要读取某些特定于环境的配置。在这种情况下,您必须将特定于环境的文件添加为 .appsettings.jsonappsettings.json

要从特定于环境的 JSON 文件中读取值,我们可以依赖该变量。可以从 Azure 门户手动设置此变量,也可以在应用设置部分使用 Azure 发布管道部署父 WebApp/API 应用时设置此变量。ASPNETCORE_ENVIRONMENT

builder.ConfigureAppConfiguration((hostingContext, config) =>{var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");Console.WriteLine("Environment Variable: " + environmentName);var env = hostingContext.HostingEnvironment;Console.WriteLine("hostingContext.HostingEnvironment: " + env.EnvironmentName);config.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true).AddEnvironmentVariables().Build();});

将上述代码添加到文件中,以便从文件中读取特定于环境的值。Program.csappsettings.json

总而言之,我们执行了以下操作:

  • dotnet publishwith 参数,用于生成 WebJob 支持的 EXE 文件--self-contained -r win10-x64 

  • 压缩生成项目目录

  • 使用 API 将 WebJob 控制台应用程序发布到现有的 web/API 应用程序虚拟目录。KUDU ZipDeployAzure PowerShell Script


http://www.ppmy.cn/news/1475440.html

相关文章

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有&#xff1a;RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…

爬虫怎么实现抓取的

1.4爬虫工程师常用的库通过图1-3我们了解到&#xff0c;爬虫程序的完整链条包括整理需求、分析目标、发出网络请求、文本解析、数据入库和数据出库。其中与代码紧密相关的有&#xff1a;发出网络请求、文本解析、数据入库和数据出库&#xff0c;接下来我们将学习不同阶段中爬虫…

keepalive+nginx/haproxy+keepalive 高可用

keepalive&#xff1a; 调度器的高可用 vip地址在主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主&#xff1b;主停止工作&#xff0c;vip飘到备上。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘会主服务器 1、配优先级 2、配v…

LLM推理优化笔记1:KV cache、Grouped-query attention等

KV cache 对于decoder-only 模型比如现在如火如荼的大模型&#xff0c;其在生成内容的过程中&#xff0c;为了避免冗余计算&#xff0c;会将Transformer里的self-attention的K和V矩阵给缓存起来&#xff0c;这个过程即为KV cache。 decoder-only模型的生成过程是自回归的&…

c++课后作业

把字符串转换为整数 int main() {char pn[21];cout << "请输入一个由数字组成的字符串&#xff1a; ";cin >> pn;int last 0;int res[10];int j strlen(pn);int idx 2;cout << "请选择&#xff08;2-二进制&#xff0c;10-十进制&#xf…

项目/代码规范与Apifox介绍使用

目录 目录 一、项目规范&#xff1a; &#xff08;一&#xff09;项目结构&#xff1a; &#xff08;二&#xff09;传送的数据对象体 二、代码规范&#xff1a; &#xff08;一&#xff09;数据库命名规范&#xff1a; &#xff08;二&#xff09;注释规范&#xff1a; …

JavaSE 面向对象程序设计进阶 IO流练习 字节缓冲流 字符缓冲流 底层原理

目录 字节缓冲流 字节缓冲流底层原理 字符缓冲流 字节缓冲流 刚刚学习的四个流是基本流 对四个基本流进行封装&#xff0c;添加了新的功能&#xff0c;叫做缓冲流 底层自带长度为8192的缓冲区 import java.io.*;public class Main {public static void main(String[] args) …

xcode中对项目或者文件文件夹重命名操作

提起揭秘答案&#xff1a;选中文件后&#xff0c;按下回车键就可以了 如果在项目中对新建的文件夹或者文件名称不满意或者输入错误了&#xff0c;想要修改一下名称该怎么办&#xff1f;如果是在文件或文件夹上右键是没有rename选项的&#xff1a; 其实想要重命名&#xff0c;很…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图&#xff1a; 页面布局&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:la…

AirPods Pro新功能前瞻:iOS 18的五大创新亮点

随着科技的不断进步&#xff0c;苹果公司一直在探索如何通过创新提升用户体验。iOS 18的推出&#xff0c;不仅仅是iPhone的一次系统更新&#xff0c;更是苹果生态链中重要一环——AirPods Pro的一次重大升级。 据悉&#xff0c;iOS 18将为AirPods Pro带来五项新功能&#xff0…

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App

电子签章 签到 互动 打卡 创意印章 支持小程序 H5 App 定制化

iOS 开发中不常见的专业术语

乐此不疲地把简单的问题复杂化&#xff0c;并把这种XX行为叫作专业 APM 在 iOS 开发中&#xff0c;APM 代表 Application Performance Management&#xff08;应用性能管理&#xff09;。APM 是一套监控和管理应用程序性能的工具和技术&#xff0c;旨在确保应用程序运行平稳、…

Django 新增数据 save()方法

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Book(models.Model):title models.CharField(max_length100)author models.CharField(max_length100)publication_date models.DateField()price models.DecimalField(max_digits5, decim…

常见的网络安全设备

一、防火墙 防火墙的核心任务&#xff1a;防护和控制&#xff0c;防火墙通过安全策略识别流量并做出相应的动作。 防火墙的安全策略在进行匹配时&#xff0c;自上而下逐一匹配&#xff0c;匹配成功则不向下进行匹配&#xff0c;末尾隐含拒绝所有规则。 1.包过滤防火墙 工作范围…

【C++深度探索】全面解析多态性机制(二)

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 我…

Elasticsearch 理解相关性评分(TF-IDF、BM25等)

在Elasticsearch中&#xff0c;相关性评分是搜索功能的核心&#xff0c;它决定了搜索结果的质量和排序。了解Elasticsearch是如何计算相关性评分的&#xff0c;特别是TF-IDF和BM25算法&#xff0c;对于优化搜索性能和结果至关重要。本文将深入探讨这两种算法及其在Elasticsearc…

vue3 ts 报错:无法找到模块“../views/index/Home.vue”的声明文件

解决办法&#xff1a; env.d.ts 新增代码片段&#xff1a; declare module "*.vue" {import type { DefineComponent } from "vue";// eslint-disable-next-line typescript-eslint/no-explicit-any, typescript-eslint/ban-typesconst component: Define…

C#面:阐述控制反转是什么?

控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是⾯向对象编程中的⼀种设计原则&#xff0c;可以⽤来减低计算机代码之间的耦合度。其中最常⻅的⽅式叫做依赖注⼊&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;&am…

深入解析C#中的Stopwatch类:精准计时的艺术

目录 引言 了解Stopwatch类 创建与使用Stopwatch 使用多个Stopwatch实例 性能分析与优化 结论 后记 引言 在软件开发中&#xff0c;性能分析是不可或缺的一环&#xff0c;它帮助我们识别瓶颈、优化代码&#xff0c;确保应用程序的高效运行。C#中的Stopwatch类便是开发者…