āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ CI/CD Pipeline: GitHub Actions, GitLab CI āđāļĨāļ° Jenkins āļāļĩ 2026
āļĢāļ§āļĄāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ CI/CD pipeline āļāļĢāđāļāļĄāļāļģāļāļāļāļŠāļģāļŦāļĢāļąāļāļāļĩ 2026 āļāļĢāļāļāļāļĨāļļāļĄ GitHub Actions workflow, GitLab CI pipeline, Jenkins declarative pipeline āđāļĨāļ°āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ supply chain

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāđāļāļĩāđāļĒāļ§āļāļąāļ CI/CD pipeline āļāļ·āļāđāļāđāļāļŦāļāļķāđāļāđāļāļŦāļąāļ§āļāđāļāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļŠāļĢāļĢāļŦāļēāļāļļāļāļĨāļēāļāļĢ DevOps āļāļĨāļāļāļāļĩ 2026 āđāļāļĒ GitHub Actions āļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļēāļāļĄāļēāļāļāļ§āđāļē 71 āļĨāđāļēāļ job āļāđāļāļ§āļąāļ, GitLab CI āđāļāļīāļāļāļąāļ§āļāļĩāđāļāļāļĢāđāļāļēāļĢāļŠāļĢāđāļēāļ pipeline āļāđāļ§āļĒ AI āđāļĨāļ° Jenkins āļĒāļąāļāļāļāļāļąāļāļĢāļēāļāļēāļĢāđāļāđāļāļēāļāļāļĒāļđāđāļāļĩāđ 28% āļāļđāđāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāļŦāļ§āļąāļāđāļŦāđāļāļđāđāļŠāļĄāļąāļāļĢāļŠāļēāļĄāļēāļĢāļāđāļŠāļāļāļāļąāļāļĐāļ°āļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļāļāļāļāļąāđāļāļŠāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāđāļāđ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ CI/CD āļŠāđāļ§āļāđāļŦāļāđāļāļ°āđāļāđāļāļāļāļāđāļāđāļāļŠāļēāļĄāļŦāļĄāļ§āļāļŦāļĨāļąāļ: āļāļēāļĢāļāļāļāđāļāļ pipeline (āļ§āļīāļāļĩāļāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļ stage āđāļĨāļ° job) āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ (āļāļēāļĢāļāļąāļāļāļēāļĢ secret āđāļĨāļ°āļāļēāļĢāđāļŠāļĢāļīāļĄāļāļ§āļēāļĄāđāļāđāļāđāļāļĢāđāļ supply chain) āđāļĨāļ°āļāļēāļĢāđāļāđāđāļāļāļąāļāļŦāļē (āļāļēāļĢ debug build āļāļĩāđāļĨāđāļĄāđāļŦāļĨāļ§ āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ pipeline āļāļĩāđāļāđāļē) āļāļđāđāļŠāļĄāļąāļāļĢāļāļ§āļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļĩāļĒāļ pipeline configuration āļāļĒāđāļēāļāļāđāļāļĒāļŦāļāļķāđāļāļāļļāļ
āđāļāļĢāļāļŠāļĢāđāļēāļ Workflow āđāļĨāļ° Trigger āđāļ GitHub Actions
GitHub Actions āļāļąāļāļĢāļ°āļāļāļāļąāļāđāļāļĄāļąāļāļīāļāđāļēāļ workflow, job āđāļĨāļ° step āđāļāļĒ workflow āļāļ·āļāđāļāļĨāđ YAML āļāļĩāđāđāļāđāļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ .github/workflows/ āļāļķāđāļāļāļģāļŦāļāļāļ§āđāļēāļĢāļ°āļāļāļāļąāļāđāļāļĄāļąāļāļīāļāļ°āļāļģāļāļēāļāđāļĄāļ·āđāļāđāļāđāļĨāļ°āļāļĒāđāļēāļāđāļĢ āđāļāđāļĨāļ° workflow āļŠāļēāļĄāļēāļĢāļāļĄāļĩ job āđāļāđāļŦāļāļķāđāļāļŦāļĢāļ·āļāļŦāļĨāļēāļĒ job āđāļĨāļ°āđāļāđāļĨāļ° job āļāļ°āļāļģāļāļēāļāļāļ runner āļāļĩāđāđāļĒāļāļāļąāļ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāļāļĩāđāļāļāļāđāļāļĒāļāļ°āļāļāđāļŦāđāļāļđāđāļŠāļĄāļąāļāļĢāļāļāļīāļāļēāļĒāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļ trigger on āļāļēāļĢāļāļķāđāļāļāļēāļĢāļ°āļŦāļ§āđāļēāļ job āđāļĨāļ° keyword needs
# .github/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
test:
needs: lint # āļĢāļāđāļŦāđ lint āđāļŠāļĢāđāļāļāđāļāļ
runs-on: ubuntu-latest
strategy:
matrix:
node: [20, 22] # āļĢāļąāļāđāļāļŠāļāđāļāļāļāļąāđāļāļŠāļāļāđāļ§āļāļĢāđāļāļąāļ
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: npm
- run: npm ci
- run: npm test
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production # āļāđāļāļāđāļāđāļĢāļąāļāļāļēāļĢāļāļāļļāļĄāļąāļāļī
steps:
- uses: actions/checkout@v4
- run: ./deploy.shWorkflow āļāļĩāđāđāļŠāļāļāđāļŦāđāđāļŦāđāļāļŠāļēāļĄāđāļāļ§āļāļīāļāļŠāļģāļāļąāļ: keyword needs āļŠāļĢāđāļēāļ dependency graph āļĢāļ°āļŦāļ§āđāļēāļ job āļāđāļēāļāđ, āļāļĨāļĒāļļāļāļāđ matrix āļāđāļ§āļĒāđāļŦāđāļāļāļŠāļāļāđāļāļāļāļāļēāļāļāļ Node.js āļŦāļĨāļēāļĒāđāļ§āļāļĢāđāļāļąāļ āđāļĨāļ° keyword environment āļāļģāļŦāļāļāđāļŦāđāļāļēāļĢ deploy āļāđāļāļāļāđāļēāļāļāļēāļĢāļāļāļļāļĄāļąāļāļīāļāđāļ§āļĒāļāļāđāļāļ
āļāļēāļĢāļāļģāļŦāļāļāļāđāļē Pipeline āđāļ GitLab CI āļāđāļ§āļĒ Stages
GitLab CI āđāļāđāđāļāļĨāđ .gitlab-ci.yml āļāļĩāđ root āļāļāļ repository āļāļķāđāļāđāļāļāļāđāļēāļāļāļēāļ GitHub Actions āļāļĩāđ job āļāļģāļāļēāļāđāļāļāļāļīāļŠāļĢāļ°āđāļāļĒāļāđāļēāđāļĢāļīāđāļĄāļāđāļ GitLab CI āļāļąāļāļāļĨāļļāđāļĄ job āđāļāđāļēāđāļ stage āļāļĩāđāļāļģāļāļēāļāļāļēāļĄāļĨāļģāļāļąāļ āđāļāļāļāļ°āļāļĩāđ job āļ āļēāļĒāđāļ stage āđāļāļĩāļĒāļ§āļāļąāļāļāļ°āļāļģāļāļēāļāđāļāļāļāļāļēāļ
āļāļđāđāļŠāļąāļĄāļ āļēāļĐāļāđāļĄāļąāļāļāļāđāļŦāđāļāļđāđāļŠāļĄāļąāļāļĢāđāļāļĨāļ workflow āļāļāļ GitHub Actions āđāļāđāļ pipeline āļāļāļ GitLab CI āļŦāļĢāļ·āļāđāļāļāļēāļāļāļĨāļąāļāļāļąāļ
# .gitlab-ci.yml
stages:
- validate
- test
- deploy
variables:
NODE_VERSION: "22"
lint:
stage: validate
image: node:${NODE_VERSION}
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
script:
- npm ci
- npm run lint
unit-tests:
stage: test
image: node:${NODE_VERSION}
parallel:
matrix:
- NODE_VERSION: ["20", "22"]
script:
- npm ci
- npm test
artifacts:
reports:
junit: coverage/junit.xml
expire_in: 7 days
deploy-production:
stage: deploy
image: alpine:latest
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual # āļāļĢāļ°āļāļđāļāļ§āļāļāļļāļĄāđāļāļāđāļĄāļāļāļ§āļĨ
environment:
name: production
url: https://app.example.com
script:
- ./deploy.shāļāļ§āļēāļĄāđāļāļāļāđāļēāļāļŦāļĨāļąāļāļāļēāļ GitHub Actions: stages āļāļģāļŦāļāļāļĨāļģāļāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļąāđāļāļĢāļ°āļāļ, keyword parallel:matrix āļāļąāļāļāļēāļĢ matrix build āđāļĨāļ° artifacts:reports:junit āļĢāļ§āļĄāļāļĨāļāļēāļĢāļāļāļŠāļāļāđāļāđāļēāļāļąāļāļŦāļāđāļē merge request āđāļāļĒāļāļĢāļ GitLab 18.11 āļĒāļąāļāđāļāļīāļāļāļąāļ§ CI/CD inputs āļŠāļģāļŦāļĢāļąāļ pipeline merge request āļāļĩāđāļāđāļ§āļĒāđāļŦāđāļāļģāļŦāļāļāļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđāđāļāļāđāļāļāļēāļĄāļīāļāļŠāđāđāļāđāđāļāđāļāđāļĨāļ°āļĢāļāļāļāļēāļĢāļĢāļąāļ pipeline
āđāļ§āļĒāļēāļāļĢāļāđ Jenkins Declarative Pipeline
Jenkins āđāļāđ Jenkinsfile āļāļĩāđāđāļāđāļāđāļ§āđāļāļĩāđ root āļāļāļ repository āđāļāļĒāđāļ§āļĒāļēāļāļĢāļāđ declarative pipeline āļāļķāđāļāđāļāđāļāļĄāļēāļāļĢāļāļēāļāļāļĩāđāđāļāļ°āļāļģāđāļāļāļĩ 2026 āļĄāļāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļāļīāļāļāļĨāļēāļāļāļĩāđāļĄāļĩāđāļāļĢāļāļŠāļĢāđāļēāļāļāļąāļāđāļāļāđāļĨāļ°āļĢāļđāļāđāļāļāļāļēāļĄ stage āļāļĩāđāļāļąāļāđāļāļ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļāļāđāļāļĒ: āļāļāļīāļāļēāļĒāļāļ§āļēāļĄāđāļāļāļāđāļēāļāļĢāļ°āļŦāļ§āđāļēāļ declarative āđāļĨāļ° scripted pipeline āđāļĨāļ°āđāļĄāļ·āđāļāđāļĢāļāļ§āļĢāđāļāđāđāļāđāļĨāļ°āđāļāļ
// Jenkinsfile
pipeline {
agent any
tools {
nodejs 'node-22' // āļāļģāļŦāļāļāļāđāļēāđāļ Jenkins Global Tool
}
environment {
CI = 'true'
DEPLOY_ENV = credentials('deploy-env-secret')
}
stages {
stage('Install') {
steps {
sh 'npm ci'
}
}
stage('Lint & Test') {
parallel { // āļāļģāļāļēāļāđāļāļāļāļāļēāļ
stage('Lint') {
steps {
sh 'npm run lint'
}
}
stage('Test') {
steps {
sh 'npm test'
}
post {
always {
junit 'coverage/junit.xml'
}
}
}
}
}
stage('Deploy') {
when {
branch 'main'
}
input {
message 'Deploy to production?'
}
steps {
sh './deploy.sh'
}
}
}
post {
failure {
mail to: 'team@example.com',
subject: "Build failed: ${env.JOB_NAME}",
body: "Check ${env.BUILD_URL}"
}
}
}Declarative pipeline āļāļąāļāļāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļēāļāļāļĨāđāļāļāļāļĩāđāļāļģāđāļāđāļāđāļāđāđāļāđ pipeline, agent āđāļĨāļ° stages āļāļģāļŠāļąāđāļ parallel āļ āļēāļĒāđāļ stage āļāļ°āļĢāļąāļ lint āđāļĨāļ° test āļāļĢāđāļāļĄāļāļąāļ āļāļģāļŠāļąāđāļ input āļŦāļĒāļļāļāļāļēāļĢāļāļģāļāļēāļāļāļąāđāļ§āļāļĢāļēāļ§āđāļāļ·āđāļāļĢāļāļāļēāļĢāļāļāļļāļĄāļąāļāļīāļāđāļ§āļĒāļāļāđāļāļ āļāļĨāđāļēāļĒāļāļąāļ environment āļāļāļ GitHub Actions āđāļĨāļ° manual gate āļāļāļ GitLab āļāļąāđāļāļāļĩāđ Jenkins āļĒāļąāļāļāļģāļŦāļāļāđāļŦāđāđāļāđ Java 21 āļāļąāđāļāđāļāđāđāļāļ·āļāļāļĄāļāļĢāļēāļāļĄ 2026 āļāļąāļāļāļąāđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāļāļāļ pipeline āļāđāļāļāļāļģāļāļķāļāļāļķāļāļāļ§āļēāļĄāļāđāļāļāļāļēāļĢ runtime āļāļĩāđāļāđāļ§āļĒ
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļēāļĢāļāļąāļāļāļēāļĢ Secret āļāļāđāļāļĨāļāļāļāļĢāđāļĄ CI/CD āļāđāļēāļāđ
āļāļļāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ CI/CD āļāļ°āļĄāļĩāļāļģāļāļēāļĄāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢ secret āļāļĒāļđāđāđāļŠāļĄāļ āđāļāđāļĨāļ°āđāļāļĨāļāļāļāļĢāđāļĄāļāļąāļāļāļēāļĢāļāđāļāļĄāļđāļĨāļāļĢāļ°āļāļģāļāļąāļ§āđāļāļāļāđāļēāļāļāļąāļ āđāļĨāļ°āļāļēāļĢāđāļāđāļēāđāļāļāļĨāļāļĢāļ°āļāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļ·āļāđāļāđāļāļŠāļīāđāļāļŠāļģāļāļąāļ
GitHub Actions āđāļāđāļ secret āđāļāļĢāļ°āļāļąāļ repository, environment āļŦāļĢāļ·āļ organization āđāļāļĒ secret āļāļ°āļāļđāļāļāđāļāļāļāļēāļ log āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī āđāļāđāļĢāļđāļāđāļāļ scoping āļāļąāļāļāļļāļāļąāļāļĒāļąāļāļĄāļĩāļāđāļāļāļģāļāļąāļ āđāļāļāļāļēāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļĩ 2026 āđāļāđāđāļāļīāļāļāļąāļ§ scoped secret āļāļĩāđāļāļđāļāļāđāļāļĄāļđāļĨāļāļĢāļ°āļāļģāļāļąāļ§āļāļąāļāļāļĢāļīāļāļāļāļēāļĢāļāļģāļāļēāļāđāļāļāļēāļ° āļĨāļāļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāļāļēāļāļŠāļīāļāļāļīāđāļāļēāļĢāđāļāđāļēāļāļķāļāļāļĩāđāļāļ§āđāļēāļāđāļāļīāļāđāļ
GitLab CI āļĄāļāļ CI/CD variable āļāļĢāđāļāļĄāļāļāļāļēāļĢāļāđāļāļāļāļąāļ āđāļāļĒāļāļąāļ§āđāļāļĢāļāļĩāđāļāļđāļāļāđāļāļāļāļąāļāļāļ°āļāļđāļ inject āđāļāđāļēāđāļāđāļ pipeline āļāļĩāđāļĢāļąāļāļāļ branch āļŦāļĢāļ·āļ tag āļāļĩāđāđāļāđāļĢāļąāļāļāļēāļĢāļāđāļāļāļāļąāļāđāļāđāļēāļāļąāđāļ GitLab 18.3 āđāļāļīāđāļĄāļŠāļīāļāļāļīāđāđāļāļ fine-grained āļŠāļģāļŦāļĢāļąāļ CI/CD job token āđāļāļĒāđāļāđāļŦāļĨāļąāļāļāļēāļĢ least-privilege
Jenkins āđāļāđāļāļĨāļąāđāļāļāļīāļ Credentials āļāļĩāđāļĢāļāļāļĢāļąāļāļāđāļāļĄāļđāļĨāļāļĢāļ°āļāļģāļāļąāļ§āļŦāļĨāļēāļĒāļĢāļđāļāđāļāļ (username/password, SSH key, secret text, āđāļāļĢāļąāļāļĢāļāļ) helper credentials() āđāļ declarative pipeline āļāļ°āļāļđāļ secret āļāļąāļāļāļąāļ§āđāļāļĢāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ āđāļĨāļ° credential āļĢāļ°āļāļąāļ Folder āļāļģāļāļąāļāļŠāļīāļāļāļīāđāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļāļēāļ°āđāļāļĢāđāļāļāļāđ
āļāļģāļāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļŠāļģāļāļąāļ: āļŦāđāļēāļĄ hardcode secret āđāļāđāļāļĨāđ pipeline āđāļāļĒāđāļāđāļāļāļēāļ āđāļāđāļĢāļ°āļāļāļāļąāļāļāļēāļĢ secret āļāļąāđāļāđāļāļīāļĄāļāļāļāđāļāļĨāļāļāļāļĢāđāļĄāđāļŠāļĄāļ āļŦāļĄāļļāļāđāļ§āļĩāļĒāļ credential āļāļĒāđāļēāļāļŠāļĄāđāļģāđāļŠāļĄāļ āđāļĨāļ°āđāļĨāļ·āļāļāđāļāđ token āļĢāļ°āļĒāļ°āļŠāļąāđāļāđāļāļ API key āļĢāļ°āļĒāļ°āļĒāļēāļ§
āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ Pipeline āđāļĨāļ°āļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļāļ
Pipeline āļāļĩāđāļāđāļēāļŠāđāļāļāļĨāđāļāļĒāļāļĢāļāļāđāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāļāļąāļāļāļąāļāļāļē āļāļđāđāļŠāļąāļĄāļ āļēāļĐāļāđāļāļ°āļāļāļŠāļāļāļ§āđāļēāļāļđāđāļŠāļĄāļąāļāļĢāļŠāļēāļĄāļēāļĢāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđāđāļĨāļ°āđāļāđāđāļāļāļļāļāļāļāļāļ§āļāļāđāļēāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāļĢāļ°āļāļ CI/CD āđāļāđāļŦāļĢāļ·āļāđāļĄāđ
āđāļāļāļāļīāļāļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļĩāđāđāļāđāđāļāđāļāļąāđāļ§āđāļāļāļāļāļąāđāļāļŠāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāļĄāļĩāļŠāļēāļĄāļ§āļīāļāļĩ:
Dependency caching āļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļāļēāļ§āļāđāđāļŦāļĨāļ package āļāđāļģāđāļāļāļļāļāļĢāļāļāļāļēāļĢāļĢāļąāļ GitHub Actions āđāļāđ actions/cache āļŦāļĢāļ·āļāļāļēāļĢāļĢāļāļāļĢāļąāļāđāļāļāļāļĩāđāļĄāļĩāļĄāļēāđāļ setup action GitLab CI āđāļāđ cache āļāļĢāđāļāļĄāļāļĨāļĒāļļāļāļāđ key Jenkins āļāļēāļĻāļąāļĒāļāļēāļĢāļāļāļāļĒāļđāđāļāļāļ workspace āļŦāļĢāļ·āļāļāļģāļŠāļąāđāļ stash/unstash
āļāļēāļĢāļāļģāļāļēāļāđāļāļāļāļāļēāļ āđāļāđāļāļāļēāļāđāļāļĒāļąāļāļŦāļĨāļēāļĒ runner GitHub Actions āđāļāđāļāļĨāļĒāļļāļāļāđ matrix, GitLab CI āđāļāđ parallel:matrix āđāļĨāļ° Jenkins āđāļāđāļāļģāļŠāļąāđāļ parallel āļĢāļ°āļāļąāļāļāļ§āļēāļĄāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļāļēāļĢāđāļāđāļāļāļēāļāļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄāļāļķāđāļāļāļĒāļđāđāļāļąāļāđāļāļĢāđāļāļāļāđ: job āļāļāļēāļāļĄāļēāļāđāļāļīāļāđāļāļāļ°āđāļŠāļĩāļĒāđāļ§āļĨāļēāđāļĢāļīāđāļĄāļāđāļ runner āđāļāđāļāđāļāļĒāđāļāļīāļāđāļāļāļ°āļāļģāđāļŦāđāļāļĢāļąāļāļĒāļēāļāļĢāđāļŦāļĨāļ·āļāđāļāđ
āļāļēāļĢāļāļģāļāļēāļāđāļāļāļĄāļĩāđāļāļ·āđāļāļāđāļ āļāđāļēāļĄ stage āļāļĩāđāđāļĄāđāļāļģāđāļāđāļ āļāļąāđāļāļŠāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāļĢāļāļāļĢāļąāļ: GitHub Actions āļāđāļ§āļĒāļāļīāļāļāļāđ if, GitLab CI āļāđāļ§āļĒ rules āđāļĨāļ° Jenkins āļāđāļ§āļĒāļāļģāļŠāļąāđāļ when Pipeline āļāļĩāđāļāļāļāđāļāļāļĄāļēāļāļĩāļāļ°āļāđāļēāļĄ stage deployment āļāļ feature branch āđāļĨāļ°āļāđāļēāļĄāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļāļāļēāļ° lint āđāļĄāđāđāļŦāđāļĢāļąāļ test suite āļāļąāđāļāļŦāļĄāļ
āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ Pipeline CI/CD āđāļĨāļ°āļāļēāļĢāļāđāļāļāļāļąāļ Supply Chain
āļāļēāļĢāđāļāļĄāļāļĩ supply chain āļāļĩāđāļāļļāđāļāđāļāđāļēāļĢāļ°āļāļ CI/CD āđāļāļīāđāļĄāļāļķāđāļāļāļĒāđāļēāļāļĄāļēāļāđāļāļāļĩ 2025 āđāļāļĒāļĄāļĩāđāļŦāļāļļāļāļēāļĢāļāđāļāļĩāđāļŠāđāļāļāļĨāļāļĢāļ°āļāļāļāđāļ tj-actions/changed-files āđāļĨāļ° GitHub Actions āļĒāļāļāļāļīāļĒāļĄāļāļ·āđāļāđ āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļąāļāļāļļāļāļąāļāļāļķāļāļāļāļŠāļāļāļāļđāđāļŠāļĄāļąāļāļĢāđāļāļĩāđāļĒāļ§āļāļąāļāļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļŠāļĢāļīāļĄāļāļ§āļēāļĄāđāļāđāļāđāļāļĢāđāļāđāļāđāļāļāļĢāļ°āļāļģ
āļāļĢāļķāļāđāļ§āļāļĢāđāļāļąāļāļāļāļ action āļāđāļ§āļĒ commit SHA āđāļāļāļēāļ°āđāļāļ tag āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāļĄāļāļĩāđāļāļ tag-hijacking:
# .github/workflows/secure.yml
steps:
# āđāļŠāļĩāđāļĒāļ: tag āļŠāļēāļĄāļēāļĢāļāļāļđāļāļĒāđāļēāļĒāđāļāļĒāļąāļ commit āļāļĩāđāđāļāđāļāļāļąāļāļāļĢāļēāļĒ
- uses: actions/checkout@v4
# āļāļĨāļāļāļ āļąāļĒ: āļāļĢāļķāļāļāđāļ§āļĒ commit SHA āļāļĩāđāđāļāđāļāļāļ
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683GitLab CI āļāļąāļāļāļēāļĢāļāļąāļāļŦāļē supply chain āļāđāļēāļ CI/CD components āļāļĢāđāļāļĄāļāļēāļĢāļĢāļąāļāļĢāļāļ SLSA Level 1 (āļĄāļĩāđāļŦāđāđāļāđāļāļąāđāļāđāļāđ GitLab 18.1) āļāļķāđāļāļĄāļāļāđāļŦāļĨāđāļāļāļĩāđāļĄāļēāļāļĩāđāļāļąāļāđāļāļāļĒāļīāđāļāļāļķāđāļāđāļĄāļ·āđāļāļāļĢāļ°āļāļāļ pipeline āļāļēāļ component āļāļĩāđāđāļāđāļāđāļģāđāļāđ container tag āđāļāļ immutable (GitLab 18.2) āļāđāļāļāļāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļ image āļŦāļĨāļąāļāđāļāļĒāđāļāļĢāđāđāļĨāđāļ§
āļŠāļģāļŦāļĢāļąāļ Jenkins āļāļĨāđāļ Shared Library āļāļ§āļĢāđāļāđ repository āđāļāļāļēāļ°āļāļĩāđāļĄāļĩ branch protection āļāļēāļĢāļāļģāļŦāļāļāđāļŦāđāļĄāļĩ code review āđāļĨāļ° signed commit āļāļāļ°āļāļĢāļĢāļĄāļēāļāļīāļāļēāļĢāļĒāļļāđāļĢāļāđāļāđāđāļāļīāļāļāļąāļ§āđāļāļĢāļāļāļēāļĢ Bug Bounty āļŠāļģāļŦāļĢāļąāļ Jenkins āļāđāļēāļ YesWeHack āđāļĄāļ·āđāļāđāļĄāđāļāļēāļāļĄāļēāļāļĩāđ āļŠāļ°āļāđāļāļāđāļŦāđāđāļŦāđāļāļāļķāļāļāļāļāļēāļāļŠāļģāļāļąāļāļāļāļāđāļāļĨāļāļāļāļĢāđāļĄāļāļĩāđāđāļ supply chain āļāļāļāļāļāļāđāļāļĢ
āļāļēāļĢāļēāļāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāđāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ
| āļāļļāļāļŠāļĄāļāļąāļāļī | GitHub Actions | GitLab CI | Jenkins |
|---|---|---|---|
| āđāļāļĨāđāļāļģāļŦāļāļāļāđāļē | .github/workflows/*.yml | .gitlab-ci.yml | Jenkinsfile |
| āļĢāļđāļāđāļāļāļāļēāļĢāļāļģāļāļēāļ | āļāļēāļĄ job (āļāļāļēāļāđāļāļĒāļāđāļēāđāļĢāļīāđāļĄāļāđāļ) | āļāļēāļĄ stage (stage āļāļēāļĄāļĨāļģāļāļąāļ) | āļāļēāļĄ stage (āļĒāļ·āļāļŦāļĒāļļāđāļ) |
| Runner hosting | GitHub-hosted + self-hosted | GitLab.com shared + self-hosted | Self-hosted āđāļāđāļēāļāļąāđāļ |
| āļāļēāļĢāđāļāđāļ secret | Secret āļĢāļ°āļāļąāļ repository/org/environment | CI/CD variable (āļĄāļĩāļāļēāļĢāļāđāļāļāļāļąāļ) | āļāļĨāļąāđāļāļāļīāļ Credentials |
| Matrix build | strategy.matrix | parallel:matrix | matrix (āļāļĨāļąāđāļāļāļīāļ) |
| āļāļĢāļ°āļāļđāđāļĄāļāļāļ§āļĨ | environment + required reviewers | when: manual | āļāļģāļŠāļąāđāļ input |
| Marketplace | 20,000+ Actions āļāļ Marketplace | CI/CD Components Catalog | 1,800+ āļāļĨāļąāđāļāļāļīāļ |
| āļāļĩāđāļāļāļĢāđ AI | Copilot for Actions (preview) | Duo CI Expert Agent (beta) | āļāļĨāļąāđāļāļāļīāļāļāļēāļāļāļļāļĄāļāļ |
| āļĢāļēāļāļē | āļāļĢāļĩāļŠāļģāļŦāļĢāļąāļ repo āļŠāļēāļāļēāļĢāļāļ°, āļāļīāļāļāļēāļĄāļāļēāļāļĩāļŠāļģāļŦāļĢāļąāļ repo āļŠāđāļ§āļāļāļąāļ§ | 400 āļāļēāļāļĩ CI/CD āļāļĢāļĩ, āļāļēāļāļāļąāđāļāđāļāđāļāļāļąāđāļāļāļąāļāđāļ | āļāļĢāļĩ (āđāļāđāļāļāļāļāļĢāđāļŠ), āļāļđāđāļĨāđāļāļ |
āļāļēāļĢāļēāļāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāļāļ§āļēāļĄāđāļāļāļāđāļēāļāļāļĩāđāļĄāļąāļāļāļđāļāļāļāļŠāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ āļāļģāļāļēāļĄāļāđāļāļĒāļāļāļāļĩāđāļĄāļąāļāļāļēāļĄāļĄāļēāļāļ·āļ: "āļāļ°āđāļĨāļ·āļāļāđāļāļĨāļāļāļāļĢāđāļĄāđāļāļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļāļāđāđāļŦāļĄāđ āđāļĨāļ°āđāļāļĢāļēāļ°āļāļ°āđāļĢ?" āļāļģāļāļāļāļāļķāđāļāļāļĒāļđāđāļāļąāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĩāđāļĄāļĩāļāļĒāļđāđ āļāļāļēāļāļāļĩāļĄ āļāđāļāļāļģāļŦāļāļāļāđāļēāļ compliance āđāļĨāļ°āļ§āđāļēāļāļāļāđāļāļĢāļāđāļāļāļāļēāļĢāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāđāļāļāļāļąāļāļāļēāļĢāđāļŦāđ (GitHub/GitLab) āļŦāļĢāļ·āļāļāļ§āļāļāļļāļĄāļāļąāđāļāļŦāļĄāļ (Jenkins)
āļāļķāļāļāļāļāļģāļāļēāļĄāđāļŦāļĨāđāļēāļāļĩāđāļāđāļ§āļĒāđāļĄāļāļđāļĨāļŠāļąāļĄāļ āļēāļĐāļāđ CI/CD fundamentals āđāļĨāļ° GitHub Actions āļŦāļĢāļ·āļāļĻāļķāļāļĐāļēāđāļāļīāđāļĄāđāļāļīāļĄāļāļąāļāļāļģāļāļēāļĄāđāļāļāļēāļ°āļāļāļ GitLab CI āđāļĨāļ° Jenkins āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĢāļĩāļĒāļĄāļāļąāļ§ DevOps āļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāļĒāļīāđāļāļāļķāđāļ āļāļđāđāļĄāļ·āļāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ DevOps āļāļĩāđāļāļģāđāļāđāļāļāļĢāļāļāļāļĨāļļāļĄāļŦāļąāļ§āļāđāļāļāļąāđāļāļŦāļĄāļāļāļāļāđāļŦāļāļ·āļāļāļēāļ CI/CD
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļŠāļĢāļļāļ
- GitHub Actions āđāļāļāđāļāđāļāļŠāļģāļŦāļĢāļąāļ workflow āļāļĩāđāđāļāđāļāļēāļāļāļąāļ GitHub āđāļāļĒāļāļĢāļāļāđāļ§āļĒāļĢāļ°āļāļāļāļīāđāļ§āļĻ marketplace āđāļĨāļ°āļāļĩāđāļāļāļĢāđ parallel steps āļāļĩāđāļāļģāļĨāļąāļāļāļ°āļĄāļē āđāļāđāļāļ§āļĢāļāļĢāļķāļ action āļāđāļ§āļĒ commit SHA āđāļāļ·āđāļāļĨāļāļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāļāļēāļ supply chain
- GitLab CI āļĄāļāļāļāļēāļĢāļĢāļ§āļĄ CI/CD āđāļĨāļ°āļāļēāļĢāļŠāđāļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļĩāđāđāļāđāļāđāļāđāļāļāļĩāđāļŠāļļāļ āļāļĢāđāļāļĄāļāļēāļĢāļĢāļąāļāļĢāļāļ SLSA āļŠāļģāļŦāļĢāļąāļ component āđāļĨāļ°āļŠāļīāļāļāļīāđ fine-grained job token āļāļąāđāļāđāļāđāđāļ§āļāļĢāđāļāļąāļ 18.3
- Jenkins āļĒāļąāļāļāļāđāļāđāļāļāļąāļ§āđāļĨāļ·āļāļāļāļĩāđāļĒāļ·āļāļŦāļĒāļļāđāļāļāļĩāđāļŠāļļāļāļŠāļģāļŦāļĢāļąāļāļāļāļāđāļāļĢāļāļĩāđāļāđāļāļāļāļēāļĢāļāļ§āļāļāļļāļĄāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāļāļąāđāļāļŦāļĄāļ āđāļĄāđāļ§āđāļēāļāļ°āļāđāļāļāļāļēāļĢ Java 21 āļāļąāđāļāđāļāđāđāļāļ·āļāļāļĄāļāļĢāļēāļāļĄ 2026 āđāļĨāļ°āļĄāļĩāļ āļēāļĢāļ°āļāļēāļĢāļāļđāđāļĨāļāļĩāđāļŠāļđāļāļāļ§āđāļē
- āļāļēāļĢāļāļąāļāļāļēāļĢ secret āđāļāđāļāļŦāļąāļ§āļāđāļāļāđāļēāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļĩāđāļāļđāļāļāļāļŠāļāļāļĄāļēāļāļāļĩāđāļŠāļļāļāļāļāļāļąāđāļāļŠāļēāļĄāđāļāļĨāļāļāļāļĢāđāļĄ: āļāļ§āļĢāđāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāđāļāļĩāđāļĒāļ§āļāļąāļ scoped secret, protected variable āđāļĨāļ°āļāļĨāļĒāļļāļāļāđāļāļēāļĢāļŦāļĄāļļāļāđāļ§āļĩāļĒāļ credential
- āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ pipeline āļāđāļēāļāļāļēāļĢāđāļāļ āļāļēāļĢāļāļģāļāļēāļāđāļāļāļāļāļēāļ āđāļĨāļ°āļāļēāļĢāļāļģāļāļēāļāđāļāļāļĄāļĩāđāļāļ·āđāļāļāđāļāđāļāđāđāļāđāļāļāļāļļāļāđāļāļĨāļāļāļāļĢāđāļĄāđāļĨāļ°āđāļŠāļāļāđāļŦāđāđāļŦāđāļāļāļĢāļ°āļŠāļāļāļēāļĢāļāđāđāļāđāļāļēāļāļāļĢāļīāļāđāļāļĢāļ°āļāļąāļ production āļāđāļāļāļđāđāļŠāļąāļĄāļ āļēāļĐāļāđ
- āđāļāļĢāļĩāļĒāļĄāļāļēāļĢāļāļģāļŦāļāļāļāđāļē pipeline āļāļĩāđāđāļāđāļāļēāļāđāļāđāļāļĢāļīāļāļāļĒāđāļēāļāļāđāļāļĒāļŦāļāļķāđāļāļāļļāļāļāđāļāđāļāļĨāļāļāļāļĢāđāļĄ āđāļāļĒāđāļāđāļāļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļāļēāļāļāļĢāļīāļāđāļāļāļāļąāļ§āļāļĒāđāļēāļāļāļĒāđāļēāļāļāđāļēāļĒ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āļāļĩāđāļāļģāđāļāđāļ: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ 2026
āđāļāļĢāļĩāļĒāļĄāļāļąāļ§āļŠāļąāļĄāļ āļēāļĐāļāđ DevOps āļāđāļ§āļĒāļāļģāļāļēāļĄāļāļĩāđāļāđāļāļāļĢāļđāđāđāļāļĩāđāļĒāļ§āļāļąāļ CI/CD, Kubernetes, Docker, Terraform āđāļĨāļ°āđāļāļ§āļāļāļīāļāļąāļāļī SRE āļāļĢāđāļāļĄāļāļģāļāļāļāļĨāļ°āđāļāļĩāļĒāļ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļ Infrastructure as Code
āđāļāļĢāļĩāļĒāļĄāļāļ§āļēāļĄāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ Terraform āļāđāļ§āļĒāļāļģāļāļēāļĄāđāļĨāļ°āļāļģāļāļāļāļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāļāļļāļāļŦāļąāļ§āļāđāļāļŠāļģāļāļąāļ āļāļąāđāļāđāļāđāļāļ·āđāļāļāļēāļ State Management āđāļāļāļāļāļķāļ Modules āđāļĨāļ° CI/CD

āļŠāļąāļĄāļ āļēāļĐāļāđ Kubernetes: āļāļāļīāļāļēāļĒ Pods, Services āđāļĨāļ° Deployments āļāļĒāđāļēāļāļĨāļ°āđāļāļĩāļĒāļ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Kubernetes āđāļāļĩāđāļĒāļ§āļāļąāļ Pods, Services āđāļĨāļ° Deployments āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļ YAML āļāļĨāđāļ networking āļ āļēāļĒāđāļ āđāļĨāļ°āļāļĨāļĒāļļāļāļāđ scaling āļŠāļģāļŦāļĢāļąāļāļāļĩ 2026