diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..9bd0170 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..7841b88 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,117 @@ +name: CI + +"on": + push: + branches-ignore: + # These should always correspond to pull requests, so ignore them for + # the push trigger and let them be triggered by the pull_request + # trigger, avoiding running the workflow twice. This is a minor + # optimization so there's no need to ensure this is comprehensive. + - "dependabot/**" + - "renovate/**" + - "tickets/**" + - "u/**" + tags: + - "*" + pull_request: {} + +jobs: + lint: + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Run pre-commit + uses: pre-commit/action@v3.0.0 + + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + + strategy: + matrix: + python: + - "3.11" + + steps: + - uses: actions/checkout@v4 + + - name: Run tox + uses: lsst-sqre/run-tox@v1 + with: + python-version: ${{ matrix.python }} + tox-envs: "py,coverage-report,typing" + + build: + runs-on: ubuntu-latest + needs: [lint, test] + timeout-minutes: 10 + + # Only do Docker builds of tagged releases and pull requests from ticket + # branches. This will still trigger on pull requests from untrusted + # repositories whose branch names match our tickets/* branch convention, + # but in this case the build will fail with an error since the secret + # won't be set. + if: > + startsWith(github.ref, 'refs/tags/') + || startsWith(github.head_ref, 'tickets/') + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: lsst-sqre/build-and-push-to-ghcr@v1 + id: build + with: + image: ${{ github.repository }} + github_token: ${{ secrets.GITHUB_TOKEN }} + + test-packaging: + + name: Test packaging + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # full history for setuptools_scm + + - name: Build and publish + uses: lsst-sqre/build-and-publish-to-pypi@v2 + with: + python-version: "3.11" + upload: false + + pypi: + + # This job requires set up: + # 1. Set up a trusted publisher for PyPI + # 2. Set up a "pypi" environment in the repository + # See https://github.com/lsst-sqre/build-and-publish-to-pypi + name: Upload release to PyPI + runs-on: ubuntu-latest + needs: [lint, test, test-packaging] + environment: + name: pypi + url: https://pypi.org/p/giftless + permissions: + id-token: write + if: github.event_name == 'release' && github.event.action == 'published' + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # full history for setuptools_scm + + - name: Build and publish + uses: lsst-sqre/build-and-publish-to-pypi@v2 + with: + python-version: "3.11" diff --git a/.github/workflows/periodic.yaml b/.github/workflows/periodic.yaml new file mode 100644 index 0000000..ab088b9 --- /dev/null +++ b/.github/workflows/periodic.yaml @@ -0,0 +1,45 @@ +# This is a separate run of the Python test suite that doesn't cache the tox +# environment and runs from a schedule. The purpose is to test whether +# updating pinned dependencies would cause any tests to fail. + +name: Periodic CI + +"on": + schedule: + - cron: "0 12 * * 1" + workflow_dispatch: {} + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + + strategy: + matrix: + python: + - "3.11" + + steps: + - uses: actions/checkout@v4 + + - name: Run neophile + uses: lsst-sqre/run-neophile@v1 + with: + python-version: ${{ matrix.python }} + mode: update + + - name: Run tox + uses: lsst-sqre/run-tox@v1 + with: + python-version: ${{ matrix.python }} + tox-envs: "lint,typing,py" + + - name: Report status + if: always() + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: "failure" + notification_title: "Periodic test for {repo} failed" + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_ALERT_WEBHOOK }} diff --git a/Makefile b/Makefile index 465233f..86532fb 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ test: $(SENTINELS)/dev-setup docker: requirements/main.txt $(DOCKER) build --cache-from "$(DOCKER_CACHE_FROM)" -t $(DOCKER_HOST)/$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) . -## Tag and push a release (disabled) +## Tag and push a release (disabled; done via GitHub Actions now) release: @echo "Package '$(PACKAGE_NAME)' releases are managed via GitHub"