Docker 이미지가 업데이트되면 Slack 메시지 보내기
                                            
                                                
                                                
                                                
                                                
                                                
                                                 5239 단어  serverlessdocker
                    
이미지를 호스팅하는 데 사용하는 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 웹훅으로 보낼 수 있습니다.
함수를 생성하기 위해 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 채널로 보냅니다.
Reference
이 문제에 관하여(Docker 이미지가 업데이트되면 Slack 메시지 보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/peterj/send-a-slack-message-when-docker-images-are-updated-3f4c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)