Deno, Cloud Run 및 Cloud Build를 사용하여 이완 명령을 만드는 방법!

11082 단어 cloudrunslackgcpdeno

인용문:


당신과 당신의 팀은 slack을 사용합니까?이 느슨한 명령을 보셨을 수도 있습니다.당신이 입력한 멋진 명령들, 정보를 추가하면 마력이 생긴다.

slack 명령을 직접 사용하고 싶다면, 이 시리즈는 어떻게 사용하는지 알려 줍니다.데노의 모든 내용을 알고 클라우드 운행을 시작하거나 클라우드 구축의 실제 응용을 보고 싶다면 이 시리즈도 유용합니다.
기왕 이렇게 된 이상, 세이드, 나는 네가 이 시리즈를 좋아하길 바란다.

외치는 것은 무엇입니까?


그걸 물어보라고.너는 이런 상황을 만난 적이 있니? 너는 아무 일도 하지 않고, 변론이나 대화에서, 너는 정말로 너의 관점을 표현하고 싶니?다른 방식으로 당신의 관점을 해석하는 것은 도움이 될 수 있지만, 당신의 관점에 대한 열정을 보이고 싶지 않습니까?왜 큰소리로 말하지 않습니까?그것은 사람들로 하여금 이 점을 이해하게 할 것이다.
이것이 바로 이 프로젝트의 중점입니다. 이것은 재미있는 작은 프로젝트입니다. slack 명령을 사용하여 재미있는 방식으로 당신의 의견을 외칠 수 있습니다.
이 프로젝트의 계획은 Deno에서 실행하고,cloud run으로 배치하고,slack에 연결하고,cloud build로 CI/CD 배치를 설정하는 것입니다.

Deno:


너는 Deno가 도대체 무엇인지 생각할 수 있다.Deno는 런타임 환경입니다.노드 같아.js.실제로 그것은 노드를 만든 같은 사람이 만든 것이다.js,Ryan Dahl.라이언은 노드에서 저지른 실수를 바로잡으려고 한다.js.그는 2018년 한 강연에서 자신의 유감에 대해 이야기했다. 10 Things I Regret About Node.js 여기서 마음대로 보세요.
Typescript 및 Javascript를 실행할 수 있습니다.Typescript 지금 실행!설치할 필요가 없습니다.저는 Typescript의 슈퍼 팬입니다. 그래서 반갑습니다.

시작:


우선, 우리는 install Deno가 필요하다.
완성되면 단말기를 마음대로 열고 테스트를 할 수 있다.
deno --version
이제 이 특정 프로젝트의 일이 순조롭게 진행되도록 하겠습니다.특정 버전의 Deno를 설치해야 합니다.Deno는 매우 빠르게 발전하여 최신 버전의 Deno는 최신 버전의 소프트웨어 패키지와 함께 사용할 수 없는 경우가 많다.따라서 특정 버전을 보존하면 모든 것이 예상대로 진행될 수 있다.그럼에도 불구하고 우리는 1.3.2 버전을 설치하기를 희망한다
deno upgrade --version 1.3.2
deno --version
데노가 잘 될 수 있도록 하세요. 우리는 계속 전진할 준비가 되어 있습니다!
또한 yarn(Node.JS 패키지 관리자)을 사용하고 있습니다.그러나 스크립트를 실행하기 위해서만 사용합니다.따라서 설치는 필수적이지 않지만, 매우 편리하다.

코드:


시작합시다!간단한 서버부터 시작합시다.
main이라는 파일을 만듭니다.다음 코드 비트를 추가합니다.
import {Application, Router} from 'https://deno.land/x/[email protected]/mod.ts';
import bodyParser from './body-parser.ts';
import 'https://deno.land/x/dotenv/mod.ts';

const app = new Application();
const PORT = Deno?.env?.get('PORT') ?? 8080;
const router = new Router();

/**
 * Submit text to be shouted
 *
 * @example
 * curl -X POST "https://localhost:8080/" --data '{"text":"TEST"}'
 * https://api.slack.com/interactivity/slash-commands#app_command_handling
 * @param {object} req request object.
 * @param {object} req.body The request payload.
 * @param {string} req.body.text The user's text.
 * @param {object} res response object.
 */
router
    .post('/', async (context) => {
      try {
        // Get the Body:
        const body = await context.request.body();
        if (!context.request.hasBody) {
          context.response.status = 400;
          context.response.body = {
            success: false,
            message: 'No data provided',
          };
          return;
        }
         const json = await context.request.body({type: "json"}).value;
        const result = await FetchShoutCloud(json.text! as string);

        context.response.status = 200;
        context.response.type = 'application/json';
        context.response.body = {
          'text': `${result}`,
        };
        return;
      } catch (error) {
        console.error(error);
        context.response.status = 500;
        return;
      }
    });

async function FetchShoutCloud(command: string): Promise<string> {
  const data = await (await fetch('HTTP://API.SHOUTCLOUD.IO/V1/SHOUT', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({'INPUT': command}),
  })).json();
  return data.OUTPUT;
}

app.use(router.routes());
app.use(router.allowedMethods());

app.addEventListener("listen", ({hostname, port, secure}) => {
    console.log(
      `Listening on: ${secure ? "https://" : "http://"}${
        hostname ?? "localhost"
      }:${port}`
    );
  })

await app.listen({port: Number(PORT)});

export default app;
와, 코드가 너무 많아!이 코드를 분해해 봅시다. 그러면 여기서 무슨 일이 일어났는지 이해할 수 있습니다.
import {Application, Router} from 'https://deno.land/x/[email protected]/mod.ts';
import bodyParser from './body-parser.ts';
import 'https://deno.land/x/dotenv/mod.ts';

const app = new Application();
const PORT = Deno?.env?.get('PORT') ?? 8080;
const router = new Router();
파일의 맨 위에 몇 개의 패키지를 가져와야 합니다.
전통적으로 노드를 사용한다.React 또는 Angular와 같은 JS 또는 프런트엔드 응용 프로그램 패키지json이 필요합니다. 의존항은 node\u packages 폴더에 다운로드됩니다.이 프로젝트는 이 파일들을 사용하여 모든 소프트웨어 패키지를 사용할 것입니다.그러나 가방 안에는 의존항이 없다.json 또는 node_ 패키지.그럼 데노는 어떻게 했을까요?그 밖에 왜 가져온 가방의 위치는 URL이지 가방 폴더가 아닙니까?
간단하게 말하자면, 데노는 패키지 관리자가 없다.이것은 이 URL에서 패키지를 다운로드하고 (때때로 특정 버전이 있음) 패키지를 전역 디렉터리에 캐시합니다.모든 프로젝트에 대한 대량의 node\u 패키지 폴더를 줄일 수 있습니다.깔끔하죠?
우리는 그것을 사용하여 세 개의 가방을 가져올 것이다.
  • 로컬 저장소에서 온 bodyParser.참고: 이것은 향후 게시물에 사용됩니다.이것은 POST 요청으로부터 이완 명령을 받는 데 필요합니다.
  • dotenv에서 환경 변수를 가져옵니다.

  • Oak, 우리가 사용할 웹 서버.
  • Oak는 본질적으로 Node JSKoa 프레임워크의 Deno 버전입니다.만약 네가 이전에 이것을 사용한 적이 있다면, 너는 익숙한 곳에 있을 것이다.어쨌든, 그것은 초보자의 우호적인 틀이다.
    다음 몇 줄에서 우리는 오크 프로그램을 시작할 것이다.나중에 라우터를 만들 것입니다. 라우터를 만들 수 있도록 중간부품을 만들 것입니다. (요청한 경로 이름 기반)
    router
        .post('/', async (context) => {
          try {
            // Get the Body:
            const body = await context.request.body();
            if (!context.request.hasBody) {
              context.response.status = 400;
              context.response.body = {
                success: false,
                message: 'No data provided',
              };
              return;
            }
            const json = await context.request.body({type: "json"}).value;
            const result = await FetchShoutCloud(json.text! as string);
    
            context.response.status = 200;
            context.response.type = 'application/json';
            context.response.body = {
              'text': `${result}`,
            };
            return;
          } catch (error) {
            console.error(error);
            context.response.status = 500;
            return;
          }
        });
    
    async function FetchShoutCloud(command: string): Promise<string> {
      const data = await (await fetch('HTTP://API.SHOUTCLOUD.IO/V1/SHOUT', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({'INPUT': command}),
      })).json();
      return data.OUTPUT;
    }
    
    우리가 실현할 경로는 기본 URL에 대한 POST 요청이다.우리는 요청한 본문을 얻을 것이다.만약 실체가 없다면, 우리는 오류를 되돌릴 것이다.본문이 있으면 내용을 해석하고 결과를 ShoutCloud라는 API에 전달합니다.그들은 요청의 대소문자를 처리합니다.마지막으로 이 API 요청에서 결과를 얻어 JSON 응답 형식으로 결과를 반환합니다.
    이 과정에서 무슨 일이 발생하면 오류를 던져 500개의 오류를 되돌려줍니다.
    언어 환경은 무엇을 의미합니까?컨텍스트는 Oak 중간부품을 통과하는 현재 요청을 나타냅니다.여러 개의 중간부품 기능이 통과되었을 때, 그것은 매우 유용하다.
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    app.addEventListener("listen", ({hostname, port, secure}) => {
        console.log(
          `Listening on: ${secure ? "https://" : "http://"}${
            hostname ?? "localhost"
          }:${port}`
        );
      })
    
    await app.listen({port: Number(PORT)});
    export default app;
    
    마지막으로 Oak 응용 프로그램에 공유기 중간부품을 사용하라고 알려야 합니다.우리는 모든 루트 처리를 실행하는 중간부품으로 돌아갈 것이다.두 번째 줄은 허용된 방법을 처리할 것이다.만약 어떤 루트가 어떤 방법을 처리하지 않는다면, 405 오류를 되돌려줍니다!즉, 사용자가 POST 요청이 아닌 GET 요청을 사용하려고 하면 405 오류가 발생합니다.
    다음은 응용 프로그램이 시작되고 요청을 탐지하기 시작할 때입니다.우리는 컨트롤러에서 응용 프로그램이 정확한지 알아보는 피드백을 얻을 것이다.
    마지막으로, 응용 프로그램이 요청을 정탐하기 시작합니다!

    실행 중:


    우리는 곧 도착할 것이다.이제 파일을 실행할 때가 되었습니다!
    명령을 입력합니다.
    deno run --allow-env --allow-net ./main.ts
    
    Deno는 기본적으로 샌드박스 환경에서 작동합니다.이것은 사용자가 명확하게 허용하지 않는 한 기본적으로 권한이 없다는 것을 의미한다.이 경우 다음과 같은 두 가지 권한을 허용합니다.
  • - 환경 허용: 환경 변수에 액세스할 수 있습니다.
  • - 네트워크 허용: 인터넷 액세스 허용
  • 터미널에서 로컬 호스트 8080에서 프로그램이 탐색하는 것을 볼 수 있습니다/
    얘가 작동하기 시작했어!

    테스트:


    지금 우리는 이미 운행했으니, 우리 테스트를 합시다!POST 요청은 어떻게 테스트합니까?우리는 터미널을 통해 완성할 수 있지만, 일을 더욱 쉽게 할 수 있다.
    Insomnia라는 API 브라우저를 사용합니다.구체적으로 말하면 Insomnia Core.이것은 restful API와 GraphQL API를 탐색하는 간단한 방법이다.
    설치한 후 열고 새 POST 요청을 작성합니다.왼쪽 위 모서리 근처에 있는 더하기 기호 아이콘을 사용하여 새 요청을 작성할 수 있습니다.

    이름을 설정하고 GET에서 POST까지의 방법을 설정합니다.오른쪽에서 바디를 JSON으로 설정합니다.
    새 요청을 만들면 URL 필드에 이 URL을 추가합니다.
    http://localhost:8080/
    
    현재 바디 옵션 카드에 데이터를 입력해야 합니다.
    텍스트 필드에 다음 내용을 붙여넣습니다.
    {
    "text": "hello!"
    }
    

    이후에 "보내기"를 누르면 오른쪽에서 결과를 볼 수 있습니다!
    500개의 오류가 발생하면 프로그램이 열려 있는지 확인하십시오!403 오류가 발생하면 URL이 정확한지 확인하십시오.
    만약 모든 것이 순조롭다면, 너는 너의 글을 볼 수 있을 것이다.잘했어!

    Deno에 대한 생각:


    Deno v1.0.0은 2020년 5월 12일에 출시됩니다.2년간의 발전을 거쳐 현재 안정 상태에 있다.그럼에도 불구하고 성장의 고민은 많다.
    Deno와 많은 유행하는 소프트웨어 패키지가 빠르게 성장하고 교체되고 있다.Deno에는 특정 버전이 많습니다. 특정 버전의 패키지를 설치해야 합니다. 그렇지 않으면 프로그램이 컴파일할 수 없습니다. 왜냐하면 Deno에 유형 오류가 있기 때문입니다.이 부분은 매우 혼란스러워서 어떤 판본과 어떤 호환성을 찾을 수 있는지 대량의 연구가 필요하다.
    전반적으로 말하자면, 데노는 정말 훌륭하다.나는 그것이 Node를 뛰어넘을 수 있다고 그다지 생각하지 않는다.그러나 특히 사물이 번개 같은 속도로 빠르게 발전하고 사물이 그다지 안정적이지 않은 상황에서.그러나 나는 반드시 미래의 생산 프로젝트에서 그것을 사용할 것이다.지역사회가 발전하고 있으니 나는 그 중의 한 사람이 되는 것을 개의치 않는다.데노의 공헌자와 지역사회는 내가 프로젝트 전체에서 겪은 모든 질문에 잘 대답했다.
    아마도 데노는 다음 표준이 될 것이다.오직 시간만이 모든 것을 증명할 수 있다.

    결론:


    1부는 여기까지.다음 섹션에서는 다음을 수행합니다.
  • Cloud Run을 사용하여 시작하고 실행합니다.
  • Slack Developer 계정 및 Slack 애플리케이션 설정
  • , 마지막으로 클라우드를 통해 자동화 배치를 구축한다.
  • 만약 당신에게 무슨 문제가 있으면 아래에 메시지를 남기거나 연락 주세요.
    전체 Github 저장소는 다음과 같습니다.

    로베르토 / 외치다


    Google Cloud Run 및 SHOUTCLOUD 패키지를 사용하여 생성된 이완 명령입니다.

    좋은 웹페이지 즐겨찾기