⏱ Estimated time: 2–3 hours self-paced (~20 min per module).
This workshop is designed to help you understand the importance of shift-left security and how to implement security scanning across your pipeline.
All of this without forgetting the human factor, as the final objective is not blind security but enabling your users (or yourself) to build secure software effectively.
The idea of this workshop is to demonstrate how to build a "perfect" (secure and practical) CI/CD pipeline using open-source tools (OSS).
The goal is inspirational, not prescriptive. We do not want you to copy these examples, but to understand the principles and identify the modular components you can adapt to implement in your own environment.
Note
*Platform-agnostic principles: The workshop runs on GitHub Actions for convenience, but the tools (Semgrep, Trivy, Checkov, Prowler…) and patterns (shift-left, scan-then-gate, multi-layer pipeline) are universal. To take this to GitLab CI, Jenkins, CircleCI, etc., translate the orchestration glue (workflow files, secrets, triggers) and keep everything else.
By completing this workshop, you will:
- Understand the importance of shift-left security
- Learn the key stages of a secure pipeline:
- Pipeline Security
- Static and Dynamic Code Analysis
- Secrets Detection
- Container Security
- Infrastructure as Code (IaC) Security
- Runtime Infrastructure Security
- Know relevant OSS tools for each stage
- Grasp the principles needed to start building or improving your own secure CI/CD process
Let's start with some important concepts:
A pipeline is a series of automated steps that build, test, and deploy software. It is a key part of the software development lifecycle and helps ensure that software is delivered with high quality and security.
Related to pipelines, you have probably heard about the concepts of Continuous Integration and Continuous Delivery. But to build a truly modern and resilient pipeline, we need to formally add a third component: Continuous Security.
-
Continuous Integration (CI): This is where developers merge code into a shared branch multiple times a day. Every merge kicks off an automated build and test, ensuring the mainline of your code is never broken for long.
-
Continuous Delivery (CD): This takes CI a step further. It’s an automated process that ensures any change passing the tests can be safely deployed to production with a single click, making release day a non-event.
-
Continuous Security (CS): This is the crucial next step in the evolution, embedding security into the process. It means automating security controls and tests throughout the pipeline, just like we do for quality, to find vulnerabilities when they are cheapest and easiest to fix.
Shift-left security is a security practice that aims to move security checks and mitigations as early as possible in the software development lifecycle. This approach helps catch security issues early, before they reach production, and reduces the risk of vulnerabilities being exploited.
Based on the image from https://devopedia.org/shift-left
Each module ships as a placeholder job in .github/workflows/. You swap it for a real tool's job (provided under workshop/<module>/<tool>/), push, and watch the orchestrator catch a planted misconfiguration (the bait). Fix it, push again, green ✅. Move to the next module.
Set up your fork in Prerequisites below, then jump to Working through a module for the full step-by-step.
We suggest you follow the workshop in the following order, but feel free to jump around and explore the different modules.
- Pipeline Security Scan
- Code Security Scan
- Secrets Scan
- Container Security Scan
- Infrastructure as Code Security Scan
- Runtime Infrastructure Scan
- AI Security Review
Before you start:
-
Fork this repository — you need write access to push, create branches, and configure secrets.
-
Set up your working branch. On any page of your fork, press
.(or changegithub.com→github.devin the URL) to open a full VS Code editor in the browser. Use the branch picker (bottom-left) → createworkshopoffmain. You're ready to edit YAMLs, commit and push from the Source Control panel. Keepmainclean so you can compare your changes against the upstream and reset easily if something goes sideways.Prefer your own editor?
git clone https://github.com/<your-user>/secure-pipeline-workshop.git && cd secure-pipeline-workshop && git checkout -b workshop. Everything else applies the same way.After your first push, open a PR from
workshop→ your fork'smain. The orchestrator runs as PR checks; every subsequent push toworkshopupdates the same PR — you don't open it again. -
(Optional) Enable GitHub Advanced Security on your fork — some tools (Semgrep, Grype, Trivy IaC) upload SARIF for the Code Scanning tab. The job log already shows full findings (rule, message, file, line) regardless — GHAS just adds a richer UI on top.
-
Per-module secrets and variables — most modules work out of the box. The ones that don't:
Module What you need Where to get it 2. Code Scan NVD_API_KEY(secret, optional but recommended for OWASP Dependency Check)Request from NVD 6. Runtime Infra Scan AWS_IAM_ROLE_ARN(secret),AWS_REGION+AWS_IAM_ROLE_SESSION_DURATION(vars)IAM role with SecurityAudit+ViewOnlyAccessand a GitHub OIDC trust policy7. AI Security Review GEMINI_API_KEY(secret)Google AI Studio → Create API key (free tier, no credit card) Configure them at
Settings → Secrets and variables → Actionson your fork.
For each module:
- Read the module's
README.mdfor context (why, common issues, tools available). - Pick a tool and open
workshop/<module>/<tool>/workflow.yml. The header comments list any extra prerequisites for that tool. - Replace the
jobs:section of.github/workflows/<module>-scan.ymlwith the snippet'sjobs:section. Keep the file'sname:,on:,inputs:,secrets:, andoutputs:blocks intact. - Commit and push to your
workshopbranch. The orchestrator re-runs on your open PR — watch the Checks tab. - Read the failure: each module ships with a planted bait (a misconfiguration or vulnerable line) the scanner is meant to catch. The job log points at the file and line. If you get stuck, the module's
Solutionssection is the safety net. - Fix the bait and push again until the job goes green ✅. (Optional: try a second tool in the same module — it usually flags the same bait.)
ℹ️ Modules whose placeholder you haven't replaced stay green by design (the placeholder just echoes a message). Focus on the job for the module you're working on.
ℹ️ Module 6 exception: the runtime infra scan runs against a live AWS account, so there's no planted bait to fix. It's expected to pass green even when Prowler reports findings — see its
Running this modulesection.
- Deep dives into specific development workflows (e.g., Gitflow vs. Trunk-based)
- Focus on a specific application technology stack (language/framework agnostic where possible)
- A definitive statement on the "best" tools (alternatives will be mentioned for key steps)

