Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
11 changes: 7 additions & 4 deletions .github/workflows/pr-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ on:
pull_request_target:
types: [ opened, edited, synchronize, reopened ]

permissions:
contents: read
pull-requests: read

jobs:
validate:
name: Validate title
runs-on: ubuntu-latest
runs-on: ubuntu-x64
steps:
- uses: amannn/action-semantic-pull-request@v5
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
- uses: twilio/sdk-actions/semantic-pr-title@09631bfa50f14d276170d45bc4f49a80da201cc6 # main @ 09631bf — sdk-actions#10; repin to the v1.1.0 tag once cut
with:
types: |
chore
Expand All @@ -17,5 +22,3 @@ jobs:
feat
misc
test
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
141 changes: 86 additions & 55 deletions .github/workflows/test-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,88 +10,119 @@ on:
- cron: '0 15 * * 1-5'
workflow_dispatch:

env:
ARTIFACTORY_URL: ${{ vars.ARTIFACTORY_URL }}

jobs:
test:
name: Test
runs-on: ubuntu-latest
name: Test - Python ${{ matrix.python-version }}
runs-on: ubuntu-x64
if: github.repository_owner == 'sendgrid'
timeout-minutes: 20
permissions:
contents: read
id-token: write
strategy:
fail-fast: false
matrix:
python-version: [ '3.9', '3.10', '3.11', '3.12' , '3.13']
env:
DOCKER_LOGIN: ${{ secrets.DOCKER_USERNAME && secrets.DOCKER_AUTH_TOKEN }}
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
steps:
- name: Checkout sendgrid-python
uses: actions/checkout@v3
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Login to Docker Hub
if: env.DOCKER_LOGIN
uses: docker/login-action@v2
- name: Artifactory OIDC Auth
uses: twilio/sdk-actions/artifactory-oidc@0375437914d535a5fb178bdbfdb5d51bdde2616e # v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_AUTH_TOKEN }}
ecosystem: python

- name: Install Docker Compose
run: |
sudo apt-get update
sudo apt-get install -y docker-compose
- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: ${{ matrix.python-version }}

- name: Build & Test
run: make test

deploy:
name: Deploy
if: success() && github.ref_type == 'tag'
if: success() && github.ref_type == 'tag' && github.repository_owner == 'sendgrid'
needs: [ test ]
runs-on: ubuntu-latest
runs-on: ubuntu-x64
environment:
name: production
url: https://pypi.org/project/sendgrid/${{ github.ref_name }}
permissions:
contents: write # required for creating GitHub Release
id-token: write
attestations: write
steps:
- name: Checkout sendgrid-python
uses: actions/checkout@v3
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
# The release action verifies refs/tags/<tag> in the local clone.
fetch-depth: 0

- name: Artifactory OIDC Auth
uses: twilio/sdk-actions/artifactory-oidc@0375437914d535a5fb178bdbfdb5d51bdde2616e # v1
with:
ecosystem: python

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
with:
python-version: '3.10'
python-version: '3.12'

- name: Validate tag format and version match
run: |
pip install setuptools
TAG="${GITHUB_REF#refs/tags/}"
VERSION="${TAG#v}"
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
echo "::error::Release tag must look like 1.2.3 or v1.2.3 (got '$TAG')"
exit 1
fi
PKG_VERSION=$(python setup.py --version)
if [ "$VERSION" != "$PKG_VERSION" ]; then
echo "::error::Tag $TAG does not match setup.py version $PKG_VERSION"
exit 1
fi

- name: Install dependencies
- name: Build package
run: |
python -m pip install --upgrade pip
pip install build
pip install wheel
python setup.py sdist bdist_wheel
pip install build twine
python -m build
twine check dist/*

- name: Create GitHub Release
uses: sendgrid/dx-automator/actions/release@main
uses: twilio/sdk-actions/github-release@9b1c3222c9ffe38aadedb11c5b9f5a172b5e9951 # v1
with:
footer: '**[pypi](https://pypi.org/project/sendgrid/${version})**'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
changelog-file: CHANGELOG.md
footer: '**[PyPI](https://pypi.org/project/sendgrid/${{ github.ref_name }})**'

- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_TOKEN }}
# PyPI trusted publishing (OIDC) - no API token. A trusted publisher must be
# configured on pypi.org for this repo and workflow.
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1

- name: Submit metric to Datadog
uses: sendgrid/dx-automator/actions/datadog-release-metric@main
env:
DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}
# - name: Submit metric to Datadog
# uses: sendgrid/dx-automator/actions/datadog-release-metric@08b601b726671445abc798ed59881766ec8fefc6 # main
# env:
# DD_API_KEY: ${{ secrets.DATADOG_API_KEY }}

notify-on-failure:
name: Slack notify on failure
if: failure() && github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || github.ref_type == 'tag')
needs: [ test, deploy ]
runs-on: ubuntu-latest
steps:
- uses: rtCamp/action-slack-notify@v2
env:
SLACK_COLOR: failure
SLACK_ICON_EMOJI: ':github:'
SLACK_MESSAGE: ${{ format('Test *{0}*, Deploy *{1}*, {2}/{3}/actions/runs/{4}', needs.test.result, needs.deploy.result, github.server_url, github.repository, github.run_id) }}
SLACK_TITLE: Action Failure - ${{ github.repository }}
SLACK_USERNAME: GitHub Actions
SLACK_MSG_AUTHOR: twilio-dx
SLACK_FOOTER: Posted automatically using GitHub Actions
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
MSG_MINIMAL: true
# notify-on-failure:
# name: Slack notify on failure
# if: failure() && github.event_name != 'pull_request' && (github.ref == 'refs/heads/main' || github.ref_type == 'tag')
# needs: [ test, deploy ]
# runs-on: ubuntu-x64
# steps:
# - uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
# env:
# SLACK_COLOR: failure
# SLACK_ICON_EMOJI: ':github:'
# SLACK_MESSAGE: ${{ format('Test *{0}*, Deploy *{1}*, {2}/{3}/actions/runs/{4}', needs.test.result, needs.deploy.result, github.server_url, github.repository, github.run_id) }}
# SLACK_TITLE: Action Failure - ${{ github.repository }}
# SLACK_USERNAME: GitHub Actions
# SLACK_MSG_AUTHOR: twilio-dx
# SLACK_FOOTER: Posted automatically using GitHub Actions
# SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
# MSG_MINIMAL: true