From c5c974599132494be3c8d1d2e18c5188ec4187d4 Mon Sep 17 00:00:00 2001 From: baraah Date: Wed, 3 Jun 2026 01:25:13 +0200 Subject: [PATCH 1/4] complete pipeline assignment --- .github/workflows/ci.yml | 29 ++++++++++++++++++++++------- AI_ASSIST.md | 3 ++- Dockerfile | 7 +++++-- requirements.txt | 7 +++++++ src/pipeline.py | 32 +++++++++++++++++++++++++++++--- 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e91465..d91651f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ name: CI on: push: - branches: ["TODO-replace-with-main"] + branches: ["main"] pull_request: jobs: @@ -21,10 +21,25 @@ jobs: - name: Install dependencies run: pip install -r requirements.txt - name: Lint - run: echo "TODO implement this step" - - name: Format - run: echo "TODO implement this step" + run: ruff check . + - name: Format check + run: ruff format . --check - name: Test - run: echo "TODO implement this step" - - name: Build image - run: echo "TODO implement this step" + run: API_KEY=test pytest -q + - name: Build Docker image + run: docker build -t barbari-pipeline:${{ github.sha }} . + - name: Azure login + uses: azure/login@v2 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + + - name: ACR login + run: az acr login --name hyfregistry + + - name: Tag image for ACR + run: | + docker tag barbari-pipeline:${{ github.sha }} hyfregistry.azurecr.io/barbari-pipeline:${{ github.sha }} + + - name: Push image to ACR + run: | + docker push hyfregistry.azurecr.io/barbari-pipeline:${{ github.sha }} \ No newline at end of file diff --git a/AI_ASSIST.md b/AI_ASSIST.md index 70463b0..3122e01 100644 --- a/AI_ASSIST.md +++ b/AI_ASSIST.md @@ -7,11 +7,12 @@ ## The prompt I gave +I used AI to help me fix my pytest issues. The AI suggested ensuring that all required dependencies (pytest and project modules) are installed, fixing missing imports, TODO: paste your prompt here. ## The code or suggestion it returned - +After applying the changes, all tests passed successfully ```python diff --git a/Dockerfile b/Dockerfile index d665b11..fb72dca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,15 +10,18 @@ # Replace each TODO comment with the correct Dockerfile instruction. # TODO: set the base image -FROM TODO +FROM python:3.11-slim WORKDIR /app # TODO: copy requirements.txt (before source — this keeps the install layer cached) +COPY requirements.txt . # TODO: install dependencies +RUN pip install --no-cache-dir -r requirements.txt # TODO: copy source code +COPY . . # TODO: set the command that runs when the container starts -CMD ["TODO"] +CMD ["python", "-m", "src.pipeline"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 42299cf..4a53530 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,10 @@ # ruff== # # Add your pinned dependencies below: +azure-identity==1.17.1 +azure-storage-blob==12.19.1 +pandas==2.2.2 +numpy==2.0.1 +requests==2.32.3 +pytest==8.4.2 +matplotlib==3.9.2 diff --git a/src/pipeline.py b/src/pipeline.py index 1cd17a4..0fdcf69 100644 --- a/src/pipeline.py +++ b/src/pipeline.py @@ -7,7 +7,7 @@ Replace every `raise NotImplementedError` below with a real implementation. """ - +import os import logging from pathlib import Path @@ -24,8 +24,22 @@ def get_config() -> dict: Raise RuntimeError with a clear message if a required variable is missing. """ + api_key = os.getenv("API_KEY") + output_dir = os.getenv("OUTPUT_DIR", "output") + + if not api_key: + raise RuntimeError("ERROR: API_KEY is not set in environment variables") + + + return { + "api_key": api_key, + "output_dir": output_dir, + + } raise NotImplementedError("Task 5: read API_KEY and OUTPUT_DIR from the environment") +def clean_name(name: str) -> str: + return name.strip() def fetch_data(api_key: str) -> list[dict]: """ @@ -34,8 +48,12 @@ def fetch_data(api_key: str) -> list[dict]: Return a list of at least one dict representing a record. In a real pipeline you would call requests.get(...) here. """ - raise NotImplementedError("Task 1: return at least one sample record") + logger.info("fetching data") + return [ + {"id": 1, "name": "Alice", "value": 100}, + {"id": 2, "name": "Bob", "value": 200}, + ] def save_results(records: list[dict], output_dir: Path) -> None: """ @@ -44,7 +62,15 @@ def save_results(records: list[dict], output_dir: Path) -> None: Create output_dir if it does not exist. Log the number of records written. """ - raise NotImplementedError("Task 1: write records to output_dir/results.txt") + output_dir.mkdir(parents=True, exist_ok=True) + + file_path = output_dir / "results.txt" + + with file_path.open("w") as f: + for record in records: + f.write(f"{record}\n") + logger.info(f"saved {len(records)} records to {file_path}") + #raise NotImplementedError("Task 1: write records to output_dir/results.txt") def run() -> None: From a0b7aad94a26ed2f649c8bb2463b1141cf237e45 Mon Sep 17 00:00:00 2001 From: Lasse Benninga Date: Wed, 3 Jun 2026 07:58:46 +0200 Subject: [PATCH 2/4] ci: skip Azure/ACR steps on fork PRs GitHub withholds AZURE_CREDENTIALS from pull_request runs that originate from a fork, causing the azure/login step to fail. The if-guard skips the Azure/ACR steps on fork PRs so CI stays green. The central Grade ACR push workflow on the assignment repo's main handles the actual push from base-repo context (where the secret is available) and comments the image URL on the PR. --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d91651f..59ceab7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,18 +28,26 @@ jobs: run: API_KEY=test pytest -q - name: Build Docker image run: docker build -t barbari-pipeline:${{ github.sha }} . + # The next four steps need the AZURE_CREDENTIALS secret, which GitHub + # withholds on pull_request runs from forks for security. The `if:` guard + # skips them on fork PRs so CI stays green; the central `Grade ACR push` + # workflow on main handles the actual push from base-repo context. - name: Azure login + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false uses: azure/login@v2 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: ACR login + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false run: az acr login --name hyfregistry - name: Tag image for ACR + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false run: | docker tag barbari-pipeline:${{ github.sha }} hyfregistry.azurecr.io/barbari-pipeline:${{ github.sha }} - name: Push image to ACR + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false run: | docker push hyfregistry.azurecr.io/barbari-pipeline:${{ github.sha }} \ No newline at end of file From 2d8a960adc2334abe2296caadf18ad0d0031fa5e Mon Sep 17 00:00:00 2001 From: baraah Date: Wed, 3 Jun 2026 18:51:27 +0200 Subject: [PATCH 3/4] ArcPushScreenshot --- assets/acr_push_week5.png | Bin 0 -> 321775 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/acr_push_week5.png diff --git a/assets/acr_push_week5.png b/assets/acr_push_week5.png new file mode 100644 index 0000000000000000000000000000000000000000..c273b9037e029e1325f38bff785b514951a7c8d0 GIT binary patch literal 321775 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