Swift에는 코드 검토를 위한 팀의 Slack Bot 이야기가 설치되어 있습니다.🚢

Giithub에서 팀에게 코드 검사를 요청한 Slack Bot이 Swift에 설치된 이야기🚢


서버측 Swift의 대표적인 프레임워크 Vappor를 사용하여 팀이 개발한 인프라에서 Pull Request를 게시할 때 같은 팀에 있는 누군가에게 무작위로 의견을 제출하는 Slack Bot을 구현합니다!
장인처럼 세련되게 하고 싶어서 Giithub Shokunin이라고 지었어요.👍
GithubShokunin 1.0.0-beta.1 완성🎉 https://t.co/TSrent6A3u — yuzushioh (@yuzushioh) December 24, 2016

현재 상황을 실현할 수 있는 GiithubShokunin.


지금 GiithubShokunin은 다음 하나만 할 수 있어요.😇
  • 슬랙에서 다음과 같은 평가를 통해 Giithub에서 멤버에게 랜덤으로 리뷰를 요청할 수 있다.
  • @Bot review #PR Number
    
    이런 느낌!

    GiithubShokunin 설치


    Vapor의 설치 방법은 ReadMe에 요약되어 있습니다!

  • 슬랙봇의 Token과 이름을 기록bot-config.json
  • {
        "token": "xoxo-2h4j43n5g3i2mn24g",
        "bot_name": "GithubShokunin"
    }
    
  • Giithub의 Token과 TeamId
  • 설정
    ※ 리뷰를 보고 중인 팀을 만들어야 합니다!
    {
        "owner_name": "yuzushioh",
        "repo_name": "GithubShokunin",
        "review_team_id": "12345",
        "github_token": "biub3h24vb53vjjv2v42v24g(sample)"
    }
    

    Vapor 정보


    Vapor


    ReadMe 설치


    다음 코드는 Hello World!실현할 수 있다!
    let drop = Droplet()
    
    drop.get("/") { request in
        return "Hello World!"
    }
    
    drop.run()
    

    GiithubShokunin 설치


    허봇을 사용할 수 없기 때문에 슬랙의 Real Time Messageing API를 사용하여 채트를 모니터링하고 있습니다.


    Vaper의 WebSocket


    다음과 같은 WebSocket Client를 만들 수 있습니다.
    import Engine
    import WebSockets
    
    try WebSocket.connect(to: url) { ws in
        print("Connected to \(url)")
    
        ws.onText = { ws, text in
            print("[event] - \(text)")
        }
    
        ws.onClose = { ws, _, _, _ in
            print("\n[CLOSED]\n")
        }
    }
    
    구성원 사용자가 bot-config.json 지정된 Bot이면 채팅 내용에 따라 처리됩니다.

    채팅 내용에 따라 연락처 만들기


    현황은 채팅의 내용을 바탕으로 다음과 같은 3개 부분으로 나뉜다.
    enum MessageContent {
        case requestReview(prNumber: String)
        case commandLine
        case unknown
    }
    

    Content에 따라 필요한 API 두드리기


    VaperDroplet를 사용하여 Giithub의 API 두드리기
    let response = try drop.client.get("http://github.com", query: ["q": "test"])
    
    Response의 JSON을 Model에 매핑합니다.
    guard let json = response.json else {
        throw BotError.invalidResponse
    }
    
    let pullRequest = try PullRequest(node: json.node)
    
    

    제작된 모델별로 Bot의 응답 작성

  • 슬랙메시지라는 모델
  • 을 준비했습니다.
    struct SlackMessage {
        let id: UInt32
        let channel: String
        let text: String
        let type: String
    
        init(to channel: String, text: String) {
            self.id = UInt32.random()
            self.channel = channel
            self.text = text
            self.type = "message"
        }
    }
    
    이 모형은 VaporNodeConvertible에 부합되고 모형으로 노드를 제작할 수 있습니다!
    extension SlackMessage: NodeConvertible {
        func makeNode(context: Context) throws -> Node {
            return try Node(node: [
                "id": id,
                "channel": channel,
                "type": "message",
                "text": text]
            )
        }
    
        init(node: Node, in context: Context)  throws {
            id = UInt32.random()
            channel = try node.extract("channel")
            text = try node.extract("text")
            type = try node.extract("type")
        }
    }
    
    제작된 슬랙 메시지를 멤버가 있는 슬랙 채널로 돌려보냅니다!!
    try WebSocket.connect(to: url) { ws in
        print("Connected to \(url)")
    
        ws.onText = { ws, text in
            ......
            let response = SlackMessage(to: message.channel, text: responseText)
            try socket.send(response)
        }
    
        ws.onClose = { ws, _, _, _ in
            print("\n[CLOSED]\n")
        }
    }
    

    생각

  • 허봇을 사용할 수 없기 때문에 커피스크립트로 쓸 때보다 코드량이 많이 늘었다.
  • Vapor는 처음 2주 정도 사용하지만 쓰기도 좋고 쓰기도 좋아요!
  • Vapor의 참고로 팀 개발에서 사용하십시오!

    좋은 웹페이지 즐겨찾기