Use prebuilt Docker image for Gitea workflows
All checks were successful
Test blackout notifier / test (push) Successful in 4s
All checks were successful
Test blackout notifier / test (push) Successful in 4s
This commit is contained in:
@@ -8,20 +8,16 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: daily-blackout-check-runner:latest
|
||||||
|
env:
|
||||||
|
PYTHONPATH: src
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: https://gitea.com/actions/checkout@v4
|
uses: https://gitea.com/actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up Python
|
|
||||||
uses: https://gitea.com/actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.13"
|
|
||||||
|
|
||||||
- name: Install project
|
|
||||||
run: python -m pip install .
|
|
||||||
|
|
||||||
- name: Check outages and persist state
|
- name: Check outages and persist state
|
||||||
env:
|
env:
|
||||||
BARGHEMAN_TOKEN: ${{ secrets.BARGHEMAN_TOKEN }}
|
BARGHEMAN_TOKEN: ${{ secrets.BARGHEMAN_TOKEN }}
|
||||||
|
|||||||
@@ -10,18 +10,14 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: daily-blackout-check-runner:latest
|
||||||
|
env:
|
||||||
|
PYTHONPATH: src
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: https://gitea.com/actions/checkout@v4
|
uses: https://gitea.com/actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python
|
|
||||||
uses: https://gitea.com/actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.13"
|
|
||||||
|
|
||||||
- name: Install project
|
|
||||||
run: python -m pip install -e '.[test]'
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: ruff check .
|
run: ruff check .
|
||||||
|
|
||||||
|
|||||||
46
README.md
46
README.md
@@ -22,7 +22,7 @@ state is stored in `state/outages.json` and committed back to this repository.
|
|||||||
|
|
||||||
## Local setup
|
## Local setup
|
||||||
|
|
||||||
Python 3.11 or newer is required. CI uses Python 3.13.
|
Python 3.11 or newer is required. The Gitea runner image uses Debian's Python 3.11.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
python -m venv .venv
|
python -m venv .venv
|
||||||
@@ -62,17 +62,40 @@ Shell and Gitea-provided variables take precedence over `.env`.
|
|||||||
## Gitea deployment
|
## Gitea deployment
|
||||||
|
|
||||||
This repository targets Gitea 1.25.x and a Docker-based runner advertising the
|
This repository targets Gitea 1.25.x and a Docker-based runner advertising the
|
||||||
`ubuntu-latest` label. The runner needs outbound access to the Gitea instance,
|
`ubuntu-latest` label. Both workflows run inside the locally built
|
||||||
`gitea.com`, PyPI, SAAPA, and EitaaYar.
|
`daily-blackout-check-runner:latest` image. It contains Node for the checkout
|
||||||
|
action plus Python, Git, timezone data, application dependencies, pytest, and
|
||||||
|
Ruff. Scheduled jobs therefore do not install Python or download Python packages.
|
||||||
|
|
||||||
1. Enable Actions in the repository settings.
|
Build the image on the Docker host used by `act_runner`:
|
||||||
2. Confirm an online runner advertises `ubuntu-latest`.
|
|
||||||
3. Add these repository Actions secrets:
|
```sh
|
||||||
|
cd /path/to/daily-blackout-check
|
||||||
|
docker build \
|
||||||
|
--tag daily-blackout-check-runner:latest \
|
||||||
|
runner-image
|
||||||
|
docker image inspect daily-blackout-check-runner:latest >/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
Only `runner-image/` is sent as the Docker build context, so local secrets and
|
||||||
|
outage state never enter the build context or image.
|
||||||
|
|
||||||
|
The image is local rather than registry-hosted, matching the deployment pattern
|
||||||
|
used by `mahak-api-docs`. Build it on every runner host that can claim this job.
|
||||||
|
Rebuild it whenever `runner-image/Dockerfile`, `runner-image/requirements.lock`,
|
||||||
|
or dependency declarations in `pyproject.toml` change. The image build requires
|
||||||
|
Docker Hub and PyPI access; normal workflow runs only need the Gitea instance,
|
||||||
|
`gitea.com`, SAAPA, and EitaaYar.
|
||||||
|
|
||||||
|
1. Build `daily-blackout-check-runner:latest` on the runner's Docker host.
|
||||||
|
2. Enable Actions in the repository settings.
|
||||||
|
3. Confirm an online Docker runner advertises `ubuntu-latest`.
|
||||||
|
4. Add these repository Actions secrets:
|
||||||
`BARGHEMAN_TOKEN`, `EITAAYAR_TOKEN`, `CHAT_ID`, and `BILL_IDS`.
|
`BARGHEMAN_TOKEN`, `EITAAYAR_TOKEN`, `CHAT_ID`, and `BILL_IDS`.
|
||||||
4. Run the test workflow manually.
|
5. Run the test workflow manually.
|
||||||
5. Run **Hourly blackout check** manually once and inspect the notification and
|
6. Run **Hourly blackout check** manually once and inspect the notification and
|
||||||
resulting state commit.
|
resulting state commit.
|
||||||
6. Leave the `@hourly` schedule enabled.
|
7. Leave the `@hourly` schedule enabled.
|
||||||
|
|
||||||
The workflow uses fully qualified `https://gitea.com/actions/...` actions rather
|
The workflow uses fully qualified `https://gitea.com/actions/...` actions rather
|
||||||
than resolving actions through GitHub. Gitea 1.25 ignores workflow `permissions`
|
than resolving actions through GitHub. Gitea 1.25 ignores workflow `permissions`
|
||||||
@@ -81,6 +104,11 @@ Its checkout credential must retain the default ability to push to the current
|
|||||||
repository. Scheduled jobs should not be manually overlapped; in the rare event
|
repository. Scheduled jobs should not be manually overlapped; in the rare event
|
||||||
of a push race, the job fails and unsaved notices may be repeated on the next run.
|
of a push race, the job fails and unsaved notices may be repeated on the next run.
|
||||||
|
|
||||||
|
If a workflow tries to pull the local image instead of using it, ensure the image
|
||||||
|
exists in the same Docker daemon used by `act_runner` and set
|
||||||
|
`container.force_pull: false` in the runner's generated `config.yaml`, then
|
||||||
|
restart the runner.
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
|||||||
26
runner-image/Dockerfile
Normal file
26
runner-image/Dockerfile
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
FROM node:20-bookworm
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
ca-certificates \
|
||||||
|
git \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
tzdata && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY requirements.lock /tmp/requirements.lock
|
||||||
|
|
||||||
|
RUN python3 -m venv /opt/blackout-venv && \
|
||||||
|
/opt/blackout-venv/bin/pip install --no-cache-dir -r /tmp/requirements.lock && \
|
||||||
|
/opt/blackout-venv/bin/python -c "import dotenv, jdatetime, requests" && \
|
||||||
|
/opt/blackout-venv/bin/pytest --version && \
|
||||||
|
/opt/blackout-venv/bin/ruff --version && \
|
||||||
|
rm /tmp/requirements.lock
|
||||||
|
|
||||||
|
ENV PATH="/opt/blackout-venv/bin:$PATH" \
|
||||||
|
PYTHONDONTWRITEBYTECODE="1" \
|
||||||
|
PYTHONUNBUFFERED="1"
|
||||||
|
|
||||||
|
CMD ["bash"]
|
||||||
14
runner-image/requirements.lock
Normal file
14
runner-image/requirements.lock
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
certifi==2026.6.17
|
||||||
|
charset-normalizer==3.4.9
|
||||||
|
idna==3.18
|
||||||
|
iniconfig==2.3.0
|
||||||
|
jalali_core==1.0.0
|
||||||
|
jdatetime==6.0.1
|
||||||
|
packaging==26.2
|
||||||
|
pluggy==1.6.0
|
||||||
|
Pygments==2.20.0
|
||||||
|
pytest==9.1.1
|
||||||
|
python-dotenv==1.2.2
|
||||||
|
requests==2.34.2
|
||||||
|
ruff==0.15.22
|
||||||
|
urllib3==2.7.0
|
||||||
Reference in New Issue
Block a user