Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

Probot에서 YAML 설정파일 사용하기

최근에 Probot으로 이것저것 해본 관계로 Probot 관련 글을 연달아 쓰고 있다.

context.config

App을 만들고 혼자서만 사용한다면 코드에 설정이 하드코딩 되어도 크게 문제가 되진 않지만 다른 사람도 사용하게 배포하거나 서버 배포 없이 쉽게 설정을 변경하려면 설정 파일로 관리하는 게 좋다. 예를 들어 Stale같은 경우는 며칠 동안 활동이 없으면 어떤 라벨을 붙이고 며칠 뒤에 이슈를 닫을지 지정해야 하는데 해당 저장소에 .github/stale.yml 파일을 커밋하면 이 파일을 가져다가 Stale 앱이 사용한다. mocha.js에서 사용하는 stale.yml에서 그 내용을 확인할 수 있다.

저장소에 올려놓은 YAML 파일은 context.config로 읽어올 수 있다.

다음 index.js를 보자.

module.exports = async app => {
  app.log('Yay, the app was loaded!')

  app.on('issues.opened', async context => {
    const config = await context.config('ping.yml')

    // use config
  })
}

config()함수는 context 객체가 있어야 하므로 이슈 생성 등 이벤트 리스너 안에서 사용해야 한다. context.config('ping.yml') 처럼 사용하면 해당 저장소의 .github/ping.yml을 찾아서 읽어온다. 이 함수는 Promise를 반환하므로 Promise로 사용하거나 위 예제처럼 async/await를 이용해야 한다.

name: example
label: test

YAML 파일을 자동으로 파싱해 주므로 위의 YAML은 아래처럼 Object literal로 변환된다.

{
  name: 'example'
  label: 'test'
}

context.config('ping.yml')에서 기본값을 사용할 수도 있는데 context.config('ping.yml', { days: 10 })처럼 두 번째 인자에 객체를 넘기면 읽어온 값과 머지되어 기본값으로 사용할 수 있다.

GitHub App의 사용자가 설정해야 하는 값은 이렇게 context.config()를 통해 지정하게 할 수 있다. 추가로 한 org 밑에서 여러 저장소에서 설정값을 공통으로 사용하려면 probot-config를 사용해야 한다.

2018/07/31 03:16 2018/07/31 03:16

Probot: Commands를 사용해서 GitHub 댓글로 봇 실행하기

Probot에 대한 글을 썼는데 Probot에는 몇 가지 확장 프로그램을 제공하고 있다. 이 확장을 통해서 GitHub App을 만들 때 공통으로 사용할 만한 기능을 제공하고 있다.

Probot: Commands

Probot: Commands는 PR이나 이슈에서 특정 명령어를 통해 App이 동작하도록 하는 기능이다. Probot의 기본 앱은 이전 글에서 살펴봤는데 이때 index.js는 아래와 같이 생겼다.

/**
 * This is the entry point for your Probot App.
 * @param {import('probot').Application} app - Probot's Application class.
 */
module.exports = app => {
  // Your code here
  app.log('Yay, the app was loaded!')

  app.on('issues.opened', async context => {
    const issueComment = context.issue({ body: 'Thanks for opening this issue!' })
    return context.github.issues.createComment(issueComment)
  })

  // For more information on building apps:
  // https://probot.github.io/docs/

  // To get your app running against GitHub, see:
  // https://probot.github.io/docs/development/
}

probot-commands는 GitHub 이슈나 PR에서 /로 시작하는 명령어를 받아서 해당 명령어를 실행하게 된다. 위 index.js를 아래와 같이 변경한다.

const commands = require('probot-commands')

module.exports = app => {
  app.log('Yay, the app was loaded!')

  commands(app, 'echo', (context, command) => {
    const issueComment = context.issue({ body: command.arguments })
    return context.github.issues.createComment(issueComment)
  });
}

commands(app, 'echo', (context, command) => {})에서 echo라는 명령어가 댓글로 남겨지면 이 콜백 함수가 실행된다. 여기서 다른 API를 호출하거나 원하는 작업을 수행할 수 있는데 여기서는 예제이므로 사용자가 /echo contents라고 댓글로 남기면 이 contents라는 문자열(command.arguments)을 받아서 다시 댓글로 남겨주도록 작성했다.

이를 위해서 GitHub App이 댓글 이벤트도 웹 훅으로 받도록 App의 이벤트 목록을 수정한다.

GitHub App의 이벤트 설정

앱 설정에서 Issue comment 이벤트도 설정했다.

GitHub 댓글에 Probot이 댓글을 남긴 모습

이제 GitHub 저장소의 댓글에서 /echo 명령어로 댓글을 남기면 Probot이 받아서 해당 내용을 다시 올리는 것을 볼 수 있다.

2018/07/30 23:18 2018/07/30 23:18