Algolia를 사용하여 GitHub 질문 추천 로봇 구축

GitHub 문제는 정적 컨텐츠입니다.만약 그들이 이럴 필요가 없다면?
우리가 (DevRels Chuck Meyer와 Bryan Robinson)이 이 점을 발견했을 때, 우리는 우리가 한번 시도해야 한다는 것을 알았다. 
우리는 Algolia를 하나의 동작에 통합시키는 유용한 도구를 찾고 싶다는 것을 알고 있다.사람들은 분명히 어떤 프로젝트를 진행해야 할지 고려하고 있다.우리는 색인 내용, 제품, 또는 가격을 내리는 일반적인 방법을 자세히 고려했다.그것들은 모두 인터넷 창작자에게 도움이 될 것이다.하지만 개원 관리자에게 도움이 될까요?이 가능하다, ~할 수 있다,...
우리는 어떻게 그들의 전체 업무 절차를 더욱 좋게 합니까?
그리고 우리는 갑자기 우리가 흔히 볼 수 있는 문제에 대해 건의를 할 수 있다면 어떻게 해야 하는가?우리는 관리자가 유사한 질문에 대답하는 부담을 줄일 수 있습니까?"큰 저장소에서""반복""으로 닫히는 문제는 얼마나 됩니까?"Algolia는 문제 작성자에게 관련되고 유용한 문제 목록을 제공할 수 있습니까?
스포일러 경보: 네, 정확합니다!

워크플로우 구조


개발자가 저장소에 문제를 추가할 때, 우리는 세 가지 절차를 실행해야 한다.
우선 관련 질문에 대한 Algolia 색인을 검색해야 합니다.그리고 우리는 이 결과를 가격 인하로 포장하여 최초의 문제에 대한 평론을 만들기 위해 작업에 전달할 것이다.마지막으로, 우리는 이 문제를 나중에 검색할 수 있도록 색인에 넣어야 한다.
매 단계마다 하나의 동작이 필요하다.Algolia의 구체적인 작업은 처음부터 만들어야 합니다.논평을 쓰는 동작에서 우리는 놀라운 피터 에반(Peter Evan)의create-or-update-comment Action를 사용하기로 결정했다. 사실은 GitHub이 동작에 관한 많은 문서에서 이 점을 사용했다는 것을 증명한다.
우리는 새로운 행동을 깊이 이해합시다.

검색 질의 실행


Google 워크플로우의 첫 번째 단계는 Algolia에 검색 질의를 보내는 것입니다.우리는 이 (Get Algolia Issue Records 를 위해 사용자 정의 조작을 만들었습니다. 
이 동작을 사용하려면 네 개의 필수 입력과 다섯 번째 입력을 보내야 합니다.
  • app_id: Algolia 계정에 있는 응용 프로그램의 ID입니다.저장소에 비밀로 저장하는 것이 좋습니다
  • .
  • api_key: Algolia 응용 프로그램의 인덱스에 대한 검색 권한이 있는 API 키입니다.이것은 저장소의 비밀 중 하나에 저장하는 것이 가장 좋다.
  • index_name: 검색할 Algolia 인덱스의 이름입니다.일치성을 유지하기 위해서 github.event.repository.name 변수를 사용하는 것을 권장합니다.
  • issue_title: github.event.issue.title와 함께 발견된 선동적인 문제의 제목.
  • max_results: (선택 사항) 주석의 여러 결과를 반환합니다(기본값은 3)
  • .
    우리는 이 변수를 가져와 선동적인 문제의 제목에 따라 similarQuery 검색했다.그런 다음 주석 본문과 태그 항목 목록을 만듭니다(GitHub 주석에 필요한 형식).이 출력은 Peter Evans' create-or-update-comment Action 로 전달됩니다.
    const { inspect } = require('util');
    const core = require('@actions/core');
    const algoliasearch = require('algoliasearch');
    
    async function run() {
      try {
        const inputs = {
          appId: core.getInput('app_id'),
          apiKey: core.getInput('api_key'),
          indexName: core.getInput('index_name'),
          issueTitle: core.getInput('issue_title'),
          maxResults: core.getInput('max_results'),
        };
        core.info(`Inputs: ${inspect(inputs)}`);
    
        if (!inputs.appId && !inputs.apiKey && !inputs.indexName) {
          core.setFailed('Missing one or more of Algolia app id, API key, or index name.');
          return;
        }
    
        inputs.maxResults = inputs.maxResults || 3;
    
        const client = algoliasearch(inputs.appId, inputs.apiKey);
        const index = client.initIndex(inputs.indexName);
    
        index.search('', { 
            similarQuery: inputs.issueTitle,
            hitsPerPage: inputs.maxResults
          }).then(({hits}) => {
          core.info(`Searching for record`);
          core.info(`Hits: ${inspect(hits)}`);
          const message = `## Other issues similar to this one:\n${hits.map(hit => `* [${hit.title}](${hit.url})`).join('\n')}`
          const listItems = `${hits.map(hit => `* [${hit.title}](${hit.url})`).join('\n')}\n`
          core.info(message)
          core.info(listItems)
          core.setOutput('comment_body', message);
          core.setOutput('issues_list', listItems);
        })
          .catch(err => {
            core.setFailed(err.message);
          }
        );
      } catch (error) {
        core.debug(inspect(error));
        core.setFailed(error.message);
        if (error.message == 'Resource not accessible by integration') {
          core.error(`See this action's readme for details about this error`);
        }
      }
    }
    
    run();
    

    Algolia 색인에 문제 추가


    워크플로우의 마지막 단계에서 Algolia 색인에 새 질문을 추가하여 향후 검색을 지원합니다.이를 위해 다른 GitHub 작업을 만들었습니다.Create or Update Algolia Index Record.이 작업은 JSON 파일에서 쓰기/읽기 대신 기록을 인덱스에 직접 추가/업데이트합니다.리포에 대한 메타데이터 (문제, 요청, 평론) 가 응용 프로그램 자체에 대한 색인을 구축하는 것이 아니라, 이것은 의미가 있다.
    이 동작을 사용하려면 create an Algolia API key 색인에 기록을 추가하거나 업데이트할 수 있는 권한이 필요합니다.그 밖에 우리는 환매 협의를 위해 새로운 색인을 만들 수 있는 권한을 가져야 한다.그렇지 않으면, 미리 그것을 만들고, 설정에서 색인 이름을 하드코딩해야 합니다.
    새 API 키 외에 다음과 같은 추가 입력이 필요합니다.
  • app_id: 위의 작업
  • 의 비밀이 저장소에 저장되어 있을 것입니다.
  • api_key: 인덱스에 기록을 저장할 수 있는 새 키입니다.이것은 저장소의 비밀 중 하나에 저장하는 것이 가장 좋다.
  • index_name: 이 기록을 추가하거나 업데이트하는 데 사용되는 Algolia 인덱스의 이름입니다.일치성을 유지하기 위해서 github.event.repository.name 변수를 사용하는 것을 권장합니다.
  • record: 색인에 추가할 JSON 기록을 나타내는 문자열입니다.
  • API 키에 권한이 있으면 저장소에 대한 색인이 작성됩니다.질문 제목과 URL(링크 반환)을 record로 추가합니다.작업흐름에서는 여러 줄 문자열이지만 유효한 JSON이어야 작동할 수 있습니다(자세한 내용은 참조https://www.algolia.com/doc/guides/sending-and-managing-data/prepare-your-data/#algolia-records.
    이 모든 입력을 가져와 Algolia API 실행saveObject을 통해 호출했습니다.우리는 issue ID를 색인 중의 objectID로 사용한다.만약 우리가 이후에 이벤트를 업데이트하거나 삭제하는 작업 흐름을 추가한다면, 기록을 이 문제와 쉽게 연결할 수 있을 것이다.
     
    const { inspect } = require('util');
    const core = require('@actions/core');
    const algoliasearch = require('algoliasearch');
    
    async function run() {
      try {
        const inputs = {
          appId: core.getInput('app_id'),
          apiKey: core.getInput('api_key'),
          indexName: core.getInput('index_name'),
          record: core.getInput('record'),
        };
        core.debug(`Inputs: ${inspect(inputs)}`);
    
        if (!inputs.appId && !inputs.apiKey && !inputs.indexName) {
          core.setFailed('Missing one or more of Algolia app id, API key, or index name.');
          return;
        }
    
        core.info(`Writing record to index ${inputs.indexName}`)
        const client = algoliasearch(inputs.appId, inputs.apiKey);
        const index = client.initIndex(inputs.indexName);
    
        index.saveObject(JSON.parse(inputs.record), {'autoGenerateObjectIDIfNotExist': true})
          .then(({ objectID }) => {
            core.setOutput('object_id', objectID);
            core.info(
              `Created record in index ${inputs.indexName} with objectID ${objectID}.`
            );
          })
          .catch((err) => {
            core.setFailed(`Failed to save object: ${err}`);
          });
    
      } catch (error) {
        core.debug(inspect(error));
        core.setFailed(error.message);
        if (error.message == 'Resource not accessible by integration') {
          core.error(`See this action's readme for details about this error`);
        }
      }
    }
    
    run();
    
    다음에 우리는 이 두 가지 새로운 조작을 기존의 평론 창설 조작과 결합시켜 우리의 업무 흐름을 구축할 것이다.

    전체 워크플로우 파일


    이 일을 하기 위해서 우리는 하나job와 세 개steps가 필요하다.각 단계마다 작업 중 하나가 사용됩니다.
    name: related-issues
    on:
      # Triggers the workflow on push or pull request events but only for the main branch
      issues:
        types: 
          - opened
    
    jobs:
      get-related-issues:
        permissions: 
          # Gives the workflow write permissions only in issues
          issues: write
        runs-on: ubuntu-latest
        steps:
          # Performs a search in an Algolia Index based on Issue Title
          # The Index should have historical Issues
          # Returns two outputs:
          # issues_list: a markdown list of issues
          # comment_body: a generic comment body with the list of issues
          - id: search
            name: Search based on issue title
            uses: brob/[email protected]
            with: 
              # Requires an Algolia account with an App ID and write key
              app_id: ${{ secrets.ALGOLIA_APP_ID }}
              api_key: ${{ secrets.ALGOLIA_API_KEY }}
              index_name: ${{ github.event.repository.name }}
              issue_title: ${{ github.event.issue.title }}
          - name: Create or Update Comment
            uses: peter-evans/[email protected]
            with:
              # GITHUB_TOKEN or a repo scoped PAT.
              token: ${{ github.token }}
              # The number of the issue or pull request in which to create a comment.
              issue-number: ${{ github.event.issue.number }}
              # The comment body. Can use either issues_list or comment_body
              body: |
                # While you wait, here are related issues:
                ${{ steps.search.outputs.issues_list }}
                Thank you so much! We'll be with you shortly!
          # An Action to create a record in an Algolia Index
          # This is a generic Action and can be used outside of this workflow
          - name: Add Algolia Record
            id: ingest
            uses: chuckmeyer/add-algolia-record@v1
            with:
              app_id: ${{ secrets.ALGOLIA_APP_ID }}
              api_key: ${{ secrets.ALGOLIA_API_KEY }}
              index_name: ${{ github.event.repository.name }}
              # Record needs to be a string of JSON
              record: |
                {
                  "title": "${{ github.event.issue.title }}", 
                  "url": "${{ github.event.issue.html_url }}", 
                  "labels": "${{ github.event.issue.labels }}",
                  "objectID": "${{ github.event.issue.number }}"
                }
    

    다음 단계


    우리는 이것이 관리자에게 도움이 되기를 희망하지만, GitHub 문제와 같은 정적 영역의 내용을 건의할 수 있는 더 좋은 방법을 다른 사람들에게 격려할 수 있기를 바란다.
    만약 당신이 완전한 작업 절차를 하고 싶다면 this repository에서 볼 수 있습니다.GitHub marketplace에서 검색과 섭취 조작을 제공하였다.
    GitHub과 다른 곳에서 검색과 발견은 자동화 작업 절차의 흥미로운 일부분이 될 수 있다.
    Post 및 Bot 작성자:
    .ltag__user__id__680058.작업 따르기 버튼
    배경색: #000000!중요
    색상: #fffff!중요
    테두리 색상: #000000!중요
    }

    찰 마이어 따라와.


    API driven. DevRel 🥑 at Algolia.
    .ltag__user__id__173278.작업 따르기 버튼
    배경색: #edffef!중요
    색상: #000000!중요
    테두리 색상: #edffef!중요
    }

    브라이언 로빈슨(Bryan Robinson)이 뒤를 이었다.


    I'm a designer, developer, lover of static sites and CSS

    좋은 웹페이지 즐겨찾기