Skip to content

Commit a753aed

Browse files
author
Muhamad Sazwan Bin Ismail
authored
Create moda-ci.yaml for Docker security scanning
Add MODA CI pipeline workflow with Docker security scan. ```yaml # .github/workflows/moda-ci.yaml name: MODA CI - Docker Security Scan on: push: branches: [ main, develop ] pull_request: branches: [ main ] schedule: - cron: '0 2 * * 0' # weekly scan on Sunday at 2am workflow_dispatch: jobs: docker-security-scan: name: Call reusable Docker security workflow # Reference the reusable workflow from internal repository uses: github/internal-actions/.github/workflows/docker_security.yml@main with: # Image name – adjust if you need a specific tag format image-name: ${{ github.repository }}:${{ github.sha }} # Path to Dockerfile (relative to repository root) dockerfile-path: ./Dockerfile # Build context (usually the directory containing the Dockerfile) build-context: . # Optional: enable fail on critical vulnerabilities fail-on-critical: true # Optional: specify platform if multi‑arch build is needed # platform: linux/amd64,linux/arm64 secrets: # Docker registry credentials (if your image is pushed to a private registry) registry-username: ${{ secrets.DOCKER_USERNAME }} registry-password: ${{ secrets.DOCKER_PASSWORD }} # Snyk token for vulnerability scanning (if used by the reusable workflow) snyk-token: ${{ secrets.SNYK_TOKEN }} # Slack webhook for notifications (optional) slack-webhook: ${{ secrets.SLACK_WEBHOOK }} ``` **Penjelasan:** - **Trigger**: Workflow ini berjalan pada push ke `main`/`develop`, pull request ke `main`, jadual mingguan, dan boleh dicetus manual. - **Reusable workflow**: Memanggil `docker_security.yml` dari repositori `github/internal-actions` pada branch `main`. Pastikan workflow tersebut wujud dan mempunyai akses yang sesuai. - **Input**: - `image-name`: Gabungan nama repositori dan SHA commit, sesuai untuk penandaan unik. - `dockerfile-path` dan `build-context`: Laluan standard untuk membina imej. - `fail-on-critical`: Jika true, job akan gagal apabila terdapat kelemahan kritikal. - (Ulasan) `platform`: Jika perlu bina untuk pelbagai seni bina, nyahkomen dan laraskan. - **Secrets**: Hantar rahsia yang diperlukan oleh workflow dalaman. Gantikan dengan nama rahsia sebenar yang telah ditetapkan di repositori anda. **Langkah seterusnya:** 1. Simpan fail ini sebagai `.github/workflows/moda-ci.yaml` dalam repositori anda. 2. Tambah sebarang rahsia yang diperlukan (DOCKER_USERNAME, DOCKER_PASSWORD, SNYK_TOKEN, SLACK_WEBHOOK) di **Settings → Secrets and variables → Actions**. 3. Sesuaikan nilai input seperti `fail-on-critical` atau tambah `platform` jika perlu. 4. Uji dengan mencetuskan workflow (misalnya dengan push ke branch). ```yaml # .github/workflows/moda-ci.yaml name: MODA CI – Advanced Docker Security Scan on: push: branches: [ main, develop, release/** ] pull_request: branches: [ main ] schedule: - cron: '0 2 * * 0' # weekly scan every Sunday at 2am workflow_dispatch: inputs: fail-on-critical: description: 'Fail build on critical vulnerabilities?' required: true default: true type: boolean extra-tags: description: 'Additional image tags (comma separated)' required: false default: '' env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: # Matrix job for multiple Dockerfiles or build contexts security-scan: name: Security Scan (${{ matrix.context }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - dockerfile: ./Dockerfile context: . image-suffix: '' - dockerfile: ./api/Dockerfile context: ./api image-suffix: -api # add more as needed steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Build image for scanning (do not push yet) - name: Build Docker image uses: docker/build-push-action@v5 with: context: ${{ matrix.context }} file: ${{ matrix.dockerfile }} tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:scan${{ matrix.image-suffix }}-${{ github.sha }} load: true cache-from: type=gha cache-to: type=gha,mode=max # 1. Trivy vulnerability scan - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:scan${{ matrix.image-suffix }}-${{ github.sha }} format: 'sarif' output: 'trivy-results${{ matrix.image-suffix }}.sarif' severity: 'CRITICAL,HIGH' exit-code: '1' # fail if vulnerabilities found continue-on-error: ${{ !github.event.inputs.fail-on-critical && github.event.inputs.fail-on-critical != 'true' }} - name: Upload Trivy results to GitHub Security tab uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: 'trivy-results${{ matrix.image-suffix }}.sarif' # 2. Snyk container scan (requires SNYK_TOKEN) - name: Snyk Container scan uses: snyk/actions/docker@master continue-on-error: ${{ !github.event.inputs.fail-on-critical && github.event.inputs.fail-on-critical != 'true' }} env: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} with: image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:scan${{ matrix.image-suffix }}-${{ github.sha }} args: --file=${{ matrix.dockerfile }} --severity-threshold=high # 3. Grype scan (optional) - name: Grype scan uses: anchore/scan-action@v3 with: image: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:scan${{ matrix.image-suffix }}-${{ github.sha }} fail-build: ${{ github.event.inputs.fail-on-critical == 'true' }} severity-cutoff: high # Call internal reusable workflow (if you still want to use it) internal-security-scan: name: Call internal reusable workflow if: false # disable if you prefer the matrix above; remove or set condition as needed uses: github/internal-actions/.github/workflows/docker_security.yml@main with: image-name: ${{ github.repository }}:${{ github.sha }} dockerfile-path: ./Dockerfile build-context: . fail-on-critical: ${{ github.event.inputs.fail-on-critical || true }} secrets: registry-username: ${{ secrets.DOCKER_USERNAME }} registry-password: ${{ secrets.DOCKER_PASSWORD }} snyk-token: ${{ secrets.SNYK_TOKEN }} slack-webhook: ${{ secrets.SLACK_WEBHOOK }} ``` **Ciri-ciri utama:** - **Matrix strategy** – mengimbas berbilang Dockerfile (contoh: utama dan API). - **Imbasan menyeluruh** – Trivy, Snyk, Grype untuk liputan maksimum. - **Hasil SARIF** dimuat naik ke tab Security GitHub. - **Kawalan kegagalan** melalui input `fail-on-critical` (boleh ditetapkan manual). - **Masih menyertakan** panggilan ke reusable workflow dalaman (dilumpuhkan sementara dengan `if: false` – aktifkan jika perlu). **Sesuaikan mengikut keperluan:** - Tambah atau alih keluar alat imbasan. - Laraskan `severity` dan `exit-code` mengikut polisi keselamatan anda. - Gantikan `github/internal-actions/.github/workflows/docker_security.yml@main` dengan workflow sebenar anda. **Secrets yang perlu ditetapkan** (di Settings → Secrets and variables → Actions): - `DOCKER_USERNAME`, `DOCKER_PASSWORD` – jika registry memerlukan log masuk. - `SNYK_TOKEN` – untuk imbasan Snyk. - `SLACK_WEBHOOK` – untuk notifikasi (pilihan). Workflow ini akan memberikan anda kawalan penuh ke atas keselamatan imej Docker anda.
1 parent ffd1f12 commit a753aed

1 file changed

Lines changed: 257 additions & 0 deletions

File tree

Lines changed: 257 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
Berikut adalah contoh fail workflow `moda-ci.yaml` yang memanggil reusable workflow `docker_security.yml` dari repositori dalaman `github/internal-actions`. Anda perlu menyesuaikan nilai input dan memastikan sebarang rahsia (secrets) yang diperlukan telah ditetapkan dalam repositori.
2+
3+
```yaml
4+
# .github/workflows/moda-ci.yaml
5+
name: MODA CI Pipeline
6+
7+
on:
8+
push:
9+
branches: [ main, develop ]
10+
pull_request:
11+
branches: [ main ]
12+
workflow_dispatch: # allow manual trigger
13+
14+
jobs:
15+
# Panggil reusable workflow untuk keselamatan Docker
16+
security-scan:
17+
name: Docker Security Scan
18+
uses: github/internal-actions/.github/workflows/docker_security.yml@main
19+
with:
20+
# Input yang diperlukan oleh workflow docker_security.yml
21+
# Gantikan dengan nilai yang sesuai untuk projek anda
22+
image-name: ${{ github.repository }}:${{ github.sha }}
23+
dockerfile-path: ./Dockerfile
24+
build-context: .
25+
# Tambah input lain seperti yang dinyatakan dalam workflow tersebut
26+
secrets:
27+
# Sekiranya workflow memerlukan token pendaftaran Docker atau rahsia lain,
28+
# hantarkan di sini. Gantikan dengan nama rahsia yang sesuai.
29+
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
30+
# GITHUB_TOKEN dihantar secara automatik, jadi tidak perlu dinyatakan
31+
```
32+
33+
**Penjelasan:**
34+
35+
- **`uses`**: Merujuk kepada workflow di repositori `github/internal-actions`, fail `.github/workflows/docker_security.yml` pada branch `main`.
36+
- **`with`**: Menghantar input ke workflow yang dipanggil. Gantikan placeholder (`image-name`, `dockerfile-path`, dll.) dengan nilai sebenar yang diperlukan oleh workflow tersebut. Lihat dokumentasi workflow dalaman untuk senarai input penuh.
37+
- **`secrets`**: Menghantar rahsia yang diperlukan. `registry-password` hanyalah contoh; gantikan dengan nama rahsia yang betul. Pastikan rahsia tersebut telah ditetapkan di repositori anda (Settings → Secrets and variables → Actions).
38+
39+
**Langkah seterusnya:**
40+
41+
1. **Semak dokumentasi** workflow `docker_security.yml` untuk mengetahui input dan rahsia yang diperlukan.
42+
2. **Tetapkan sebarang rahsia** di repositori anda.
43+
3. **Sesuaikan nama branch** dalam `on.push.branches` mengikut keperluan anda.
44+
45+
Workflow ini akan dijalankan secara automatik setiap kali anda menolak kod ke `main` atau `develop`, atau membuat pull request ke `main`. Anda juga boleh menjalankannya secara manual melalui tab Actions.
46+
Berikut adalah beberapa contoh tambahan workflow yang memanggil reusable workflow `docker_security.yml` dari repositori dalaman `github/internal-actions`. Setiap contoh menunjukkan situasi berbeza dan cara mengendalikan input, rahsia, serta kawalan aliran.
47+
48+
---
49+
50+
## 📁 **Contoh 1: Workflow dengan Matrix Strategy (Pelbagai Platform)**
51+
52+
Jika projek anda perlu membina imej Docker untuk pelbagai seni bina (AMD64, ARM64), anda boleh menggunakan matrix untuk memanggil reusable workflow secara berulang.
53+
54+
```yaml
55+
# .github/workflows/moda-ci-matrix.yaml
56+
name: MODA CI with Matrix
57+
58+
on:
59+
push:
60+
branches: [ main ]
61+
workflow_dispatch:
62+
63+
jobs:
64+
# Panggil reusable workflow untuk setiap platform
65+
security-scan:
66+
name: Docker Security Scan (${{ matrix.platform }})
67+
uses: github/internal-actions/.github/workflows/docker_security.yml@main
68+
strategy:
69+
matrix:
70+
platform: [linux/amd64, linux/arm64]
71+
with:
72+
image-name: ${{ github.repository }}:${{ github.sha }}-${{ matrix.platform }}
73+
dockerfile-path: ./Dockerfile
74+
build-context: .
75+
platform: ${{ matrix.platform }} # input tambahan untuk workflow
76+
secrets:
77+
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
78+
```
79+
80+
---
81+
82+
## 🔐 **Contoh 2: Menghantar Banyak Rahsia dan Menggunakan Condition**
83+
84+
Kadangkala reusable workflow memerlukan pelbagai rahsia (misalnya untuk imbasan Snyk, Docker Hub, dsb.). Anda juga boleh mengawal bila workflow dipanggil menggunakan `if`.
85+
86+
```yaml
87+
# .github/workflows/moda-ci-advanced.yaml
88+
name: MODA CI Advanced
89+
90+
on:
91+
pull_request:
92+
branches: [ main ]
93+
push:
94+
tags: [ 'v*' ]
95+
96+
jobs:
97+
call-security:
98+
name: Run Docker Security Checks
99+
# Hanya panggil jika perubahan melibatkan Dockerfile atau fail berkaitan
100+
if: contains(github.event.head_commit.modified, 'Dockerfile') || github.event_name == 'pull_request'
101+
uses: github/internal-actions/.github/workflows/docker_security.yml@main
102+
with:
103+
image-name: ${{ github.repository }}:${{ github.sha }}
104+
dockerfile-path: ./Dockerfile
105+
build-context: .
106+
fail-on-critical: true # contoh input boolean
107+
secrets:
108+
registry-username: ${{ secrets.DOCKER_USERNAME }}
109+
registry-password: ${{ secrets.DOCKER_PASSWORD }}
110+
snyk-token: ${{ secrets.SNYK_TOKEN }}
111+
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
112+
```
113+
114+
---
115+
116+
## 🧪 **Contoh 3: Menguji dan Debug dengan Input Pilihan**
117+
118+
Jika reusable workflow menyokong mod debug, anda boleh menambah input khas untuk debugging.
119+
120+
```yaml
121+
# .github/workflows/moda-ci-debug.yaml
122+
name: MODA CI Debug
123+
124+
on:
125+
workflow_dispatch:
126+
inputs:
127+
debug:
128+
description: 'Enable debug mode'
129+
required: false
130+
default: 'false'
131+
type: boolean
132+
133+
jobs:
134+
debug-scan:
135+
name: Debug Security Scan
136+
uses: github/internal-actions/.github/workflows/docker_security.yml@main
137+
with:
138+
image-name: ${{ github.repository }}:${{ github.sha }}
139+
dockerfile-path: ./Dockerfile
140+
build-context: .
141+
debug: ${{ github.event.inputs.debug }}
142+
# input debug mungkin digunakan dalam workflow untuk menghidupkan logging verbose
143+
secrets:
144+
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
145+
```
146+
147+
---
148+
149+
## 🔄 **Contoh 4: Memanggil Workflow daripada Branch Berbeza**
150+
151+
Jika anda sedang membangunkan perubahan pada workflow dalaman, anda boleh memanggilnya dari branch lain (bukan `main`) untuk ujian.
152+
153+
```yaml
154+
# .github/workflows/moda-ci-test-branch.yaml
155+
name: MODA CI (Test Branch)
156+
157+
on:
158+
push:
159+
branches: [ feature/new-security-checks ]
160+
161+
jobs:
162+
test-workflow:
163+
name: Test Workflow from dev branch
164+
# Gantikan @main dengan @nama-branch
165+
uses: github/internal-actions/.github/workflows/docker_security.yml@feature/add-trivy
166+
with:
167+
image-name: ${{ github.repository }}:test
168+
dockerfile-path: ./Dockerfile
169+
build-context: .
170+
secrets:
171+
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
172+
```
173+
174+
---
175+
176+
## ⚠️ **Contoh 5: Mengendalikan Kegagalan (Continue on Error)**
177+
178+
Anda boleh membenarkan workflow terus walaupun langkah tertentu gagal, misalnya jika imbasan keselamatan tidak kritikal.
179+
180+
```yaml
181+
# .github/workflows/moda-ci-continue.yaml
182+
name: MODA CI (Continue on Error)
183+
184+
on:
185+
push:
186+
branches: [ main ]
187+
188+
jobs:
189+
call-security:
190+
uses: github/internal-actions/.github/workflows/docker_security.yml@main
191+
with:
192+
image-name: ${{ github.repository }}:${{ github.sha }}
193+
dockerfile-path: ./Dockerfile
194+
build-context: .
195+
secrets:
196+
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
197+
# Jika workflow dalaman gagal, job lain masih boleh dijalankan
198+
continue-on-error: true
199+
200+
deploy:
201+
needs: call-security
202+
runs-on: ubuntu-latest
203+
steps:
204+
- name: Deploy application
205+
run: echo "Deploying..."
206+
```
207+
208+
---
209+
210+
## 🧩 **Senarai Semak Input dan Rahsia**
211+
212+
Sebelum menggunakan reusable workflow, pastikan anda mengetahui input dan rahsia yang diperlukan. Biasanya dokumentasi workflow akan menyenaraikannya. Contoh input yang mungkin:
213+
214+
| Input | Jenis | Penerangan |
215+
|-------|-------|------------|
216+
| `image-name` | string | Nama penuh imej Docker (termasuk tag) |
217+
| `dockerfile-path` | string | Laluan ke Dockerfile (contoh: `./Dockerfile`) |
218+
| `build-context` | string | Konteks pembinaan (contoh: `.`) |
219+
| `platform` | string | Platform sasaran (contoh: `linux/amd64`) |
220+
| `fail-on-critical` | boolean | Gagalkan job jika terdapat isu kritikal |
221+
| `debug` | boolean | Hidupkan output verbose |
222+
223+
Rahsia biasa:
224+
225+
| Rahsia | Penerangan |
226+
|--------|------------|
227+
| `registry-username` | Nama pengguna untuk Docker registry |
228+
| `registry-password` | Kata laluan/token untuk registry |
229+
| `snyk-token` | Token API Snyk untuk imbasan |
230+
| `slack-webhook` | Webhook Slack untuk notifikasi |
231+
232+
---
233+
234+
## 🔍 **Menguji Workflow Tempatan**
235+
236+
Anda boleh menggunakan alat seperti [`act`](https://github.com/nektos/act) untuk menjalankan GitHub Actions secara tempatan. Ini membantu menguji sebelum push.
237+
238+
```bash
239+
# Pasang act (macOS)
240+
brew install act
241+
242+
# Jalankan workflow secara tempatan
243+
act push -j call-security
244+
```
245+
246+
Pastikan anda menyediakan fail `.secrets` untuk rahsia tempatan.
247+
248+
---
249+
250+
## 📌 **Kesimpulan**
251+
252+
Dengan menggunakan reusable workflow, anda dapat:
253+
- Mengurangkan penduaan kod.
254+
- Memastikan konsistensi merentas repositori.
255+
- Memudahkan pengurusan kemas kini keselamatan.
256+
257+
Sesuaikan contoh di atas dengan keperluan sebenar projek anda. Jika workflow dalaman `docker_security.yml` tidak mempunyai dokumentasi yang jelas, hubungi pemilik repositori untuk mendapatkan senarai input dan rahsia yang tepat.

0 commit comments

Comments
 (0)