原文地址:felixblaschke.medium.com/auto-updati…
原文作者:felixblaschke.medium.com/
发布时间:2021年4月21日
最近我用Dart做了一些实验。我想有一个HTTP服务器,可以提供前端代码和一些简单的后端逻辑。一切都应该在一个虚拟的私人服务器(v-server)上运行。
线索是。我希望它能在我向Git仓库推送东西时自动更新/重新部署。而且它应该在没有任何复杂的CI管道的情况下完成工作。下面是我的结果。
我的方法是编写一个纯Dart应用程序。它创建了一个HTTP服务器。为此我使用了Alfred,因为它的使用非常简单,令人难以置信。
import 'dart:io';
import 'package:alfred/alfred.dart';
void main() async {
var app = Alfred();
app.get('*', (req, res) => Directory('public'));
await app.listen(8080);
}
复制代码
这将启动一个由Dart驱动的HTTP服务,提供公共目录中的所有文件。
然后我利用了一个定时器,它将定期尝试git拉取一些东西。这在Dart中很容易做到。
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:alfred/alfred.dart';
void main() async {
var app = Alfred();
app.get('*', (req, res) => Directory('public'));
await app.listen(8080);
registerUpdater(onExit: () => app.close());
}
void registerUpdater({required void Function() onExit}) {
Timer.periodic(Duration(seconds: 60), (timer) async {
var process = await Process.start('git', ['pull']);
var hasUpdated = false;
await process.stdout.transform(utf8.decoder).forEach((line) {
hasUpdated = line.startsWith('Updating') || hasUpdated;
});
await process.exitCode;
if (hasUpdated) {
print('Close app for update');
onExit();
timer.cancel();
}
});
}
复制代码
每当它检测到一个更新,它就会关闭应用程序。现在我们只需要一个机制来自动重新启动应用程序。在这一点上,Linux的systemd服务很方便。
[Unit]
Description=dartbackend
[Service]
User=root
Type=simple
ExecStart=/usr/bin/dart bin/dart_backend.dart
WorkingDirectory=/root/dart_backend
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
复制代码
它总是确保我的Dart后端在运行。(请记住,这个服务配置的例子并不完美,因为它使用了root用户。) 如果你想自己尝试一下。下面是要做的步骤。
- 用Dart和Alfred(或任何其他软件包)编写你自己的HTTP服务,并使用上面的代码。提交并推送所有内容到Git仓库。
- 如果你是v-server的新手,我建议使用Ubuntu或任何基于Debian的Linux发行版。这些都有大量的文档。
- 在你的虚拟服务器上进行接下来的步骤。
确保安装好Git并授权给你的Git提供者账户
这只是一种方法。也许你知道其他的解决方案?欢迎在评论中发表。
下次再来吧
- 菲利克斯-