树莓派教程:使用 Octopus Deploy 部署 .NET Core 应用程序到 Raspberry Pi 上

在过去的几年中,.NET Core 已经走过了很长的路,Octopus Deploy 也是如此。前一段时间,我们增加了对没有 Mono 运行时环境 Calamari 的支持,在这篇文章中,我将引导您如何将 .NET Core 应用程序部署到 Raspberry Pi 3 上,而不需要 Mono。

在这篇文章中,我将向您展示可以在 Raspberry Pi 3 上部署和运行 .NET Core 应用程序,并且一路介绍可以与 Octopus Deploy 服务器进行交互的一些不同方式。

准备环境

我们所需要的东西有:

  • 编辑器 - Visual Studio、Visual Studio Code、Rider
  • Octopus 命令行。
  • Octopus 服务器和一个 API 密钥。
  • .NET Core - https://www.microsoft.com/net/download/windows,https://www.microsoft.com/net/download/macos。
  • 运行有 Raspbian 的 Raspberry Pi 3,并安装了 .NET core 2.0 Runtime。
  • 对于 Angular 或 React 应用程序:
    • 在你的开发机器上安装有 node 和 npm - 如果你选择的应用程序需要它( Angular 或 React)。
    • 你的 Pi 上的 nodejs。
  • Curl

> ASP.NET在其捆绑包中包含 NodeServices,它需要在安装 Node.js 之后才能提供任何请求。当您在 Raspberry Pi 上安装 Node.js 时,它会安装 4.x 版本,并且可执行文件被称为 nodejs,但 NodeServices 会在您的路径中寻找 node。 你可以通过创建一个符号链接来解决这个问题:sudo ln -s /usr/bin/nodejs /usr/bin/node

构建应用程序

创建一个基础的 .NET Core 应用程序

dotnet new angular

修改应用程序以侦听外部请求

默认情况下,ASP.NET Core 应用程序仅向 http://localhost:5000 提供请求,以允许 Web 主机向本地网络提供请求,并在 Program.cs 中的 .UseStartup <startup>() 后添加以下内容:

.UseKestrel(options =&gt; {
    options.Listen(System.Net.IPAddress.Any, 5000);
})

有关配置 Kestrel Web 主机的更多信息,请查看文档

构建应用程序

npm install
dotnet build
mkdir publish
dotnet publish -o publish --self-contained -r linux-arm

打包

创建 .NET Core 应用程序包的最简单方法是使用 Octo.exe 命令行工具。

创建 artifacts 目录,然后使用 Octo Pack 命令创建包:

mkdir artifacts
octo.exe pack --id core4pi --version 1.0.0 --format zip --outFolder artifacts --basePath publish

再次使用 Octo.exe,来将包推送到服务器:

octo.exe push --server http://octopus/ --apikey API-ABCDEF123456 --package artifacts\core4pi.1.0.0.zip

构建服务定义

要使应用程序作为服务运行,请参阅 Microsoft 在 《Linux 上托管 .NET Core》 的文档。

创建一个名为 core4pi.service 的文件,其中包含以下文本:

[Unit]
Description=core4pi

[Service]
WorkingDirectory=#{Octopus.Action[deploy web site].Output.Package.InstallationDirectoryPath}
ExecStart=/usr/local/bin/dotnet "#{Octopus.Action[deploy web site].Output.Package.InstallationDirectoryPath}/core4pi.dll"
Restart=always
RestartSec=10
User=pi
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

> 上面的 core4pi.service 文本中的 [deploy web site] 字符串表示部署软件包的步骤的名称。

> 此输出变量将包含新安装的服务的路径。它将确保服务安装时正在查看最新版本。

为服务定义创建一个包,并将其推送到 Octopus 服务器:

octo.exe pack --id core4pi.service --version 1.0.0 --format zip --outFolder artifacts
octo.exe push --server http://octopus/ --apikey API-ABCDEF123456 --package artifacts\core4pi.service.1.0.0.zip

创建基础架构

如果您还没有为 Raspberry Pi 配置 Octopus 环境,请在命令行中创建一个环境:

octo.exe create-environment --server http://octopus/ --apikey API-ABCDEF123456 --name "Pi Dev"

或者使用Web界面: Infrastructure > Environments > Add Environments。

接下来,创建一个账户来访问 Pi,这可以是 Web 界面中 Infrastructure > Accounts 部分的用户名/密码或 SSH 密钥。

Raspberry Pi 账户

最后,在Infrastructure > Deployment Targets > Add Deployment Target 添加为SSH 目标下创建部署目标。将目标角色设置为代表目标责任的内容,例如 PiWeb。 填写详细信息(IP 地址或 DNS 名称,SSH 端口和帐户)后,在 .NET 部分下,确保选择未安装 Mono,不要担心该平台,稍后我们会更改。

修改目标配置以将 Calamari 版本指定为 linux-arm

这个代码可以很容易地从 LinqPad 运行

string machineId = "Machines-1";
HttpClient client = new HttpClient();
client.BaseAddress = new Uri(@"http:\\octopus");
client.DefaultRequestHeaders.Add("X-Octopus-Apikey", "API-ABCDEF123456");
var machineJson = client.GetAsync($"api/machines/{machineId}").Result.Content.ReadAsStringAsync().Result;
machineJson = machineJson.Replace("linux-x64","linux-arm");
client.PutAsync($"api/machines/{machineId}", new StringContent(machineJson));

第一行定义的 machineId,可以在查看部署目标 app#/infrastructure/machines/_machineId_/settings 或使用命令行时,从 Web Portal URL 获取:

octo list-machines --server http://octopus/ --apikey API-ABCDEF123456

您还可以使用 JSON 输出格式在 Powershell 中过滤命令行中的列表:

octo list-machines --server http://octopus/ --apikey API-ABCDEF123456 --outputformat=json | 
    ConvertFrom-Json | 
    % { $_ } |
    Where { $_.Name -eq 'target name' }

> %{$ _} 行展开了返回的顶层数组,这似乎是 Powershell 中 ConvertFrom-Json 命令的怪癖。

为 linux-arm 下载 Calamari

curl https://octopus.myget.org/F/octopus-dependencies/api/v2/package/Calamari.linux-arm/4.3.6 -L -o "c:\Program Files\Octopus Deploy\Octopus\Calamari.linux-arm.nupkg"

如果需要,请将输出路径替换为 Octopus 安装的路径。

> 将在未来的版本中将提供 linux-arm Calamari 软件包

创建部署项目

通过 Octopus 网页界面的部分或使用命令行创建一个新的项目:

octo create-project --server http://octopus/ --apikey API-ABCDEF123456 --name "PiWeb" --projectgroup "All projects" --lifecycle "Default Lifecycle"

为应用程序创建一个部署步骤

在新的 PiWeb 项目中,定义您的部署过程。

添加一个 Deploy a Package,称为 deploy web site

Environment 设置为 Pi Dev 环境。

Role 设置为 PiWeb 角色(或者将 SSH 目标角色设置为)。

Package 部分下,选择您推送到服务器的软件包,core4pi

这里的其余选项不需要配置。保存之。

为服务定义创建一个步骤部署

添加另一个 “Deploy a Package” 步骤。它将在目标上安装一个服务来运行应用程序。对于软件包选择,请从 Octopus Server(内置)软件包源中选择 core4pi.service 软件包。

服务安装步骤

为此步骤,您将需要 Configure Features

Feacture Configure

Substitute Variables in Files 功能中,添加服务定义文件 core4pi.service 的名称:

Substitute Variables

Configuration Scripts 功能下,选择 Bash,将下面的脚本粘贴到 Deployment Script 部分:

#!/bin/bash
if [ -e /lib/systemd/system/core4pi.service ]
then
    echo stopping service
    sudo systemctl stop core4pi.service
fi

echo installing service
sudo cp core4pi.service /lib/systemd/system/
sudo chmod 644 /lib/systemd/system/core4pi.service
sudo systemctl daemon-reload
sudo systemctl enable core4pi.service
echo starting service
sudo systemctl start core4pi.service

该脚本将在执行步骤中,执行并执行服务安装。

部署

在项目导航菜单上,点击 Create Release

Create Release 页面将允许您为发布版本设置版本号,您可以保留默认值。它还将允许选择要部署哪些版本的软件包,默认情况下它会选择最新版本。

点击 Save,然后点击 Deploy to PI Dev,然后按 Deploy 以开始部署过程。

Create Release 也可以从命令行执行:

octo create-release --server http://octopus/ --apikey API-ABCDEF123456 --project "PiWeb"
octo deploy-release --server http://octopus/ --apikey API-ABCDEF123456 --project "PiWeb" --deployto="Pi Dev" --version "0.0.1"

> 第一次部署时,Octopus Server 会在目标机器上更新 Calamari,这可能需要几分钟的时间。

测试

部署完成后,导航到到 Raspberry Pi 的 IP 地址或 DNS 名称的 5000 端口,应该会看到该应用程序。

It Works

结论

通过一系列不同的技术,将 .NET 部署到 Raspberry Pi 是可能的,而 Octopus Deploy 可以轻松实现。在整篇文章中,您还看到了可以与 Octopus 服务器集成的多种不同方式,包括命令行,API 和 Web 门户。

如果您有兴趣自动部署 .NET Core 应用程序,请下载 Octopus Deploy 试用版,并查看我们的文档。

英语原文链接:https://octopus.com/blog/deploying-an-octopus-pi

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.