|
4 | 4 | * Wygenerowanie PAT na Github |
5 | 5 | * Wygenerowanie tokena na Dockerhub |
6 | 6 | * Ustawienie zmiennych środowiskowych dla projektu |
7 | | -* Ustawienie 'secret-ów' dla projektu |
8 | | - |
| 7 | +* Ustawienie 'secret-ów' dla projektu |
9 | 8 |
|
10 | 9 |
|
11 | 10 | ## 2. Opracowanie łańcucha (pipeline) w usłudze GitHub Actions |
12 | 11 |
|
13 | 12 | ### Obraz spełnia warunki: |
14 | 13 | * Wpiera architekturę linux/arm64 oraz linux/amd64 |
15 | 14 | * są wykorzystywane dane cache (eksporter: registry oraz backend-u registry w trybie max) zamieszczone w publicznym repozytorium na [DockerHub](https://hub.docker.com/r/timtur/zadanie2-cache). |
16 | | -* Test CVE obrazu, który miał zapewnić, że obraz by był przesłany do publicznego repozytorium obrazów na GitHub, pod warunkiem, że obraz nie będzie zawierał zagrożeń sklasyfikowanych jako krytyczne lub wysokie został wykonany, jednakże nie dało się wyeliminować zagrożeń (_**1 critical i 4 high** z powodu braku możliwości pobrania nowszej wersji paczki `pkg:golang/stdlib@1.22.4`_) |
| 15 | +* Test CVE obrazu, który miał zapewnić, że obraz by był przesłany do publicznego repozytorium obrazów na GitHub, pod warunkiem, że obraz nie będzie zawierał zagrożeń sklasyfikowanych jako krytyczne lub wysokie został wykonany, jednakże nie dało się wyeliminować zagrożeń (_**1 critical i 4 high** z powodu braku możliwości pobrania nowszej wersji paczki `pkg:golang/stdlib@1.22.4`_). Po usunięciu testu obraz jest pomyślnie wysłany do publicznego repozutorium. |
| 16 | + |
| 17 | +> [!NOTE] |
| 18 | +> Plik 'zad2.yml' - instrukcja do wyzwolenia usługi Github Actions dla tego zadania znajduje się w katalogu 'docker/.github/workflows/' |
| 19 | +
|
| 20 | +## Pliki wykorzystane w projekcie |
| 21 | + |
| 22 | +### Plik Dockerfile (trochę zmieniony w porównaniu do zadania 1) |
| 23 | +``` |
| 24 | +# Obraz bazowy node alpine |
| 25 | +FROM node:24-alpine AS nodebuilder |
| 26 | +
|
| 27 | +# Uzycie zmiennej wersji |
| 28 | +ARG VERSION |
| 29 | +ENV VERSION=${VERSION} |
| 30 | +
|
| 31 | +# Ustawienie katalogu roboczego |
| 32 | +WORKDIR /app |
| 33 | +
|
| 34 | +# Kopiowanie plikow package |
| 35 | +COPY package.json . |
| 36 | +
|
| 37 | +# Instalacja zaleznosci produkcyjnych |
| 38 | +RUN npm install --production |
| 39 | +
|
| 40 | +# Kopiowanie pozostalych plikow aplikacji |
| 41 | +COPY . . |
| 42 | +
|
| 43 | +# Etap 2: Obraz koncowy |
| 44 | +FROM nodebuilder |
| 45 | +
|
| 46 | +# Skopiowanie aplikacji z poprzedniego etapu |
| 47 | +COPY --from=nodebuilder /app /app |
| 48 | +
|
| 49 | +# Dodanie pliku konfiguracyjnego 'JSON' |
| 50 | +COPY config.json /app/config.json |
| 51 | +
|
| 52 | +# Dodanie metadanych autora |
| 53 | +LABEL author="Tomasz Persa" |
| 54 | + |
| 55 | +# Eksponowanie portu |
| 56 | +EXPOSE 3000 |
| 57 | +
|
| 58 | +# Sprawdzanie, czy serwer dziala |
| 59 | +HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=3 \ |
| 60 | + CMD wget --spider --quiet http://localhost:3000 || exit 1 |
| 61 | +
|
| 62 | +# Uruchomienie aplikacji |
| 63 | +CMD ["npm", "start"] |
| 64 | +``` |
| 65 | + |
| 66 | +### Plik `zad2.yml` |
| 67 | +``` |
| 68 | +name: Build and Push Zadanie2 Docker Image |
| 69 | +
|
| 70 | +on: |
| 71 | + push: |
| 72 | + paths: |
| 73 | + - 'zadanie2/**' |
| 74 | + workflow_dispatch: |
| 75 | +
|
| 76 | +jobs: |
| 77 | + build-and-push: |
| 78 | + runs-on: ubuntu-latest |
| 79 | + permissions: |
| 80 | + contents: read |
| 81 | + packages: write # for GHCR |
| 82 | + id-token: write # for registry logins if using OIDC |
| 83 | +
|
| 84 | + steps: |
| 85 | + - name: Checkout repository |
| 86 | + uses: actions/checkout@v4 |
| 87 | +
|
| 88 | + - name: Set up QEMU for multi‑arch emulation |
| 89 | + uses: docker/setup-qemu-action@v2 |
| 90 | + with: |
| 91 | + platforms: linux/amd64, linux/arm64 |
| 92 | +
|
| 93 | + - name: Set up Docker Buildx |
| 94 | + uses: docker/setup-buildx-action@v2 |
| 95 | + with: |
| 96 | + buildkitd-flags: --debug |
| 97 | +
|
| 98 | + - name: Log in to Docker Hub (for cache) |
| 99 | + uses: docker/login-action@v2 |
| 100 | + with: |
| 101 | + registry: docker.io |
| 102 | + username: ${{ vars.DOCKERHUB_USERNAME }} |
| 103 | + password: ${{ secrets.DOCKERHUB_TOKEN }} |
| 104 | +
|
| 105 | + - name: Log in to GitHub Container Registry |
| 106 | + uses: docker/login-action@v2 |
| 107 | + with: |
| 108 | + registry: ghcr.io |
| 109 | + username: ${{ vars.GH_USERNAME }} |
| 110 | + password: ${{ secrets.GH_TOKEN }} |
| 111 | +
|
| 112 | + - name: Build image with cache |
| 113 | + id: build |
| 114 | + uses: docker/build-push-action@v6 |
| 115 | + with: |
| 116 | + context: ./zadanie2 |
| 117 | + file: ./zadanie2/dockerfile |
| 118 | + platforms: linux/amd64,linux/arm64 |
| 119 | + push: false |
| 120 | + tags: ghcr.io/${{ github.repository_owner }}/zadanie2:${{ github.sha }} |
| 121 | + cache-from: | |
| 122 | + type=registry,ref=${{ vars.DOCKERHUB_USERNAME }}/zadanie2-cache:cache |
| 123 | + cache-to: | |
| 124 | + type=registry,mode=max,ref=${{ vars.DOCKERHUB_USERNAME }}/zadanie2-cache:cache |
| 125 | +
|
| 126 | +# - name: Scan for vulnerabilities (Docker Scout) |
| 127 | +# uses: docker/scout-action@v1.18.1 # lub najnowsza stabilna wersja |
| 128 | +# with: |
| 129 | +# command: cves # obowiązkowy parametr „command” :contentReference[oaicite:0]{index=0} |
| 130 | +# only-severities: critical,high # filtr na CVE o statusie critical lub high :contentReference[oaicite:1]{index=1} |
| 131 | +# exit-code: true |
| 132 | +# github-token: ${{ secrets.GH_TOKEN }} # zamiast „token” należy użyć „github-token” :contentReference[oaicite:2]{index=2} |
| 133 | +# format: json |
| 134 | +# output: scout-report.json |
| 135 | +
|
| 136 | +
|
| 137 | +# - name: Check scan results |
| 138 | +# id: scout-check |
| 139 | +# run: | |
| 140 | +# high=$(jq '[.vulnerabilities[] | select(.severity=="high" or .severity=="critical")] | length' scout-report.json) |
| 141 | +# echo "count=$high" >> $GITHUB_OUTPUT |
17 | 142 |
|
18 | | - |
19 | | -(Plik 'zad2.yml' - instrukcja do wyzwolenia usługi Github Actions dla tego zadania znajduje się w katalogu 'docker/.github/workflows/') |
| 143 | + - name: Push image if secure |
| 144 | + # if: steps.scout-check.outputs.count == '0' |
| 145 | + uses: docker/build-push-action@v4 |
| 146 | + with: |
| 147 | + context: ./zadanie2 |
| 148 | + file: ./zadanie2/dockerfile |
| 149 | + platforms: linux/amd64,linux/arm64 |
| 150 | + push: true |
| 151 | + tags: | |
| 152 | + ghcr.io/${{ github.repository_owner }}/zadanie2:latest |
| 153 | + ghcr.io/${{ github.repository_owner }}/zadanie2:${{ github.sha }} |
| 154 | +``` |
20 | 155 |
|
| 156 | +Reszta plików projektowych jest taka sama jak w zadaniu 1. |
0 commit comments