Bob 👷

Bob 是一个可扩展的 Slack 机器人,使用 Swift 编写,用于与 TravisCIGitHub API 通信。它用于执行重复性的任务,这些任务不能完全自动化,例如为 App Store 创建发布候选版本。

只需在 Slack 上向 Bob 发送消息,它就会为您完成工作。

命令

Bob 使用命令操作。它自带一些可自定义的命令,但可以轻松创建新命令。有关更多信息,请参阅创建自定义命令

所有命令都通过输入 {name} 参数 来调用。
例如

build staging

可以触发 Travis 上的一个作业,该作业将使用 staging 配置创建一个构建版本,并将其分发给测试人员。
要查看命令应如何使用,请输入 {name} usage

Hello

一个虚拟命令,可用于检查 Bob 是否正在运行。只需对 Bob 说 hello,它就会向您问好。

Version

您可以通过输入 version 查看当前运行的 Bob 版本

Travis Script

TravisScriptCommand 是一个可配置的命令,它在 Travis 上触发一个作业并在那里执行脚本。该命令可以有多个目标,可以在运行时指定。
每个目标要运行的脚本在实例化命令时指定。
例如

let buildTargets = [
    TravisTarget(name: "staging", script: Script("fastlane ios distribute_staging")),
    TravisTarget(name: "testflight", script: Script("fastlane ios distribute_testflight")),
]
let buildCommand = TravisScriptCommand(name: "build", config: travisConfig, targets: buildTargets, defaultBranch: "Develop")
try bob.register(buildCommand)

将注册一个名为 build 的命令。输入 build staging 将在 Travis 上启动 lane distribute_staging

Align Version

iOS 特定命令,用于更改指定 .plist 文件中的 CFBundleShortVersionStringCFBundleVersion 值。
例如

let plistPaths: [String] = [
    "App/Info.plist",
    "siriKit/Info.plist",
    "siriKitUI/Info.plist"
]
let alignCommand = AlignVersionCommand(gitHub: gitHub, plistPaths: plistPaths, author: author)
try bob.register(alignCommand)

将注册一个可以通过输入 align 3.0 4 调用的命令。然后 Bob 将通过更改指定的 3 个文件在 GitHub 上创建一个提交。

Bump build number

iOS 特定命令,用于增加指定 .plist 文件中的 CFBundleVersion 值。如果构建号是数字,则将其增加 1。
例如

let plistPaths: [String] = [
    "App/Info.plist",
    "siriKit/Info.plist",
    "siriKitUI/Info.plist"
]
let bumpCommand = BumpCommand(gitHub: gitHub, plistPaths: plistPaths, author: author)
try bob.register(bumpCommand)

将注册一个可以通过输入 bump 调用的命令。然后 Bob 将通过更改指定的 3 个文件在 GitHub 上创建一个提交。

开始使用

在 Slack 上创建机器人

Bob 需要一个 Slack 令牌才能工作。您可以通过创建一个 Slack 机器人来获取令牌

  1. 打开自定义集成页面
  2. 选择 Bots
  3. 为您的机器人输入一个用户名。bobthebuilder 效果不错
  4. 复制 API Token 字段。Bob 将使用它连接到 Slack

启动它

Bob 可以像任何其他 Swift Package 一样设置,但由于它依赖于 Vapor💧,我们建议使用 Vapor 工具箱进行设置。要安装 Vapor 工具箱,您可以按照手册操作

一旦您设置好工具箱,就可以通过创建一个新项目开始

vapor new BobTheBuilder --template=n26/bob-vapor-template
cd BobTheBuilder

模板克隆完成后,Package.swift 应该包含

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "BobTheBuilder",
    dependencies: [
        .package(url: "https://github.com/n26/bob", from: "1.0.0"),
    ],
    targets: [
        // The Commands target is the place to add any new custom commands
        // When creating new commands, make sure that their Target Membership is set to `BobCustomCommands` and that they are public
        .target(name: "BobCustomCommands", dependencies: ["Bob"]),
        .target(name: "Run", dependencies: ["BobCustomCommands"])
        
        // If you don't plan to implement any custom commands, you can have only one target
        // .target(name: "Run", dependencies: ["Bob"])
    ]
)

您的所有自定义代码都将位于 Sources/BobCustomCommands 文件夹中。

通过运行以下命令创建一个 Xcode 项目

vapor xcode

打开 Sources/Run/main.swift 文件,配置内置命令或添加您自己的命令。启动 Bob 的最小 main.swift 文件是

import Vapor
import Bob

// https://api.slack.com/apps
let config = Bob.Configuration(slackToken: "your-slack-token")

let drop = try Droplet()
let bob = Bob(config: config, droplet: drop)

try bob.start()

您就可以开始了。选择 Run scheme 并运行它。您现在可以通过 Slack 向 Bob 发送消息,它会做出响应。

使用 TravisCI API

为了使用与 TravisCI API 通信的命令,您需要提供配置。配置包括

使用 GitHub API

为了使用与 GitHub API 通信的命令,您需要提供配置。配置包括

命令链

Bob 支持使用 1 条 Slack 消息发送多个命令。只需使用 | 分隔命令即可。
例如

sync strings | align 3.0 5 | build staging | build testflight

可以在为 App Store 创建发布候选版本时使用。它将更新仓库上的字符串,设置版本并为 2 个环境构建应用程序

创建自定义命令

可以创建自定义命令并提供给 Bob。要创建命令,请实现 Command 协议。

public protocol Command {
    
    /// The name used to idenitfy a command (`hello`, `version` etc.). Case insensitive
    var name: String { get }
    
    /// String describing how to use the command.
    var usage: String { get }
    
    /// Executes the command
    ///
    /// - Parameters:
    ///   - parameters: parameters passed to the command
    ///   - sender: object used to send feedback to the user
    /// - Throws: An error is thrown if something goes wrong while executing the command, usualy while parsing the parameters
    func execute(with parameters: [String], replyingTo sender: MessageSender) throws
    
}

实际工作发生在 execute 方法中。用户输入的所有参数都将作为 [String] 传递给该方法。要告知用户命令的进度,请调用 sender 对象上的 send 方法。它将通过 Slack 将消息发送给用户。如果在执行过程中发生任何错误,只需抛出它们即可。

使用现有 API

Bob 自带用 Swift 编写的 TravisCI 和 GitHub API 子集。

TravisCI

仅包含一个通过 TravisScriptCommand 公开的执行脚本的方法

GitHub

包含用于操作 GitHub 上的文件和树的底层方法。有关完整的方法集,请查看GitHub.swift