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.)