开发 Jenkins 插件:在 Hello World 之后

在看完 Jenkins 官网的插件教学之后,对实际开发 Jenkins 插件还是一头雾水。在实际东拼西凑出几个使用的插件之后,在这里分享一下,hello world 之后该怎么实现我们的功能。 Jenkins 是由 Java 实现,与 Ruby 等动态语言不同,我们无法直接 hook 或直接重写已有的方法来向系统注入功能。为了实现可扩展的能力,Jenkins 在设计上就实现了很多「接口」。比如 Job 设置中,执行 shell 脚本的步骤,就是由一个名为 builder 的类的子类实现。我们也可以写一个 builder 子类来实现另一种 build 步骤。Jenkins 本身预留了大量...

Swift 二进制库的兼容问题

Swift 发布二进制库,可没有那么简单。 不同于 ObjC,编译出二进制后(.a / framework)即完成了大部分工作,Swift 还有很多需要额外注意的问题,如多编译器版本产物不兼容问题,二进制之间的兼容性问题。而且个人在尝试过程中,也发现了一些与此相关的编译器 bug,相关的经验,值得分享一下。 编译器版本兼容 多编译器版本产物不兼容问题,随着 Swift 5.1 实现的 Module Stability 在理论上已经解决,在上一篇中有详细介绍。但在实际测试中发现,部分库生成的 swift interface 文件,被 xcode import 的时候会提示错误。比如常...

编译一个向后兼容的 swift 二进制库

Swift 5.0 实现了 ABI 稳定,使用 Swift 5.0 编译器编译出的二进制文件,可以被未来的版本所使用。但在使用 5.0.1 编译器引用一个 5.0 的二进制文件时,熟悉的错误仍然出现:不同编译器的产物不能相互引用。这是因为 swift 5.0 还没有达到 Module Stability。 Module stability 代表着描述模块 API 的信息格式稳定。这个信息会在编译时使用,它表明了这个库所有的类和函数都是什么,如同 c 语言的 header 文件一样。swift 把这个信息存在一个名为 .swiftmodule 的二进制文件中。由于这个文件在不同编译器间不...

Play with Anka: Try to build a dock-like iOS CI environment

Containerization is convenient for service deploying and environment isolating. Docker is a popular one, for Linux. Docker also has a Mac version, but it only provides a Linux container environment, not macOS, which cannot be used for iOS project building. (Dock for mac just run a Linux virtual m...

一个 iOS 开发者对 web 的窥探

App 开发大家轻车熟路。但是从一个开发 App 起家的人来说,web 开发是一种既陌生又熟悉的领域。熟悉在于开发 UI 程序的整体要素都是相通的:如何构建 UI,请求网络,变换/存储数据。而实现这些东西的方式却很不一样,这与 iOS / Android 之间的差别大很多。 专注一个方面,构建 UI。它的本质都是告诉所在环境(操作系统/浏览器)在屏幕上应该显示什么内容。这里无论是命令式的,还是声明式的都没有本质差别。对于 app 开发,系统提供的是某种编程语言调用的 API。比如在 iOS 中就是以 ObjC 形式提供的类与方法。而 web 提供的 API 则是对 html 文本(以及...