Posted on 5. April 2024

Transform your business with smart .NET apps powered by Azure and ChatGPT

Трансформуйте свій бізнес за допомогою розумних .NET-додатків на базі Azure та ChatGPT


За допомогою ChatGPT ви можете розкрити весь потенціал штучного інтелекту у своїх програмах .NET і гарантувати неймовірний досвід для користувачів від використання природної мови. ChatGPT — це більше, ніж просто інструмент; це те, що кардинально змінює те, як ми отримуємо доступ до даних і аналізуємо їх. Незалежно від того, використовуєте ви Azure, SQL Server або будь-яке інше джерело даних, ви можете легко інтегрувати ChatGPT у свої проєкти .NET і почати створювати інтелектуальні програми вже сьогодні.


У цій публікації я дам короткий огляд того, що таке інтелектуальні програми. Потім, використовуючи зразок програми, я покажу, як за допомогою комбінації служб Azure, таких як Azure OpenAI Service і Azure Cognitive Search, ви можете створювати власні інтелектуальні програми .NET.

TLDR

Ви найкраще вчитеся на практичному досвіді? Ознайомтеся з репозиторієм і приступайте прямо зараз!

Створіть свій власний розумний додаток .NET

Що таке розумні програми?

Розумні програми — це програми на основі штучного інтелекту, які змінюють продуктивність користувачів, автоматизують процеси та дають змогу отримувати різну інформацію.


Bing Chat є прикладом інтелектуальної програми.

Зображення розмови Bing Chat про рецепти


ШІ лежить в основі Bing Chat. Bing Chat використовує штучний інтелект для обробки складних запитів, узагальнення релевантної інформації з різних джерел і створення відповідей.


Створюйте інтелектуальні програми за допомогою .NET

Тепер, коли ви маєте уявлення про те, що таке інтелектуальні програми, давайте подивимося на приклад програми, створеної за допомогою .NET, Azure і ChatGPT.


Переглянути відео


Припустімо, у вас є внутрішня корпоративна база знань, яка містить інформацію про посади, плани охорони здоров’я та інші ділові документи.


Можливо, ваші користувачі вже можуть здійснювати пошук у цій базі знань, але пошук відповідей на конкретні запитання шляхом фільтрування всіх документів у результатах пошуку може зайняти багато часу.

Використовуючи моделі штучного інтелекту, такі як ChatGPT, ви можете змінити продуктивність своїх користувачів, узагальнюючи інформацію, що міститься в цих документах, формуючи ключові висновки.


Архітектура програми

Вихідний код програми знаходиться на GitHub. Нижче наведено основні компоненти програми.

Інтерфейс користувача

Інтерфейс програми є статичною веб-програмою Blazor WebAssembly . Цей інтерфейс приймає запити користувачів, направляє запити до серверної частини програми та відображає згенеровані відповіді. Якщо ви працюєте з клієнтськими програмами на мобільному телефоні чи настільному комп’ютері, .NET MAUI також буде хорошим варіантом для цього компонента.

Сервер програми

Бекенд програми — це мінімальний API ASP.NET Core . Серверна частина містить статичну веб-програму Blazor і те, що організовує взаємодію між різними службами. Послуги, які використовуються в цій програмі, включають:


– Azure Cognitive Search – індексує документи з даних, що зберігаються в обліковому записі Azure Storage. Це робить документи доступними для пошуку.


– Служба Azure OpenAI – надає моделі ChatGPT для створення відповідей. Крім того, Semantic Kernel використовується в поєднанні зі службою Azure OpenAI Service для організації більш складних робочих процесів ШІ.


Azure Redis Cache – кешує відповіді. Це зменшує затримку під час створення відповідей на схожі запитання та допомагає керувати витратами, оскільки вам не потрібно робити інший запит до служби Azure OpenAI.


Надання ресурсів і середовища для розробника

З усіма згаданими послугами процес початкового налаштування може здатися складним. Однак ми спростили цей процес за допомогою Azure Developer CLI . Якщо ви не хочете встановлювати будь-яку залежність, ми також можемо вам допомогти. Просто відкрийте репозиторій у GitHub Codespaces і використовуйте Azure Developer CLI, щоб надати свої послуги.


Використання ChatGPT у ваших документах

Тепер, коли ви знаєте компоненти, з яких складається ця програма, давайте подивимося, як вони працюють разом у контексті чату.


Перш ніж почати спілкуватися в чаті зі своїми документами, ви захочете мати базу знань, до якої можна зробити запит. Швидше за все, у вас вона вже є. Для цього прикладу програми ми зробили просту базу знань. У каталозі даних програми є набір PDF-документів. Щоб завантажити їх у Azure Storage та індексувати в Azure Cognitive Search, ми створили консольну програму C#.



Консольна програма C# виконує такі дії:

1. Використовує Azure Form Recognizer для вилучення тексту з кожного документа.

2. Розбиває документи на менші уривки. (нарізка)

3. Створює новий документ PDF для кожного з уривків.

4. Завантажує уривок до облікового запису сховища Azure.

5. Створює індекс у Azure Cognitive Search.

6. Додає документи до індексу когнітивного пошуку Azure.

 

Чому PDF-файли розбиваються на частини?


Моделі OpenAI, такі як ChatGPT, мають обмеження на токени. Щоб отримати додаткові відомості про обмеження маркерів, перегляньте довідковий посібник із квот і обмежень служби Azure OpenAI.


У цьому прикладі процес створення бази знань є ручним. Однак, залежно від ваших потреб, ви можете запускати його як завдання на основі подій щоразу, коли новий документ додається до облікового запису Azure Storage, або пакетно як фонове завдання.


Ще один шаблон, про який варто згадати, передбачає використання вбудовування для кодування семантичної інформації про ваші дані. Ці вбудовування зазвичай зберігаються у векторних базах даних. Щоб отримати коротку інформацію про вбудовування, перегляньте документацію щодо вбудовування Azure OpenAI . Цей шаблон не є основним, що використовується в цьому прикладі, і виходить за рамки цієї публікації. Однак у наступних публікаціях ми розглянемо ці теми більш детально, тож слідкуйте за оновленнями!


Спілкуйтеся зі своїми даними

Коли ви налаштуєте свою базу знань, настав час поспілкуватися з нею.


Зображення запитання, яке ставлять у веб-програмі ChatGPT .NET

Запит до бази знань починається з того, що користувач вводить запитання у веб-програмі Blazor. Потім запит користувача направляється до ASP.NET Core Minimal Web API.


Всередині веб-інтерфейсу API кінцева точка chat обробляє запит.

api.MapPost("chat", OnPostChatAsync);

Щоб обробити запит, ми застосовуємо шаблон, відомий як Retrieval Augmented Generation, який робить наступне:

1. Запитує в базі знань відповідні документи

2. Використовує відповідні документи як контекст для створення відповіді


Запит до бази знань


Запити до Бази знань відбуваються за допомогою когнітивного пошуку Azure. Хоча когнітивний пошук Azure не розуміє природну мову, надану користувачем. На щастя, ми можемо використовувати ChatGPT, щоб допомогти перекласти природну мову в запит.

 

Використовуючи семантичне ядро, ми створюємо метод, який визначає шаблон підказки та додає історію чату та запитання користувача як додатковий контекст для створення запиту Azure Cognitive Search.

Потім цей метод використовується для створення запиту на створення команди.

Коли ви запускаєте функцію семантичного ядра, вона надає складену команду моделі Azure OpenAI Service ChatGPT, яка генерує відповідь.

З огляду на питання "Що входить до мого плану Northwind Health Plus, чого немає в стандарті?", сформований запит може виглядати так: "Покриття плану Northwind Health Plus


Після створення запиту скористайтеся клієнтом Azure Cognitive Search, щоб зробити запит до індексу, що містить ваші документи.

На цьому етапі когнітивний пошук Azure поверне результати, які містять документи, які найбільше відповідають вашому запиту. Результати можуть виглядати так:


Northwind_Health_Plus_Benefits_Details-108.pdf: ви повинні надати Northwind Health Plus з копією EOB для первинного страхування, а також копію заяви, яку ви подали до свого первинного страхування. Це дозволить нам визначити переваги, доступні вам за Northwind Health Plus. Важливо зазначити, що Northwind Health Plus не покриває жодних витрат, які вважаються відповідальністю Основного покриття.

Benefit_Options-3.pdf: Плани також охоплюють профілактичні послуги, такі як мамографія, колоноскопія та інші скринінги на рак. Northwind Health Plus пропонує більш повне покриття, ніж Northwind Standard. Цей план пропонує покриття екстрених служб, як у мережі, так і поза мережею, а також покриття психічного здоров’я та зловживання психоактивними речовинами. Northwind Standard не пропонує покриття послуг екстреної допомоги, психічного здоров’я та токсикоманія, а також послуги поза мережею

Створення відповіді

Тепер, коли у вас є документи з відповідною інформацією, яка допоможе відповісти на запитання користувача, настав час використати їх для створення відповіді.


Ми починаємо з використання семантичного ядра для створення функції, яка створює запит, що містить історію чату, документи та додаткові запитання.

Чи жорстко ми кодуємо відповіді в запиті?


НЕ жорстко. Приклади в запиті слугують вказівками для моделі для створення відповіді. Відоме як кількакратне навчання.

Коли ви запускаєте функцію семантичного ядра, вона надає скомпонований запит для моделі Azure OpenAI Service ChatGPT, яка генерує відповідь.


Після деякого форматування відповідь повертається до веб-програми та відображається. Результат може виглядати приблизно так:


Зображення, на якому показано відповіді, згенеровані ChatGPT у веб-програмі .NET

Щоб підвищити довіру до відповідей, відповідь включає цитати, повну підказку, яка використовується для створення відповіді, і допоміжний вміст, що містить документи з результатів пошуку.

Створюйте власні інтелектуальні програми

Ми з нетерпінням чекаємо майбутнього інтелектуальних програм у .NET.

Перегляньте вихідний код програми на GitHub і використовуйте його як шаблон, щоб почати створювати інтелектуальні програми на основі власних даних.

 

Створіть свій власний розумний додаток .NET


 

Source




Posted on 30. April 2023

Почніть роботу з OpenAI Completions та .NET

 

Ласкаво просимо до цієї серії блогів про OpenAI та .NET!

Якщо ви тут новачок, перегляньте нашу першу публікацію, де ми представляємо цю серію та показуємо, як почати використовувати OpenAI у .NET.

Основна увага цієї публікації зосереджена на completions. Давайте розпочнемо!

Що таке completions?

Completions — це відповіді, згенеровані такою моделлю, як GPT.

Типи відповідей, які ви можете створити, включають:

Текст

Ввід:

Перекладіть «Hello» іспанською.

Вивід:

«Hola»

Код

Ввід

 

Створіть функцію C#, яка додає два цілі числа

Вивід

Зображення

Ввід

Затишний мопс в килимку

Вивід

Зображення, створене штучним інтелектом, зображення мопса 1 у масштабі 1 jpg

 

У цій публікації основна увага приділяється доповненню тексту та коду.

Як генеруються completions?

Є кілька частин, необхідних для створення completion:

- Модель

- Ввід користувача (запит)

Схема робочого процесу завершення AI (введення користувача, модель, завершення)

Ви можете розглядати модель як функцію зі збереженням стану. Модель — це система, розроблена для визначення шаблонів у даних за допомогою алгоритмів. Можливості моделі залежать від даних і алгоритмів, які використовуються для побудови моделі. Додаткову інформацію про різні типи моделей та їхні можливості див. у документації моделей Azure OpenAI Service .

Алгоритми, які використовуються для створення моделей OpenAI, таких як GPT, є нейронними мережами, відомими як трансформатори. Якщо говорити точніше, такі моделі, як GPT, часто називають великими мовними моделями (LLM - Large language model) через їх розмір (великі) і тип проблем, який вони призначені вирішувати (мова).

Технічні деталі LLM виходять за рамки цієї публікації. Однак, якщо вам цікаво дізнатися більше, перегляньте статтю Що робить ChatGPT…і чому він працює, а також документ Мовні моделі - це ті, хто навчається без особливих зусиль.

Ввід користувача, також відомий як запит (промпт), є тим, що керує моделлю та надає інструкції щодо того, що ви хочете отримати за допомогою неї. Для більш точних результатів промпт повинен мати такий вміст:

- Контекст

- Завдання / запитання

З огляду на наступний запит:

Підсумуйте це для учня другого класу:

Юпітер — п'ята планета від Сонця і найбільша в Сонячній системі. Це газовий гігант, маса якого в одну тисячу разів перевищує масу Сонця, і у два з половиною рази більша, ніж у всіх інших планет Сонячної системи разом узятих. Юпітер є одним із найяскравіших об’єктів, видимих ​​неозброєним оком на нічному небі, і був відомий стародавнім цивілізаціям ще до історичних пам’яток. Він названий на честь римського бога Юпітера.[19] Якщо дивитися з Землі, Юпітер може бути достатньо яскравим, щоб його відбите світло відкидало видимі тіні [20], і в середньому є третім за яскравістю природним об’єктом на нічному небі після Місяця та Венери.

Його можна розбити на:

- Контекст: Юпітер — п’ята планета від Сонця та найбільша в Сонячній системі. Це газовий гігант, маса якого в одну тисячу разів перевищує масу Сонця, і у два з половиною рази більша, ніж у всіх інших планет Сонячної системи разом узятих. Юпітер є одним із найяскравіших об’єктів, видимих ​​неозброєним оком на нічному небі, і був відомий стародавнім цивілізаціям ще до писемної історії. Він названий на честь римського бога Юпітера.[19] Якщо дивитися з Землі, Юпітер може бути достатньо яскравим, щоб його відбите світло відкидало видимі тіні [20], і в середньому є третім за яскравістю природним об’єктом на нічному небі після Місяця та Венери.

- Завдання/запитання: Узагальніть це для учня другого класу:

Отриманий completion має виглядати приблизно так:

Юпітер — п'ята планета від Сонця і найбільша в нашій Сонячній системі. Він дуже яскравий на нічному небі та відомий з давніх часів. Він названий на честь римського бога Юпітера. Зазвичай це третій за яскравістю об’єкт на нічному небі після Місяця та Венери.

 

Важливою частиною тут є завдання/запит, оскільки це те, що керує моделлю для отримання певного виду результату. Наприклад, якби я змінив завдання/запит на «Яка маса Юпітера порівняно з Сонцем?», я міг би розраховувати на завершення, подібне до «Юпітер має масу в тисячну частину від маси Сонця або 0,001 сонячної маси».

Як ви бачите, коли ви поєднуєте таку модель, як GPT, із добре сформованим запитом, вони формують ефективну основу для створення всіх типів додатків за допомогою ШІ.

Скільки тексту я можу надати у своєму запиті?

Розмір запиту вимірюється в токенах. Як правило, моделі GPT розбивають слова на «токени». Хоча звичайні багатоскладові слова часто складаються з однієї лексеми, менш поширені слова розбиваються на склади. Кожна модель має ліміт жетонів. Щоб отримати додаткові відомості, перегляньте документацію щодо моделей служби Azure OpenAI .

Щоб підрахувати кількість токенів у вашому запиті, скористайтеся пакетом Microsoft.ML.Tokenizers NuGet.

Подробиці режиму див. у прикладі токенізації .

Як почати генерувати власні completions?

Тепер, коли ви знаєте, що таке completions та як вони генеруються, настав час почати генерувати власні. Щоб почати:

1. Зареєструйтеся або подайте запит на доступ до OpenAI або Azure OpenAI Service .

2. Використовуйте свої облікові дані, щоб почати експериментувати із зразками OpenAI .NET .

Що далі

У наступному дописі ми детальніше розглянемо тему розробки запитів, яка є процесом оптимізації ваших промптів для отримання більш точних відповідей.

Ми хочемо почути від вас

Допоможіть нам дізнатися більше про те, як ви плануєте використовувати ШІ у своїх програмах. Приділіть кілька хвилин, щоб заповнити це опитування .

 

Чи є якісь теми, про які вам цікаво дізнатися більше? Дайте нам знати в коментарях.

Source



Posted on 14. September 2022

.NET 7 з’являється в Azure Functions & Visual Studio 2022

.NET 7 з’являється в Azure Functions & Visual Studio 2022

Ми раді повідомити, що Azure Functions v4 тепер підтримує .NET 7 як середовище виконання. Azure Functions приєднується до Azure  Web  Apps які також оголосили про підтримку .NET 7.

 

Для тих розробників, які розглядають можливість створення безсерверних функцій в Azure за допомогою останніх інновацій середовища виконання .NET, це дає можливість усім розробникам на планеті зосередитися на кодуванні з новими функціями .NET 7, готовими до широкомасштабного кодування, не турбуючись про базову інфраструктуру.

Що нового в .NET 7 з функціями Azure

Тепер ви можете створювати свої безсерверні додатки з .NET 7 в Azure Functions, використовуючи модель .NET Isolated Worker, яка забезпечує модель ізоляції, що відокремлює процес виконання функції від середовища виконання Azure Functions, забезпечуючи гнучкість, необхідну для орієнтації на різні версії .NET, більш ефективного управління залежностями та реєстрації служб.

 

Модель ізольованого працівника також дозволяє використовувати поточну поведінку .NET для ін'єкції залежностей і включення проміжного програмного забезпечення у вашу функціональну програму. Виберіть ізольовану модель, якщо ви переходите з .NET 5 Azure functions v3. Ця функція доступна для попереднього перегляду в усіх планах на базі Windows і Linux, а також у преміумпланах.

Як його випробувати?

Немає ніякої різниці, оскільки ви звикли створювати функцію Azure у середовищі виконання .NET 7 в ізольованому процесі. У нас є основні інструменти для створення нової функції Azure в .NET 7, а також підтримка в Visual  Studio 2022 17.4 Preview 1.

Функції Azure Основні інструменти

 

Для початку ми можемо скористатися основними інструментами Azure Functions Core Tools, щоб створити ізольовану структуру папок проєкту, як показано нижче:

func init --worker-runtime dotnet-isolated --target-framework net7.0

Потім використайте команду func new, щоб створити функцію HTTP-тригера. Нижче наведено приклад команди для створення функції з назвою DotNet7function за допомогою HTTP-тригера:

func new --name DotNet7Function --template "HTTP trigger"


А потім ви можете скористатися командою func start, щоб протестувати цю функцію.

 

func start


Visual Studio 2022

Visual Studio спрощує для всіх розробників створення безсерверних додатків з функціями Azure завдяки спрощенню процесу створення функцій, багатому досвіду локальної розробки та налагодження, а також швидкій публікації ваших .NET-додатків у Microsoft Azure.

Оновлення Visual Studio 2022 до версії 17.4 Preview 1.0

Дотримуйтесь процесу оновлення Visual Studio, описаного в офіційній документації, і переконайтеся, що ви виконуєте всі необхідні умови перед оновленням. Зверніть увагу, що вам потрібно встановити канал оновлення на Попередній перегляд у налаштуваннях Більше -> Оновлення з Visual Studio Installer, як показано нижче:

Переконайтеся, що ви встановили в меню Змінити -> Окремий компонент (Modify -> Individual Component), щоб включити .NET 7 SDK (попередній перегляд) і .NET 7.0 Runtime (попередній перегляд):

Створюйте свої Azure-функції

 

Коли ви створюєте нову функцію Azure у Visual Studio, ви знайдете нову опцію для .NET 7 Isolated:


Розгортання функцій Azure

 

Visual Studio надає простий спосіб опублікувати вашу програму в Microsoft Azure. Ви можете розгорнути свою безсерверну програму в Azure, просто клацнувши правою кнопкою миші на додатку функцій у Visual Studio і вибравши "Опублікувати". Виберіть ціль публікації та опублікуйте свої функції в Azure:

Наступні кроки

Ми з нетерпінням чекаємо на ваші відгуки та приклади використання, будь ласка, не соромтеся ділитися ними на оголошенням пов'язані з  обговорення,. Крім того, якщо ви виявите потенційні проблеми, будь ласка, запишіть їх на сторінці Azure  Functions .NET language  worker Репозиторій GitHub.

Надалі ми також тісно співпрацюватимемо зі спільнотою та гарантуємо, що ваші голоси будуть почуті. Ознайомтеся з нашою дорожньою картою продуктів, орієнтованих на громадськість, за посиланням: http://aka.ms/af-dotnet-roadmap.

Якщо вам цікаво дізнатися більше про Azure Functions v4, обов'язково подивіться нещодавній епізод На .NET епізод з Метью Хендерсоном та Фабіо Кавальканте з команди Azure Function.

Source



Posted on 2. July 2022

Початок роботи з DevOps і .NET MAUI

Початок роботи з DevOps і .NET MAUI

.NET Multi-platform App UI (.NET MAUI) об’єднує фреймворки інтерфейсу Android, iOS, macOS і Windows в єдину структуру, щоб ви могли написати одну програму, яка працює на багатьох платформах. У цій публікації ми розглянемо, як легко реалізувати основні пайплайни DevOps для програм .NET MAUI за допомогою GitHub Actions і Azure DevOps.

Починаємо

Перш ніж налаштовувати пайплайни, нам потрібно переконатися, що у нас є кілька готових файлів.

- Для iOS, вам потрібен сертифікат підпису та профіль надання. Цей посібник допоможе вам зрозуміти як отримати ці файли.

- (Необов’язково для цієї публікації) Для Android, вам потрібен файл сховища ключів і значення пароля сховища ключів та псевдонім сховища ключів. Цей посібник допоможе вам отримати файли.

- Для Windows, вам потрібно створити та експортувати сертифікат для підпису пакета. Ви можете дізнатись необхідні кроки в цьому посібнику.

 

Тепер ми готові розпочати створення пайплайнів для програми .NET MAUI. Ми розглянемо зразки пайплайнів, додані до репозиторію dotnet/maui-samples як частину програми Weather21 у папці devops.

Вихідні файли пайплайну

 

ПРИМІТКА. Ці початкові пайплайни для базового тестування та збирання, чудово використовувати для PR-перевірок. Ці дії не стосуються публікації для зберігання чи підписання для розповсюдження. Це буде виходити за рамки цієї публікації, і буде розглянуто в наступній публікації.

Приклади дій GitHub

- Агент розміщений на MacOS: macos-build.yml

- Агент розміщений на Windows: windowsCI.yml

Приклади Azure DevOps

- Агент розміщений на MacOS: azdo_mac.yml

- Агент розміщений на Windows: azdo_windows.yml

Огляд пайплайну

У нас є 2 файли пайплайну як для GitHub Actions, так  для Azure DevOps, один запускається на віртуальній машині macos-12 , що створює цілі  iOS і MacCatalyst. Інший працює на віртуальній машині windows-2022 та створює цілі Android та Windows.

Кожен пайплайн розбивається на такі підетапи:

1. Встановити версію .NET

2. Встановіть робочі навантаження .NET MAUI

3. Встановіть файли підпису (за потреби)

4. Створення/публікація програми для TargetFramework

5. Виконайте модульні тести (за потреби)

6. Завантажити артефакти

Це спрощений потік DevOps завдяки інструменту командного рядка dotnet, до якого ми зараз маємо доступ. Ми можемо dotnet build і dotnet publish для всіх типів TargetFramework. Немає потреби в складних і заплутаних сценаріях для керування встановленням msbuild та VS preview. Дякуємо всім учасникам за те, що це сталося!

 

Давайте розберемо завдання в кожному пайплайні.

Завдання пайплайну

Коротка порада. Перевірте доступні зображення віртуальних машин, розміщені на GitHub, і встановлене програмне забезпечення, перевіривши цю таблицю.

Швидка порада. Перевірте доступні  образи віртуальних машин та встановлене програмне забезпечення розміщені на Azure DevOps, перевіривши цю таблицю.


Спільними завданнями для обох пайплайнів є Setup .NET SDK Version та Install .NET MAUI.

Ось як це виглядає в GitHub Actions:

Перше завдання використовує GitHub Action Setup .NET Core SDK , а створення змінної пайплайну полегшує зміну версій у майбутньому.

Ось як це виглядає в Azure DevOps:

Перше завдання використовує завдання Azure Devops Use .NET Core, а створення змінної пайплайну полегшує зміну версій у майбутньому.

Наступне завдання Install .NET MAUI workloads виконується через вбудований скрипт. Ви можете налаштувати --source націлюватись на конкретні версії робочих навантажень .NET MAUI, а також ви можете дізнатися більше про зміну джерел у .NET MAUI Wiki.

Пайплайн агента збірки Mac

Завдання створення/публікації пояснюється в документації .NET MAUI:

- Опублікувати додаток MacCatalyst

- Опублікувати додаток для iOS

Наприклад, завдання «Опублікувати MacCatalyst» у GitHub Actions:

і те саме завдання в Azure DevOps:

Щоб полегшити роботу з dotnet publish, перший рядок переходить до папки, де існує  WeatherTwentyOne.sln. У простішій структурі сховища вам не знадобиться цей перший рядок.

Давайте розглянемо команду dotnet publish:


Останнім завданням є публікація артефактів у GitHub Pipeline, яка використовує дію GitHub Upload a Build Artifact.

В Azure DevOps це двоетапний процес: спочатку завдання «Копіювати файли» копіює файли в $(Build.ArtifactStagingDirectory), а потім завдання «Опублікувати артефакти збірки» публікує артефакт.

Існує один додатковий крок для iOS – встановлення сертифіката підпису та профілю надання.

Ця документація GitHub пояснює, як інсталювати ці файли як частину пайплайну для GitHub Actions. Дотримуючись інструкцій, це завдання:
На Azure DevOps, гайди Azure DevOps Sign your Apple App проведуть вас через процес додавання сертифіката та файлу профілю надання до бібліотеки захищених файлів. Після завантаження туди, завдання Install Apple Certificate та Install Apple Provisioning Profile установлять його як частину вашого завдання пайплайну. Ось як виглядатиме пайплайн:

Пайплайн Windows Build Agent

Завдання створення/публікації пояснюється в документації .NET MAUI:

- Опублікувати програму Windows

- Опублікувати додаток для Android

Наприклад, завдання Android Publish у GitHub Actions:
і те саме завдання в Azure DevOps:
Перший крок наводить до папки з WeatherTwentyOne.sln і виконує завдання dotnet publish. Давайте розглянемо команду dotnet publish:

Для Github Actions крок «Опублікувати артефакт» залишається незмінним, дія GitHub «Завантажити артефакт збірки» працює на обох Mac та Windows агентах.

Для Azure Devops завдання «Копіювати файли» та «Опублікувати артефакти збірки» працюють як на агентах Mac, так і на Windows.

Для Windows, є два додаткових завдання. Перший — це збереження та декодування файлу сертифіката підпису.

У GitHub Actions, цей процес наступний:

1. Створений файл сертифіката підпису має бути закодований у форматі Base64. Це можна зробити за допомогою certutil on Windows, дотримуйтесь документації. На Mac, ви можете запустити base64 -i <cert_file>.pfx | pbcopy

2. Рядок у кодуванні Base64 потрібно зберігати в GitHub Actions Secrets відповідно до документації GitHub Actions Encrypted Secrets Documentation.

 

3. Розшифруйте секрет у завданні пайплайну:

У Azure DevOps, дотримуйтесь посібника CI/CD Pipeline Overview і завантажте файл до Secure Files Library. Потім завантажте та встановіть файл за допомогою завдання Завантажити захищений файл:

Друге завдання полягає у використанні цього файлу сертифіката для підпису MSIX, згенерованого з dotnet publish. Дотримуючись цього посібника Azure DevOps, ми отримуємо таке завдання в GitHub Actions:

і те саме завдання в Azure DevOps, безпосередньо використовуючи фрагмент коду, наданий у посібнику:

У GitHub Actions для Android Signing, зразки пайплайнів містять завдання, розкоментуйте та перейдіть за посиланнями за потреби. Подібно до  Windows, спочатку закодуйте в Base64 і декодуйте файл Keystore. Наступне завдання — підписати згенерований файл apk за допомогою jarsigner. 

У Azure DevOps для Android Signing цей гайд крок за кроком показує, як підписати свою програму Android. Тут показано, як безпечно завантажити файли підпису, а потім як налаштувати завдання Azure DevOps для Android Signing.

Висновки

Сподіваюся, це допоможе вам розпочати налаштування DevOps для програм .NET MAUI за допомогою GitHub Actions та Azure DevOps. Зразки файлів yaml:

1. Приклади дій GitHub

- Агент розміщений на MacOS: macos-build.yml

- Агент розміщений на Windows: windowsCI.yml

2. Приклади Azure DevOps

- Агент розміщений на MacOS: azdo_mac.yml

- Агент розміщений на Windows: azdo_windows.yml

Перегляньте інші зразки на dotnet/maui-samples. Будь ласка, спробуйте .NET MAUI, дізнайтеся більше на dot.net/maui!

Source