Docker 이미지가 업데이트되면 Slack 메시지 보내기

5239 단어 serverlessdocker
Start Kubernetes course의 일부인 Kubernetes 랩은 Kubernetes 클러스터 내에서 여러 Docker 이미지로 실행됩니다. 새 Docker 이미지를 레지스트리에 푸시할 때 사용자에게 알리는 방법을 원했습니다. 그렇게 하면 Pod를 다시 시작하고 업데이트된 이미지를 가져올 수 있습니다.

이미지를 호스팅하는 데 사용하는 Azure container registry을 사용하면 웹후크를 만들 수 있습니다. 이미지를 푸시하거나 삭제할 때마다 컨테이너 레지스트리는 JSON 페이로드를 내가 선택한 URL로 보냅니다.

과정에서는 Slack 작업 공간을 사용하고 있습니다. Slack은 앱도 지원합니다. 예를 들어 Slack 워크스페이스에 앱을 생성 및 추가하고 메시지 게시 권한을 부여할 수 있습니다. Slack 앱의 기능 중 하나는 [수신 웹후크](https://api.slack.com/messaging/webhooks)를 사용하여 Slack 채널에 메시지를 게시하는 기능입니다.

예를 들어 수신 웹후크에 대한 채널을 구성한 다음 아래와 같은 POST 요청을 사용하여 해당 채널에 메시지를 보낼 수 있습니다.

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/[somethingsomething]


다음은 내가 달성하고자 하는 것을 보여주는 다이어그램입니다.



내가 빨리 직면한 문제는 컨테이너 레지스트리가 보내는 페이로드를 제어할 수 없다는 것입니다. 보낼 URL과 헤더만 구성할 수 있습니다. 컨테이너 레지스트리는 다음과 같은 페이로드를 보냅니다.

{
    "id": "673aeeaa-6493-41d3-bcdd-68242942bcb0",
    "timestamp": "2020-10-14T00:15:02.82330594Z",
    "action": "push",
    "target": {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "size": 1778,
        "digest": "sha256:a71f5e4bf56c05a3d6264b8ef4d3bb4c90b4b0af579fedb6ccb68ea59f597435",
        "length": 1778,
        "repository": "startkubernetes/sk-web",
        "tag": "1"
    },
    "request": {
        "id": "adbc2757-8d80-49ac-af5f-ec30e5147bdf",
        "host": "myregistry.azurecr.io",
        "method": "PUT",
        "useragent": "docker/19.03.13+azure go/go1.13.15 git-commit/bd33bbf0497b2327516dc799a5e541b720822a4c kernel/5.4.0-1026-azure os/linux arch/amd64 UpstreamClient(Docker-Client/19.03.13+azure \\(linux\\))"
    }
}


그러나 Slack은 다르게 보이는 페이로드를 기대하고 있습니다. 가장 간단한 형태의 Slack 메시지 페이로드는 다음과 같습니다.

{
  "text": "This is my message"
}


Slack also has a Block Kit Builder that allows you to build more complex messages.



어쨌든 다음을 수행하는 중개자가 필요했습니다.
  • 컨테이너 레지스트리 페이로드 허용
  • 정보(리포지토리, 태그 및 타임스탬프)를 추출합니다
  • .
  • Slack이 이해하는 페이로드 생성
  • 페이로드를 Slack 수신 웹후크 URL로 보냅니다.



  • 그것은 서버리스 기능을 위한 완벽한 사용 사례처럼 보였습니다. 이 함수에는 엔드포인트가 있으며 이를 컨테이너 레지스트리 웹후크에서 사용할 수 있습니다. 웹후크는 컨테이너 레지스트리 페이로드를 내 함수로 보냅니다. 함수에서 내가 원하는 코드를 작성하고 페이로드를 수정한 다음 Slack 웹훅으로 보낼 수 있습니다.

    함수를 생성하기 위해 Azure Functions VS Code extension을 다운로드하고 로그인했으며 내 편집기에서 모든 작업을 수행할 수 있었습니다.

    기능은 다음과 같습니다.

    const axios = require('axios');
    const slackUrl =
      'https://hooks.slack.com/services/[somethingsomething]';
    
    module.exports = async function (context, req) {
      let message = JSON.stringify(req.body);
    
      if (
        req.body.hasOwnProperty('target') &&
        req.body.hasOwnProperty('timestamp')
      ) {
        const {
          target: { repository, tag },
          timestamp,
        } = req.body;
        message = `Pushed image ${repository}:${tag} (${timestamp})`;
      } else {
        context.res = {
          status: 500,
          body: req.body,
        };
        return;
      }
    
      axios
        .post(
          slackUrl,
          { text: message },
          {
            headers: {
              'content-type': 'application/json',
            },
          }
        )
        .then((response) => {
          context.res = { body: response.body };
        })
        .catch((err) => {
          context.res = {
            status: 500,
            body: err,
          };
          context.done();
        });
    };
    


    함수를 배포한 다음 컨테이너 레지스트리 웹후크를 업데이트하여 함수 URL에 페이로드를 전송했습니다. 컨테이너 레지스트리 웹후크에는 Ping을 엔드포인트로 보내는 옵션이 있습니다. 그렇게 하면 연결을 테스트할 수 있습니다. 마찬가지로, 기능과 Slack의 연결을 테스트하려는 경우 POST 요청을 Slack에 직접 보내거나 수동으로 기능을 호출할 수 있습니다.

    랩이나 코드를 변경할 때마다 그리고 PR을 메인 브랜치에 병합할 때마다 Github 작업이 이미지를 빌드하고 레지스트리에 푸시합니다. 그런 다음 레지스트리가 인계되어 페이로드를 함수로 보내고 메시지를 Slack 채널로 보냅니다.

    좋은 웹페이지 즐겨찾기