Skip to content

Commit 356431d

Browse files
committed
Refactor Dockerfile to use Poetry for dependency management and add health check to production image
1 parent 05ab1bc commit 356431d

File tree

12 files changed

+2779
-97
lines changed

12 files changed

+2779
-97
lines changed

.github/workflows/pr.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,33 @@ on:
1717
- ".github/workflows/**"
1818

1919
jobs:
20-
lint:
20+
ruff:
2121
runs-on: ubuntu-latest
2222
steps:
2323
- name: Check Out Repo
2424
uses: actions/checkout@v4
2525
- name: Set up Python
2626
uses: actions/setup-python@v5
2727
with:
28-
python-version: '3.11'
28+
python-version: '3.9'
2929
cache: 'pip'
3030
- name: Install Dependencies
31-
run: make init
32-
- name: Run Linter
33-
run: make lint
31+
run: pip install -e .
32+
- name: Run ruff
33+
run: poetry run ruff check
3434

3535
test:
36-
needs: lint
36+
needs: ruff
3737
runs-on: ubuntu-latest
3838
steps:
3939
- name: Check Out Repo
4040
uses: actions/checkout@v4
4141
- name: Set up Python
4242
uses: actions/setup-python@v5
4343
with:
44-
python-version: '3.11'
44+
python-version: '3.9'
4545
cache: 'pip'
4646
- name: Install Dependencies
47-
run: make init
47+
run: pip install -e .
4848
- name: Run Tests
49-
run: make test
49+
run: poetry run pytest tests

Dockerfile

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,26 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
FROM python:3.9-buster as builder
15+
FROM python:3.9-buster AS builder
1616

1717
WORKDIR /usr/app
18+
19+
# Create and activate virtual environment
1820
RUN python -m venv /usr/app/venv
1921
ENV PATH="/usr/app/venv/bin:$PATH"
2022

21-
COPY requirements.txt .
22-
RUN pip install -r requirements.txt
23+
# Install dependencies
24+
COPY poetry.lock pyproject.toml ./
25+
# Install dependencies only (no dev dependencies)
26+
RUN poetry export -f requirements.txt | pip install -r /dev/stdin
27+
28+
# Install project
29+
COPY . .
30+
RUN pip install -e .
2331

24-
FROM python:3.9-slim as production
32+
FROM python:3.9-slim AS production
2533

34+
# Set environment variables in separate layers for better caching
2635
ENV BOT_LANGUAGE="en" \
2736
BOT_HOST="0.0.0.0" \
2837
BOT_PORT=9998 \
@@ -32,9 +41,16 @@ ENV BOT_LANGUAGE="en" \
3241
BOT_GITLAB_MERGE_REQUEST_MILESTONE_REQUIRED=false
3342

3443
WORKDIR /usr/app
44+
45+
# Copy only necessary files from builder
3546
COPY --from=builder /usr/app/venv ./venv
3647
COPY src src
3748
COPY gitlab_bot.py gitlab_bot.py
3849

3950
ENV PATH="/usr/app/venv/bin:$PATH"
51+
52+
# Health check
53+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
54+
CMD curl -f http://localhost:${BOT_PORT}/ || exit 1
55+
4056
CMD [ "python", "gitlab_bot.py" ]

Makefile

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
init:
2-
pip install . '.[lint]' '.[test]' '.[package]'
2+
@pip install -e .
33

44
lint:
5-
@pflake8 ./src ./tests ./gitlab_bot.py || (echo "Run 'make fmt' to fix the issues" && exit 1)
6-
@black --check ./src ./tests ./gitlab_bot.py || (echo "Run 'make fmt' to fix the issues" && exit 1)
5+
@poetry run ruff check
76

87
fmt:
9-
@black ./src ./tests ./gitlab_bot.py
10-
@isort --profile black ./src ./tests ./gitlab_bot.py
8+
@poetry run ruff format
119

1210
test: lint
13-
@pytest --cov=src tests
11+
@poetry run pytest tests
1412

1513
i18n:
1614
xgettext -d base -o src/locales/gitlab-bot.pot *.py
1715
msgfmt -o src/locales/en/LC_MESSAGES/gitlab-bot.mo src/locales/en/LC_MESSAGES/gitlab-bot.po
1816
msgfmt -o src/locales/zh/LC_MESSAGES/gitlab-bot.mo src/locales/zh/LC_MESSAGES/gitlab-bot.po
1917

20-
docker-build:
18+
docker:
2119
export DOCKER_BUILDKIT=1
2220
docker build -t coolbeevip/gitlab-bot --cache-from coolbeevip/gitlab-bot --build-arg BUILDKIT_INLINE_CACHE=1 .

gitlab_bot.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
from src.merge_request_hook import MergeRequestHooks
3232
from src.note_hook import NoteHooks
3333

34-
bot = GitLabBot(bot_gitlab_username, url=bot_gitlab_url, access_token=bot_gitlab_token)
34+
bot = GitLabBot(
35+
bot_gitlab_username, url=bot_gitlab_url, access_token=bot_gitlab_token
36+
)
3537

3638
issue_hooks = IssueHooks()
3739
merge_request_hooks = MergeRequestHooks()
@@ -65,25 +67,33 @@ async def note_issue_event(event, gl, *args, **kwargs):
6567
@bot.router.register("Merge Request Hook", action="open")
6668
async def merge_request_opened_event(event, gl, *args, **kwargs):
6769
if not ignore_event(event):
68-
await merge_request_hooks.merge_request_opened_event(event, gl, args, kwargs)
70+
await merge_request_hooks.merge_request_opened_event(
71+
event, gl, args, kwargs
72+
)
6973

7074

7175
@bot.router.register("Merge Request Hook", action="update")
7276
async def merge_request_updated_event(event, gl, *args, **kwargs):
7377
if not ignore_event(event):
74-
await merge_request_hooks.merge_request_updated_event(event, gl, args, kwargs)
78+
await merge_request_hooks.merge_request_updated_event(
79+
event, gl, args, kwargs
80+
)
7581

7682

7783
@bot.router.register("Merge Request Hook", action="reopen")
7884
async def merge_request_reopen_event(event, gl, *args, **kwargs):
7985
if not ignore_event(event):
80-
await merge_request_hooks.merge_request_reopen_event(event, gl, args, kwargs)
86+
await merge_request_hooks.merge_request_reopen_event(
87+
event, gl, args, kwargs
88+
)
8189

8290

8391
@bot.router.register("Note Hook", noteable_type="MergeRequest")
8492
async def note_merge_request_event(event, gl, *args, **kwargs):
8593
if not ignore_event(event):
86-
await merge_request_hooks.note_merge_request_event(event, gl, args, kwargs)
94+
await merge_request_hooks.note_merge_request_event(
95+
event, gl, args, kwargs
96+
)
8797

8898

8999
@bot.router.register("Note Hook", noteable_type="Commit")
@@ -104,7 +114,9 @@ def ignore_event(event) -> bool:
104114
if username != bot_gitlab_username:
105115
return False
106116
else:
107-
logging.info("Ignore event: %s triggered by admin", event.data["event_type"])
117+
logging.info(
118+
"Ignore event: %s triggered by admin", event.data["event_type"]
119+
)
108120
return True
109121

110122

0 commit comments

Comments
 (0)