假设我有 eg.com 域名用于访问家里的服务

a.eg.com A 记录 公网 IP
b.eg.com cname a.eg.com
在公网访问家里服务没有问题

内网路由器上绑定
a.eg.com -> 10.0.0.10
b.eg.com -> 10.0.0.11

此时从公网切到内网,访问 b.eg.com 会命中 cname a.eg.com 早先的公网 IP 记录
如果防火墙上只开启 wan -> lan 的规则没有开启 any -> lan 的规则,就会导致此时无法在内网访问 b.eg.com 的服务

解决办法很简单,给 b.eg.com 设置独立的 A 记录而不是 cname

感谢这篇文章的的指导 https://blog.csdn.net/lionking1990/article/details/112177556

看到这种类型的命令 \curl ... 于是研究了下,命令前面加反斜杠可以禁用 alias

比如你的 Shell 可能定义了 alias curl='curl -iL' 那么执行 \curl 的效果就是 curl 而没有 -iL 参数

或者你定义了另一个 alias customCmd='ls -lah' 那么执行 \customCmd 就会提示命令不存在

另外还有其他的方式禁用 alias :

1
2
3
"curl"
'curl'
command curl

博主竟然都没发现自己已经错误的使用 docker logging 好几年了。

博主习惯用 fluentd 收集容器和应用的日志,类似如下配置:

1
2
3
4
5
logging:
driver: fluentd
options:
fluentd-address: 127.0.0.1:24224
tag: nginx

既然是使用 Docker 那么想当然的就要用 Docker 启动 fluentd 了,同时在使用 docker-compose 编排容器时给所有其他容器添加了 depends_on: - fluentd 配置,以保证其他容器在启动时日志服务已经起来。

本来正常使用是没有问题的,但是当 Docker 服务重启(主机重启或直接重启服务)后,发现即使时添加了 restart:always 的容器也没有自动重启,纷纷停留在 Exit 状态。

通过排查,尝试将 fluentd 直接运行在宿主机上后容器重启正常,问题解决。个人猜测 Docker 在经历重启后并没有按照 docker-compose 的 depends_on 顺序进行重启,而部分重启在尝试重启时发现日志服务不在线固重启失败。

另外 fluentd 的主机安装方式可以参考 Fluentd Installation

分享一下 Drone 升级到 1.0 后发现的新特性或者坑。

Runner

1.0 以前的时候有过一阵需要部署 drone-agent 的版本,后来 drone 又可以独立运行。直到现在 1.0 版本drone 又要求了 Runner,当然如果你还是使用 Docker 部署,那么配置运行 drone-runner-docker 就好。

Trigger, Condition

现在的条件逻辑不一样了:

Note that all triggers must evaluate to true when combining multiple triggers.

也就是每个 trigger 的执行结果都要为 true 时才能触发,这个改到导致的结果是不能像以前那样同时配置 branch 和 event tag 的条件了,官方也做了解释:

Note that you cannot use branch triggers with tags. A tag is not associated with the source branch from which it was created.

就是说 tag 创建以后跟分支就没有关系了不能同时触发 branch 和 event trigger。

不过也有解决方法,通过配置 Reference trigger 可以同时满足分支推送或 tag 推送,如下:

1
2
3
4
trigger:
ref:
- refs/heads/develop
- refs/tags/*

同理 Steps 中的 When 关键词的逻辑同上

Orgsecret

上个版本的苦衷终于得到解决,每开一个项目都要配置 secret 只有企业版才有全局 secret ,现在 1.0 可以添加组织级别的 secret 了,不过 ui 中没有体现,需要用 drone-cli 配置:

1
drone orgsecret add ined rsync_key @/home/admin/.ssh/id_rsa

添加 orgsecret 后同 org 下的仓库部署就一劳永逸了。

Gitea

和 Gitea 的连接方式变了,通过在 gitea 上创建 application 并将 clientId, clientSecret 配置到 drone 中授权连接。

pull

每一步骤可以增加这个参数来跳过每次触发时拉取最新镜像的操作,否则每次任务可能会非常耗时:

1
2
3
pull: never
pull: if-not-exists
pull: always // 默认为 always

.drone.yml

配置文件的整体结构调整也很大,比如 Volume, Steps, 插件 settings 等等。

前阵子参考畅言的 API 文档给 flutter 做了畅言插件:

https://pub.dartlang.org/packages/flutter_changyan 方法的调用上倒还算不麻烦,但是在登录的时候需要搭配 webview 实现,在这里分享下我的思路。

首先 flutter 提供 webview 插件:https://pub.dartlang.org/packages/flutter_webview_plugin 可以控制打开的 url 以及监听 url 的变化,所以登录思路是:

  • 先通过畅言插件获取登录 url ->
  • 监听 url change 事件 ->
  • 调用 webview 打开登录 url 当三方登录成功后会跳会预配置的域名 ->
  • url change 时间监听到访问指定 host 截取 url 中的 code 参数 ->
  • 关闭 webview
  • 用 code 参数调用畅言插件登录功能保存登录成功的 token

下面是关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void _loginChangyan() {
final flutterWebviewPlugin = new FlutterWebviewPlugin();
flutterWebviewPlugin.onUrlChanged.listen((String url) {
var _uri = Uri.parse(url);
if (_uri.host == 'yourdomain.com' &&
_uri.queryParameters['code'] != null) {
Navigator.of(context).pop();
FlutterChangyan.login(_uri.queryParameters['code']).then((accessToken) {
print('login success: $accessToken');
});
}
});
FlutterChangyan.register('client id', 'client secret', 'callback url');
var loginUrl = FlutterChangyan.loginUrl();
Navigator.push(context, new MaterialPageRoute<void>(
builder: (BuildContext context) {
return new WebviewScaffold(
url: loginUrl,
appBar: new AppBar(
title: const Text('登录畅言'),
leading: new IconButton(
icon: const Icon(Icons.close),
onPressed: _handleWebViewClose
)
),
withZoom: true,
withLocalStorage: true,
);
},
));
}
0%