在过去的几年中,.NET Core 已经走过了很长的路,Octopus Deploy 也是如此。前一段时间,我们增加了对没有 Mono 运行时环境 Calamari 的支持,在这篇文章中,我将引导您如何将 .NET Core 应用程序部署到 Raspberry Pi 3 上,而不需要 Mono。
在这篇文章中,我将向您展示可以在 Raspberry Pi 3 上部署和运行 .NET Core 应用程序,并且一路介绍可以与 Octopus Deploy 服务器进行交互的一些不同方式。
我们所需要的东西有:
> ASP.NET在其捆绑包中包含 NodeServices,它需要在安装 Node.js 之后才能提供任何请求。当您在 Raspberry Pi 上安装 Node.js 时,它会安装 4.x 版本,并且可执行文件被称为 nodejs
,但 NodeServices 会在您的路径中寻找 node
。 你可以通过创建一个符号链接来解决这个问题:sudo ln -s /usr/bin/nodejs /usr/bin/node
。
dotnet new angular
默认情况下,ASP.NET Core 应用程序仅向 http://localhost:5000
提供请求,以允许 Web 主机向本地网络提供请求,并在 Program.cs
中的 .UseStartup <startup>()
后添加以下内容:
.UseKestrel(options => {
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 密钥。
最后,在Infrastructure > Deployment Targets > Add Deployment Target 添加为SSH 目标下创建部署目标。将目标角色设置为代表目标责任的内容,例如 PiWeb。 填写详细信息(IP 地址或 DNS 名称,SSH 端口和帐户)后,在 .NET 部分下,确保选择未安装 Mono,不要担心该平台,稍后我们会更改。
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
命令的怪癖。
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
:
在 Substitute Variables in Files
功能中,添加服务定义文件 core4pi.service
的名称:
在 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 端口,应该会看到该应用程序。
通过一系列不同的技术,将 .NET 部署到 Raspberry Pi 是可能的,而 Octopus Deploy 可以轻松实现。在整篇文章中,您还看到了可以与 Octopus 服务器集成的多种不同方式,包括命令行,API 和 Web 门户。
如果您有兴趣自动部署 .NET Core 应用程序,请下载 Octopus Deploy 试用版,并查看我们的文档。
观光\评论区