Add slack notifications after deployments (#1485)
* Add slack notifications after deployments * Fix copy paste mistakes * Add deployment workflows to CODEOWNERS
This commit is contained in:
parent
2096671e0c
commit
031d012d0d
7 changed files with 155 additions and 2 deletions
4
.github/CODEOWNERS
vendored
4
.github/CODEOWNERS
vendored
|
@ -1,2 +1,4 @@
|
||||||
# Restrict Test Environment Deployment Workflows to be Approved by Cloud Team
|
# Restrict Deployment Workflows to be Approved by Cloud Team
|
||||||
.github/workflows/test-env* @saleor/cloud
|
.github/workflows/test-env* @saleor/cloud
|
||||||
|
.github/workflows/deploy-* @saleor/cloud
|
||||||
|
.github/workflows/notify/* @saleor/cloud
|
9
.github/workflows/deploy-cloud.yaml
vendored
9
.github/workflows/deploy-cloud.yaml
vendored
|
@ -55,3 +55,12 @@ jobs:
|
||||||
if [[ -n "$CF_2_ID" ]]; then
|
if [[ -n "$CF_2_ID" ]]; then
|
||||||
aws cloudfront create-invalidation --distribution-id ${CF_2_ID} --paths "/dashboard*"
|
aws cloudfront create-invalidation --distribution-id ${CF_2_ID} --paths "/dashboard*"
|
||||||
fi
|
fi
|
||||||
|
- name: Notify Slack
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
JOB_DEPLOYMENT_KIND: production
|
||||||
|
JOB_STATUS: ${{ job.status }}
|
||||||
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
|
||||||
|
JOB_TITLE: "Dashboard deployment to {{ env.ENVIRONMENT }}"
|
||||||
|
run: |
|
||||||
|
python3 ./.github/workflows/notify/notify-slack.py
|
||||||
|
|
9
.github/workflows/deploy-demo.yaml
vendored
9
.github/workflows/deploy-demo.yaml
vendored
|
@ -39,3 +39,12 @@ jobs:
|
||||||
aws s3 sync build/dashboard s3://${{ secrets.AWS_DEMO_DEPLOYMENT_BUCKET }}/dashboard/static/
|
aws s3 sync build/dashboard s3://${{ secrets.AWS_DEMO_DEPLOYMENT_BUCKET }}/dashboard/static/
|
||||||
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_DEMO_DEPLOYMENT_BUCKET }}/dashboard/
|
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_DEMO_DEPLOYMENT_BUCKET }}/dashboard/
|
||||||
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_DEMO_CF_DIST_ID }} --paths "/dashboard*"
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_DEMO_CF_DIST_ID }} --paths "/dashboard*"
|
||||||
|
- name: Notify Slack
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
JOB_DEPLOYMENT_KIND: production
|
||||||
|
JOB_STATUS: ${{ job.status }}
|
||||||
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
|
||||||
|
JOB_TITLE: "Dashboard deployment to {{ env.ENVIRONMENT }}"
|
||||||
|
run: |
|
||||||
|
python3 ./.github/workflows/notify/notify-slack.py
|
10
.github/workflows/deploy-latest-staging.yaml
vendored
10
.github/workflows/deploy-latest-staging.yaml
vendored
|
@ -49,3 +49,13 @@ jobs:
|
||||||
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
||||||
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
||||||
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
||||||
|
|
||||||
|
- name: Notify Slack
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
JOB_DEPLOYMENT_KIND: staging
|
||||||
|
JOB_STATUS: ${{ job.status }}
|
||||||
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
|
||||||
|
JOB_TITLE: "Dashboard deployment to {{ env.ENVIRONMENT }}"
|
||||||
|
run: |
|
||||||
|
python3 ./.github/workflows/notify/notify-slack.py
|
10
.github/workflows/deploy-master-staging.yaml
vendored
10
.github/workflows/deploy-master-staging.yaml
vendored
|
@ -43,3 +43,13 @@ jobs:
|
||||||
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
||||||
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
||||||
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
||||||
|
|
||||||
|
- name: Notify Slack
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
JOB_DEPLOYMENT_KIND: staging
|
||||||
|
JOB_STATUS: ${{ job.status }}
|
||||||
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
|
||||||
|
JOB_TITLE: "Dashboard deployment to {{ env.ENVIRONMENT }}"
|
||||||
|
run: |
|
||||||
|
python3 ./.github/workflows/notify/notify-slack.py
|
10
.github/workflows/deploy-stable-staging.yaml
vendored
10
.github/workflows/deploy-stable-staging.yaml
vendored
|
@ -49,3 +49,13 @@ jobs:
|
||||||
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
aws s3 sync build/dashboard s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/static/
|
||||||
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
aws s3 cp build/dashboard/index.html s3://${{ secrets.AWS_STAGING_DEPLOYMENT_BUCKET }}/${ENVIRONMENT}/
|
||||||
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.AWS_STAGING_CF_DIST_ID }} --paths "/dashboard*"
|
||||||
|
|
||||||
|
- name: Notify Slack
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
JOB_DEPLOYMENT_KIND: staging
|
||||||
|
JOB_STATUS: ${{ job.status }}
|
||||||
|
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLOUD_DEPLOYMENTS_WEBHOOK_URL }}
|
||||||
|
JOB_TITLE: "Dashboard deployment to {{ env.ENVIRONMENT }}"
|
||||||
|
run: |
|
||||||
|
python3 ./.github/workflows/notify/notify-slack.py
|
103
.github/workflows/notify/notify-slack.py
vendored
Executable file
103
.github/workflows/notify/notify-slack.py
vendored
Executable file
|
@ -0,0 +1,103 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
"""
|
||||||
|
Notifies about deployment status to a given slack channel.
|
||||||
|
|
||||||
|
This file currently needs to be duplicated between repositories until
|
||||||
|
https://github.com/github/roadmap/issues/98 is closed.
|
||||||
|
|
||||||
|
Dependencies (already shipped by ubuntu-20.04):
|
||||||
|
- Python 3.6+
|
||||||
|
- requests package (any version)
|
||||||
|
|
||||||
|
Manual Environment Variables (explicit):
|
||||||
|
- JOB_DEPLOYMENT_KIND: deployment target kind, staging, dev, etc.
|
||||||
|
- SLACK_WEBHOOK_URL: incoming webhook URL to send payload/message to
|
||||||
|
- JOB_STATUS: status from GitHub's ``job.status``
|
||||||
|
- JOB_TITLE: the title of the job
|
||||||
|
|
||||||
|
Global GitHub Environment Variables (implicit):
|
||||||
|
- GITHUB_RUN_ID
|
||||||
|
- GITHUB_REPOSITORY
|
||||||
|
- GITHUB_ACTOR
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
class JobNotifier:
|
||||||
|
JOB_STATUS_COLOR_MAP = {
|
||||||
|
"success": "#5DC292",
|
||||||
|
"failure": "#FE6E76",
|
||||||
|
"cancelled": "#868B8E",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
# The title of the pull request
|
||||||
|
self.title: str = os.environ["JOB_TITLE"]
|
||||||
|
|
||||||
|
# The kind of deployment (dev, staging, ...)
|
||||||
|
self.deployment_kind: str = os.environ["JOB_DEPLOYMENT_KIND"]
|
||||||
|
|
||||||
|
# Incoming Webhook Endpoint, it is set a the organization level
|
||||||
|
# Development notifier configuration is available at: https://api.slack.com/apps/A0210C30YLD/
|
||||||
|
self.slack_endpoint = os.environ["SLACK_WEBHOOK_URL"]
|
||||||
|
|
||||||
|
# Workflow Run ID to retrieve the logs permalink of the actual run (failed/succeeded)
|
||||||
|
self.run_id: str = os.environ["GITHUB_RUN_ID"]
|
||||||
|
|
||||||
|
# <owner>/<repo>
|
||||||
|
self.repository: str = os.environ["GITHUB_REPOSITORY"]
|
||||||
|
|
||||||
|
# The user that triggered the action
|
||||||
|
self.author: str = os.environ["GITHUB_ACTOR"]
|
||||||
|
|
||||||
|
# Job Status (success|failure|cancelled)
|
||||||
|
self.job_status: str = os.environ["JOB_STATUS"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def run_permalink(self) -> str:
|
||||||
|
"""Permalink to the current run logs"""
|
||||||
|
return f"https://github.com/{self.repository}/actions/runs/{self.run_id}"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def job_status_color(self) -> str:
|
||||||
|
"""Color from Saleor Cloud palette for job status"""
|
||||||
|
return self.JOB_STATUS_COLOR_MAP[self.job_status]
|
||||||
|
|
||||||
|
def make_slack_message(self) -> dict:
|
||||||
|
status = self.job_status.capitalize()
|
||||||
|
# Dev deployment triggered by JohnDoe: Success
|
||||||
|
text = (
|
||||||
|
f"{self.author} deployment finished for '{self.deployment_kind.capitalize()}', result: "
|
||||||
|
f"{status}"
|
||||||
|
)
|
||||||
|
message_data = {
|
||||||
|
"attachments": [
|
||||||
|
{
|
||||||
|
"fallback": text,
|
||||||
|
"pretext": "",
|
||||||
|
"title": f"{self.repository}: {self.title}",
|
||||||
|
"title_link": self.run_permalink,
|
||||||
|
"text": text,
|
||||||
|
"color": self.job_status_color,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return message_data
|
||||||
|
|
||||||
|
def send_notification(self) -> None:
|
||||||
|
post_data = self.make_slack_message()
|
||||||
|
print(f"Notifying slack with payload: {post_data!r}", file=sys.stderr)
|
||||||
|
response = requests.post(self.slack_endpoint, json=post_data)
|
||||||
|
response.raise_for_status()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
JobNotifier().send_notification()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue