CI/CD ํ์ดํ๋ผ์ธ ๋ฉด์ ์ง๋ฌธ 2026: GitHub Actions, GitLab CI, Jenkins ์๋ฒฝ ๊ฐ์ด๋
2026๋ DevOps ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ CI/CD ํ์ดํ๋ผ์ธ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ์ ๋ฆฌํฉ๋๋ค. GitHub Actions, GitLab CI, Jenkins์ ์ค์ ์ฝ๋ ์์ ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํฌํจํฉ๋๋ค.

2026๋ ํ์ฌ, CI/CD ํ์ดํ๋ผ์ธ์ ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ํต์ฌ ์ธํ๋ผ๋ก ์๋ฆฌ์ก์์ต๋๋ค. GitHub Actions๋ GitHub ์ ์ฅ์์์ ์ํํ ํตํฉ์ผ๋ก ๋น ๋ฅด๊ฒ ํ์ฐ๋์๊ณ , GitLab CI๋ ํ๋ซํผ ๋ด ํตํฉ ์๋ฃจ์ ์ผ๋ก์ ํ๊ณ ํ ์ ์ง๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. Jenkins๋ ํ๋ถํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๋ฅผ ๊ฐ์ถ ์คํ์์ค ๋๊ตฌ๋ก์ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์ ์ฌ์ ํ ์ค์ํ ์ญํ ์ ์ํํ๊ณ ์์ต๋๋ค. DevOps ์ง๋ฌด ๊ธฐ์ ๋ฉด์ ์์๋ ์ด ์ธ ๊ฐ์ง ํ๋ซํผ์ ๋ํ ์ค๋ฌด ์ง์์ด ํ์์ ์ผ๋ก ์๊ตฌ๋ฉ๋๋ค. ์ด๋ก ์ ๊ฐ๋ ๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ํจํด, ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก, ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ๊น์ง ํญ๋์ ์ดํด๊ฐ ํ์ํฉ๋๋ค. ์ด ๊ธ์์๋ 2026๋ ๋ฉด์ ์์ ์ค์ ๋ก ์ถ์ ๋๊ณ ์๋ ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ , ํจ๊ณผ์ ์ธ ์ค๋น ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
ํ์ฌ ์ฑ์ฉ ์์ฅ์์๋ ๋จ์ผ CI/CD ๋๊ตฌ์ ๋ํ ์๋ จ๋๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. GitHub Actions, GitLab CI, Jenkins์ ์ํคํ ์ฒ์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ ์ ์์ด์ผ ํ๋ฉฐ, ํน์ ์๋๋ฆฌ์ค์ ์ต์ ์ธ ๋๊ตฌ๋ฅผ ๊ทผ๊ฑฐ๋ฅผ ๋ค์ด ์ถ์ฒํ ์ ์์ด์ผ ํฉ๋๋ค. ์ต์ ๋ ๊ฐ ์ด์์ ํ๋ซํผ์์ ์ค๋ฌด ๊ฒฝํ์ด ์์ผ๋ฉด ์ ๋ฐ ๊ณผ์ ์์ ์๋นํ ๊ฒฝ์ ์ฐ์๋ฅผ ํ๋ณดํ ์ ์์ต๋๋ค.
GitHub Actions: ์ํฌํ๋ก ์ค๊ณ์ Matrix Builds
GitHub Actions๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํฌํ๋ก ๋ชจ๋ธ์ ์ฑํํ๊ณ ์์ต๋๋ค. Git ์ด๋ฒคํธ, ์ค์ผ์ค, ์ธ๋ถ Webhook ๋ฑ ๋ค์ํ ํธ๋ฆฌ๊ฑฐ์ ์ํด ์ํฌํ๋ก๊ฐ ์คํ๋ฉ๋๋ค. ๊ฐ ์์ (Job)์ ๋ ๋ฆฝ๋ VM ๋๋ ์ปจํ ์ด๋์์ ์คํ๋๋ฉฐ, ์ฌ๋ฌ ๋จ๊ณ(Step)๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ฉด์ ์์๋ ์์ ๊ฐ ์์กด์ฑ ์ ์ด, ๋งคํธ๋ฆญ์ค ๋น๋, ํ๊ฒฝ ๋ณดํธ ๋ฉ์ปค๋์ฆ์ ๋ํ ๊น์ ์ดํด๊ฐ ํ๊ฐ๋ฉ๋๋ค.
# .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 # waits for lint to pass
runs-on: ubuntu-latest
strategy:
matrix:
node: [20, 22] # runs tests on both versions
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 # requires approval
steps:
- uses: actions/checkout@v4
- run: ./deploy.sh์ด ๊ตฌ์ฑ์์ ์ฃผ๋ชฉํด์ผ ํ ํต์ฌ ์์๊ฐ ์ฌ๋ฌ ๊ฐ์ง ์์ต๋๋ค. needs ํค์๋๋ ์์
๊ฐ ์คํ ์์๋ฅผ ์ ์ดํ๋ฉฐ, lint ์์
์ด ์ฑ๊ณตํ ํ์๋ง test ์์
์ด ์คํ๋ฉ๋๋ค. strategy.matrix๋ ์๋ก ๋ค๋ฅธ Node.js ๋ฒ์ ์์ ๋ณ๋ ฌ ํ
์คํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ํธํ์ฑ ๊ฒ์ฆ์ ์๋ํํฉ๋๋ค. environment: production ์ค์ ์ ํตํด ๋ฐฐํฌ ์ ์๋ ์น์ธ ํ๋ก์ธ์ค๋ฅผ ์๊ตฌํ ์ ์์ต๋๋ค.
๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ ์ง๋ฌธ ์ค ํ๋๋ if: github.ref == 'refs/heads/main'๊ณผ if: github.ref == 'main'์ ์ฐจ์ด์
๋๋ค. github.ref๋ ์์ ํ ๋ธ๋์น ๊ฒฝ๋ก๋ฅผ ๋ฐํํ๋ฏ๋ก refs/heads/ ์ ๋์ฌ๋ฅผ ํฌํจํ ์ ์ฒด ํ์์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค. ์ด ๋ถ๋ถ์ ๊ฐ๊ณผํ๋ฉด ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ์๋๋๋ก ์๋ํ์ง ์์ต๋๋ค.
Reusable Workflows๋ ๋น์ถ ํ ํฝ์
๋๋ค. ์กฐ์ง ์ ์ฒด์์ ๊ณต์ ํ ์ ์๋ ์ํฌํ๋ก ํ
ํ๋ฆฟ์ ์ ์ํ๊ณ , ์ฌ๋ฌ ์ ์ฅ์์์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ๋ณด์ ์ค์บ์ด๋ ๋ฐฐํฌ ๊ฒ์ดํธ๋ฅผ ์ค์์์ ๊ด๋ฆฌํจ์ผ๋ก์จ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ์ปดํ๋ผ์ด์ธ์ค ์๊ตฌ์ฌํญ ๋์์ ํจ์จํํ ์ ์์ต๋๋ค. actions/setup-node์ cache ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์บ์ฑ์ node_modules๋ฅผ ์ํฌํ๋ก ์คํ ๊ฐ์ ์ฌ์ฌ์ฉํ์ฌ ๋น๋ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํฉ๋๋ค.
์คํ ์ปจํ
์คํธ(github, env, secrets, steps)์๋ ์ํฌํ๋ก ์คํ ์์ ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ฉ๋๋ค. Expression ๋ฌธ๋ฒ ${{ }}๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ๊ฐ ๊ณ์ฐ๊ณผ ์กฐ๊ฑด ๋ก์ง ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
GitLab CI: ์คํ ์ด์ง ๊ธฐ๋ฐ ํ์ดํ๋ผ์ธ๊ณผ Artifact ๊ด๋ฆฌ
GitLab CI๋ ์คํ
์ด์ง ๊ธฐ๋ฐ ํ์ดํ๋ผ์ธ ๋ชจ๋ธ์ ์ฑํํ๊ณ ์์ต๋๋ค. ๋์ผ ์คํ
์ด์ง ๋ด์ ์์
์ ๋ณ๋ ฌ๋ก ์คํ๋์ง๋ง, ์คํ
์ด์ง ๊ฐ์๋ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ด๋ "๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋ ฌ ์คํ, needs๋ก ์ ์ด"ํ๋ GitHub Actions ๋ชจ๋ธ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์
๋๋ค.
# .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 # manual gate
environment:
name: production
url: https://app.example.com
script:
- ./deploy.shrules ํค์๋๋ GitLab CI 14 ์ดํ ๊ธฐ์กด์ only/except ๋ชจ๋ธ์ ๋์ฒดํ๋ ๊ถ์ฅ ๊ตฌ๋ฌธ์
๋๋ค. ๋ธ๋์น๋ช
, ํ๊ทธ, ๋จธ์ง ๋ฆฌํ์คํธ ์ํ, ์ฌ์ฉ์ ์ ์ ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์
์คํ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. when: manual๊ณผ rules์ ์กฐํฉ์ผ๋ก ํ๋ก๋์
๋ฐฐํฌ์ ๋ํ ์น์ธ ๊ฒ์ดํธ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
Artifact์ Cache์ ์ฐจ์ด๋ ๋ฉด์ ์์ ํนํ ์ฃผ๋ชฉ๋ฐ๋ ๋
ผ์ ์
๋๋ค. Cache๋ node_modules ๊ฐ์ ์์กด์ฑ์ ์ฌ์ฌ์ฉํ์ฌ ๋ฆฌ๋น๋ ์๊ฐ์ ์ต์ ํํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๋ฐ๋ฉด Artifact๋ ์คํ
์ด์ง ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๋ช
์์ ์ธ ๋ฉ์ปค๋์ฆ์
๋๋ค. reports ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ SAST ์ค์บ ๊ฒฐ๊ณผ๋ฅผ GitLab UI์ ์ง์ ํตํฉํ ์ ์์ต๋๋ค. expire_in ๋๋ ํฐ๋ธ๋ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์์ Artifact ์คํ ๋ฆฌ์ง์ ๋ฌดํ ์ฆ๊ฐ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
์บ์ ํค์๋ ๋ธ๋์น๋ณ ๊ณ ์ ๊ฐ(${CI_COMMIT_REF_SLUG})์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ธ๋์น์์ ๋์์ ์คํ๋๋ ํ์ดํ๋ผ์ธ ๊ฐ์ ๊ฒฝ์ ์ํ(race condition)๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์
๋๋ค. GitLab CI ๋ฒ์ 16 ์ดํ์๋ needs ํค์๋๋ฅผ ํตํ DAG(๋ฐฉํฅ ๋น์ํ ๊ทธ๋ํ) ํ์ดํ๋ผ์ธ์ด ์ง์๋์ด, ์ง์ ์์กด์ฑ์ด ์ถฉ์กฑ๋๋ฉด ์ด์ ์คํ
์ด์ง ์ ์ฒด์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์์
์ ์คํํ ์ ์์ต๋๋ค. ์ด ํ์ด๋ธ๋ฆฌ๋ ์ ๋ต์ ์คํ
์ด์ง ๊ธฐ๋ฐ ํ์ดํ๋ผ์ธ์ ๊ฐ๋
์ฑ๊ณผ ์ธ๋ฐํ ๋ณ๋ ฌํ๋ฅผ ํตํ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋์์ ๋ฌ์ฑํฉ๋๋ค.
Jenkins: Declarative Pipeline๊ณผ Plugin ์ํ๊ณ
2026๋ ์๋ Jenkins๋ ๋ณต์กํ ์จํ๋ ๋ฏธ์ค ์๊ตฌ์ฌํญ์ ๊ฐ์ง ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. Declarative Pipeline ๊ตฌ๋ฌธ์ Scripted Pipeline๋ณด๋ค ๊ตฌ์กฐ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ์ฌ ํ์ฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ก ์ ์ฐฉํ์ต๋๋ค.
// Jenkinsfile
pipeline {
agent any
tools {
nodejs 'node-22' // configured in Jenkins Global Tool
}
environment {
CI = 'true'
DEPLOY_ENV = credentials('deploy-env-secret')
}
stages {
stage('Install') {
steps {
sh 'npm ci'
}
}
stage('Lint & Test') {
parallel { // parallel execution
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}"
}
}
}agent ๋๋ ํฐ๋ธ๋ ํ์ดํ๋ผ์ธ์ ์คํ ํ๊ฒฝ์ ์ ์ํฉ๋๋ค. agent any๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์์์ ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๊ณ , agent { label 'linux' }๋ ํน์ ๋ ์ด๋ธ์ ๊ฐ์ง ์์ด์ ํธ๋ก ์ ํํฉ๋๋ค. ์ปจํ
์ด๋ ๊ธฐ๋ฐ ๋น๋์๋ agent { docker 'node:22' }๊ฐ ์ ํฉํ๋ฉฐ, Jenkins ์๋ฒ์ ๋๊ตฌ๋ฅผ ์๊ตฌ ์ค์นํ์ง ์๊ณ ๋ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
tools ๋ธ๋ก์ Jenkins์ ๋ฑ๋ก๋ ๋๊ตฌ ์ค์น๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์ดํ๋ผ์ธ ์ ์๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ฒฝ๋ก์์ ๋ถ๋ฆฌ๋๊ณ , Node.js, Maven, JDK ๋ฑ์ ๋ฒ์ ์ ์ค์์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. environment ๋ธ๋ก ๋ด์ credentials ํค์๋๋ Jenkinsfile์ ์ํฌ๋ฆฟ์ ๋
ธ์ถํ์ง ์์ผ๋ฉด์ Jenkins Credentials๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ๋ฐ์ธ๋ฉํฉ๋๋ค.
๋ณ๋ ฌ ์คํ์ ์คํ
์ด์ง ๋ด์ parallel ๋ธ๋ก์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. GitHub Actions๋ GitLab CI์ Matrix Builds์ ๋ฌ๋ฆฌ, ๊ฐ ๋ณ๋ ฌ ๋ถ๊ธฐ์ ๋ํด ๋ช
์์ ์ธ ์คํ
์ด์ง ์ ์๊ฐ ํ์ํฉ๋๋ค. post ๋๋ ํฐ๋ธ๋ ๋น๋ ๊ฒฐ๊ณผ์ ๋ฌด๊ดํ๊ฒ ์คํ๋๋ ์ ๋ฆฌ ์์
์ด๋ ์๋ฆผ ๋ก์ง์ ์ ์ํฉ๋๋ค. always, success, failure, unstable, changed ๋ฑ์ ์กฐ๊ฑด์ ์ง์ ํ ์ ์์ต๋๋ค.
1,800๊ฐ ์ด์์ ํ๋ฌ๊ทธ์ธ์ ๋ณด์ ํ Jenkins ์ํ๊ณ๋ DevOps ์์ญ์ ๊ฑฐ์ ๋ชจ๋ ๋๊ตฌ์์ ์ฐ๋์ ์ง์ํฉ๋๋ค. Blue Ocean(๋ชจ๋ UI), Pipeline Stage View(ํ์ดํ๋ผ์ธ ์๊ฐํ), Configuration as Code(JCasC, ์ ์ธ์ Jenkins ๊ตฌ์ฑ)๋ ๋ฉด์ ์์ ์์ฃผ ๋ค๋ฃจ์ด์ง๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ๋ค๋ง ํ๋ฌ๊ทธ์ธ ๊ด๋ฆฌ์๋ ์ง์์ ์ธ ์ ์ง๋ณด์๊ฐ ํ์ํ๋ฉฐ, ์ค๋๋๊ฑฐ๋ ํธํ๋์ง ์๋ ํ๋ฌ๊ทธ์ธ์ ์ฅ์ ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก: ์ํฌ๋ฆฟ ๊ด๋ฆฌ์ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ ๋์
2026๋ CI/CD ๋ฉด์ ์์ ๋ณด์ ๊ด๋ จ ์ง๋ฌธ์ ๊ฐ์ฅ ์ค์ํ๊ฒ ๋ค๋ฃจ์ด์ง๋ ์ฃผ์ ์ค ํ๋์ ๋๋ค. SolarWinds์ CodeCov ์ฌ๋ก ์ดํ, ๋น๋ ํ์ดํ๋ผ์ธ์ ๋ํ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ ๋ฐฉ์ด๋ ์ต์ฐ์ ๊ณผ์ ๊ฐ ๋์์ต๋๋ค.
# .github/workflows/secure.yml
steps:
# Vulnerable: tag can be moved to malicious commit
- uses: actions/checkout@v4
# Secure: pinned to exact commit SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683GitHub Workflows์์ Action์ SHA ๊ณ ์ (pinning)์ ํ๊ทธ๋ช ์ด ์ ์ฑ ์ฝ๋๋ก ๋ฆฌ๋ค์ด๋ ํธ๋๋ ์ํ์ ๋ฐฉ์งํฉ๋๋ค. Dependabot์ด ๋ณด์ ์์ ์ด ํฌํจ๋ ์ ๋ฒ์ ์ Pull Request๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก, SHA ๊ณ ์ ๊ณผ ์๋ ์ ๋ฐ์ดํธ์ ์กฐํฉ์ผ๋ก ๋ณด์๊ณผ ์ ์ง๋ณด์์ฑ ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ ์ ์์ต๋๋ค.
์ํฌ๋ฆฟ ๊ด๋ฆฌ๋ ํ๋ซํผ๋ณ๋ก ๋ค๋ฅธ ์ ๋ต์ด ํ์ํฉ๋๋ค. GitHub Actions๋ Repository, Organization, Environment์ ์ธ ๊ฐ์ง ๋ฒ์(scope)์์ ์ํฌ๋ฆฟ์ ๊ด๋ฆฌํฉ๋๋ค. Environment Secrets๋ ์น์ธ ์ํฌํ๋ก์ ๋ธ๋์น ์ ํ์ ์ถ๊ฐ๋ก ์ค์ ํ ์ ์์ต๋๋ค. GitLab CI๋ ์ผ๋ฐ ๋ณ์์ Protected Variables๋ฅผ ๊ตฌ๋ถํ๋ฉฐ, ํ์๋ Protected Branch์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. Jenkins๋ Credentials Plugin์ ํตํด Username/Password, Secret Text, SSH ํค, ์ธ์ฆ์ ๋ฑ ๋ค์ํ ์ ํ์ ์๊ฒฉ ์ฆ๋ช ์ ๊ด๋ฆฌํฉ๋๋ค.
OIDC(OpenID Connect)๋ ํด๋ผ์ฐ๋ ๋ฐฐํฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ก ํ๋ฆฝ๋์์ต๋๋ค. ์ ์ ์ก์ธ์ค ํค ๋์ ํ์ดํ๋ผ์ธ์ด ๋จ๊ธฐ ํ ํฐ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์ ์ง์ ์ธ์ฆํฉ๋๋ค. GitHub Actions๋ AWS, Azure, GCP์ ๋ํ OIDC๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค. GitLab CI๋ $CI_JOB_JWT๋ฅผ ํตํด ID ํ ํฐ์ ์ ๊ณตํฉ๋๋ค. Jenkins์ ๊ฒฝ์ฐ OIDC ํตํฉ์ ์ํด ์ ์ฉ ํ๋ฌ๊ทธ์ธ์ด ํ์ํฉ๋๋ค.
DevOps ๋ฉด์ ์ค๋น๊ฐ ๋์ จ๋์?
์ธํฐ๋ํฐ๋ธ ์๋ฎฌ๋ ์ดํฐ, flashcards, ๊ธฐ์ ํ ์คํธ๋ก ์ฐ์ตํ์ธ์.
์ฑ๋ฅ ์ต์ ํ: ์บ์ฑ ์ ๋ต๊ณผ Matrix ํจ์จํ
์ฑ๋ฅ ๊ด๋ จ ์ง๋ฌธ์ ํ์ดํ๋ผ์ธ ๋น์ฉ ์ธ์๊ณผ ์ต์ ํ ์ญ๋์ ํ๊ฐํ๋ ๊ฒ์ ๋๋ค. ํ๋ฃจ์ 10๋ฒ ์คํ๋๋ 20๋ถ์ง๋ฆฌ ํ์ดํ๋ผ์ธ์ ์๋นํ ๋ฌ๋ ์๊ฐ์ ์๋นํ๊ณ ๊ฐ๋ฐ์ ํผ๋๋ฐฑ ๋ฃจํ๋ฅผ ์ ํดํฉ๋๋ค.
์บ์ฑ์ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ต์ ํ ๊ธฐ๋ฒ์
๋๋ค. GitHub Actions์ actions/cache๋ ์คํ ๊ฐ ์์กด์ฑ์ ์ ์ฅํฉ๋๋ค. ์บ์ ํค์๋ ์์กด์ฑ ํ์ผ์ ํด์(hashFiles('package-lock.json'))๋ฅผ ํฌํจ์์ผ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก ๋ฌดํจํ๋๋๋ก ํด์ผ ํฉ๋๋ค. restore-keys ๋งค๊ฐ๋ณ์๋ ์ ํํ ์ผ์นํ๋ ํค๊ฐ ์์ ๋ ๋์ฒด ํค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
GitLab CI ์บ์๋ key: files: ['package-lock.json']์ผ๋ก ์ ์ฌํ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. policy: pull-push(๊ธฐ๋ณธ๊ฐ)์ policy: pull์ ๊ตฌ๋ถ์ ์ฌ๋ฌ ์์
์ด ๋์ผํ ์บ์๋ฅผ ์ฌ์ฉํ ๋ ๊ฒฝ์ ์ํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์บ์๋ฅผ ์
๋ฐ์ดํธํ๋ ์์
์ ํ๋๋ง ๋๊ณ ๋๋จธ์ง๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
Jenkins๋ ์์ฐจ ์คํ ์คํ
์ด์ง์์ ์ํฌ์คํ์ด์ค ์ฌ์ฌ์ฉ์ ๊ธฐ๋ณธ์ผ๋ก ํฉ๋๋ค. ๋ณ๋ ฌ ์์
์ด๋ ๋ฉํฐ ๋ธ๋์น ํ์ดํ๋ผ์ธ์์๋ Stash/Unstash ๊ธฐ๋ฅ์ด ์์ด์ ํธ ๊ฐ ์ํฐํฉํธ ์ ์ก์ ์ ์ฉํฉ๋๋ค. ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์์๋ Job Cacher Plugin์ด๋ Artifact Manager on S3 Plugin์ ์ฌ์ฉํ ์ธ๋ถ ์บ์ฑ์ด ๋ ํ์ฅ ๊ฐ๋ฅํฉ๋๋ค.
Matrix Builds๋ ๋ณ๋ ฌํ๋ฅผ ์ด์งํ์ง๋ง ๋น์ฉ๋ ์ฆ๊ฐ์ํต๋๋ค. 5๊ฐ Node ๋ฒ์ x 3๊ฐ OS = 15๊ฐ ๋ณ๋ ฌ ์์
์ด ์์ฑ๋ฉ๋๋ค. ๋ฉด์ ์์๋ ๋งคํธ๋ฆญ์ค ์ฐจ์์ ํฉ๋ฆฌ์ ์ผ๋ก ์ ํํ ์ ์๋์ง๊ฐ ํ๊ฐ๋ฉ๋๋ค. GitHub Actions์ strategy.matrix.exclude์ include๋ฅผ ํตํด ์ ํ์ ์ธ ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ๋ซํผ ๋น๊ต: GitHub Actions vs GitLab CI vs Jenkins
๋ฉด์ ํจ๋์ ์กฐ์ง ์๊ตฌ์ฌํญ์ ๊ธฐ๋ฐํ ๊ทผ๊ฑฐ ์๋ ์ถ์ฒ์ ๊ธฐ๋ํฉ๋๋ค. ๋ค์ ํ๋ ๊ธฐ์ ์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
| ํญ๋ชฉ | GitHub Actions | GitLab CI | Jenkins |
|---|---|---|---|
| ์ค์ ํ์ผ | .github/workflows/*.yml | .gitlab-ci.yml | Jenkinsfile |
| ์คํ ๋ชจ๋ธ | ์์
๊ธฐ๋ฐ(๊ธฐ๋ณธ ๋ณ๋ ฌ) | ์คํ
์ด์ง ๊ธฐ๋ฐ(์คํ
์ด์ง ๊ฐ ์์ฐจ) | ์คํ
์ด์ง ๊ธฐ๋ฐ(์ ์ฐ) |
| ๋ฌ๋ ํธ์คํ
| GitHub-hosted + Self-hosted | GitLab.com Shared + Self-hosted | Self-hosted๋ง |
| ์ํฌ๋ฆฟ ๊ด๋ฆฌ | Repository/Org/Environment Secrets | CI/CD ๋ณ์(๋ณดํธ ๊ฐ๋ฅ) | Credentials Plugin |
| Matrix Builds | strategy.matrix | parallel:matrix | matrix(Plugin) |
| ์๋ ๊ฒ์ดํธ | environment + Required Reviewers | when: manual | input ๋๋ ํฐ๋ธ |
| ๋ง์ผํ๋ ์ด์ค | 20,000+ Actions | CI/CD Components Catalog | 1,800+ Plugins |
| AI ๊ธฐ๋ฅ | Copilot for Actions(Preview) | Duo CI Expert Agent(Beta) | Community Plugins |
| ๊ฐ๊ฒฉ ์ ์ฑ
| ๊ณต๊ฐ ์ ์ฅ์ ๋ฌด๋ฃ, ๋น๊ณต๊ฐ๋ ๋ถ๋น ๊ณผ๊ธ | ์ 400๋ถ ๋ฌด๋ฃ, ๋จ๊ณ๋ณ ๊ณผ๊ธ | ๋ฌด๋ฃ(OSS), ์์ฒด ๊ด๋ฆฌ |
GitHub Actions๋ ์คํ์์ค ํ๋ก์ ํธ๋ ์ด๋ฏธ GitHub์ ์ฝ๋ ํธ์คํ ์ผ๋ก ์ฌ์ฉํ๋ ํ์ ์ต์ ์ ๋๋ค. GitLab CI๋ ์ ์ฅ์, CI/CD, ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ, ๋ณด์ ์ค์บ, ์ธ์๋ํธ ๊ด๋ฆฌ๋ฅผ ํตํฉํ ์ฌ์ธ์ ํ๋ซํผ์ผ๋ก์ ๊ฐ์ ์ ๋ฐํํฉ๋๋ค. Jenkins๋ ๋ ๊ฑฐ์ ์์คํ , ์๊ฒฉํ ์ปดํ๋ผ์ด์ธ์ค ์๊ตฌ์ฌํญ, ํด๋ผ์ฐ๋ ์ฐ๊ฒฐ์ด ์๋ ๋ณต์กํ ์จํ๋ ๋ฏธ์ค ์ธํ๋ผ๋ฅผ ๋ณด์ ํ ์กฐ์ง์์ ์ฌ์ ํ ์ ๋ ฅํ ์ ํ์ง์ ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์๋ ์ค๋ฌด์์ ํํ ์ฌ์ฉ๋ฉ๋๋ค. Pull Request์ ๋น ๋ฅธ ํผ๋๋ฐฑ์ GitHub Actions๋ฅผ, ๋ณต์กํ ์ปดํ๋ผ์ด์ธ์ค ์๊ตฌ์ฌํญ์ด ์๋ฐ๋๋ ๋ฐฐํฌ์ Jenkins๋ฅผ ์กฐํฉํ๋ ํจํด์ด ๋ํ์ ์ธ ์์ ๋๋ค. ๋ฉด์ ์์๋ ํ๋์ ํ๋ซํผ์ ๊ณ ์งํ๊ธฐ๋ณด๋ค ์ด๋ฌํ ์ค์ฉ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๋ ผ์ํ ์ ์๋ ์ญ๋์ด ์ค์ํฉ๋๋ค.
๋ชจ๋ํฐ๋ง๊ณผ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ: ํ์ดํ๋ผ์ธ ๋ฉํธ๋ฆญ๊ณผ ์ธ์๋ํธ ๋์
ํ๋ก๋์ ์์ค์ CI/CD์๋ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฆผ์ด ํ์์ ์ ๋๋ค. Build Success Rate์ Mean Time to Recovery(MTTR)๊ฐ ํต์ฌ ์งํ์ ๋๋ค. GitHub Actions์ Workflow Insights๋ ์ฑ๊ณต๋ฅ ๊ณผ ํ๊ท ์คํ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค. GitLab CI Analytics๋ Deployment Frequency, Lead Time, Change Failure Rate ๋ฑ DORA Metrics 4๋ ์งํ๋ฅผ ํ์ํฉ๋๋ค. Jenkins๋ Prometheus Metrics Plugin์ ํตํด ๋น๋ ํต๊ณ๋ฅผ Grafana ๋์๋ณด๋๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
Flaky Test(๋ถ์์ ํ ํ
์คํธ)๋ ํ์ดํ๋ผ์ธ์ ๋ถ์์ ํ๊ฒ ๋ง๋๋ ์์ธ์
๋๋ค. GitHub Actions๋ ์ํฌํ๋ก ์ ์ฒด๊ฐ ์๋ ์คํจํ ์์
๋ง ์ฌ์คํํ ์ ์์ต๋๋ค. GitLab CI์ retry: 2๋ ์คํจํ ์์
์ ์๋์ผ๋ก ์ฌ์๋ํฉ๋๋ค. Jenkins์๋ Flaky Test Handler Plugin์ด ์์ด ๊ฐํ์ ์คํจ์ ํต๊ณ์ ๋ถ์์ ์ํํฉ๋๋ค. ๋ค๋ง ์๋ ์ฌ์๋๋ ์ฆ์ ์ํ์ ๋ถ๊ณผํ๋ฉฐ ๊ทผ๋ณธ ์์ธ ๋ถ์์ด ์ฌ์ ํ ํ์์ ์ด๋ผ๋ ์ ์ ์ค๋ช
ํ ์ ์์ด์ผ ํฉ๋๋ค.
์๋ฆผ ์ ๋ต์ ๊ฐ์์ฑ(Visibility)๊ณผ ์๋ฆผ ํผ๋ก(Alert Fatigue) ์ฌ์ด์ ๊ท ํ์ ๋ง์ถฐ์ผ ํฉ๋๋ค. ํ๋ก๋์
๋ฐฐํฌ ์ GitHub Actions workflow_run Webhook์์ Slack์ผ๋ก ์๋ฆผ์ ๋ณด๋ด๋ ๊ฒ์ ํจ๊ณผ์ ์ด์ง๋ง, ๋ชจ๋ ํ
์คํธ ์คํจ๋ง๋ค ์๋ฆผ์ ๋ณด๋ด๋ฉด ์ฑ๋์ด ๊ณผ๋ถํ๋ฉ๋๋ค. GitLab CI์ Pipeline Schedules์ ์ํ ๋ณ๊ฒฝ ์์๋ง ๋ฐ์ก๋๋ ์ด๋ฉ์ผ ์๋ฆผ์ ๋
ธ์ด์ฆ๋ฅผ ์ค์ฌ์ค๋๋ค. Jenkins์ Email-ext Plugin๊ณผ Groovy ํ
ํ๋ฆฟ์ ์ปจํ
์คํธ์ ๋ง๋ ๋ฉ์์ง ์ปค์คํฐ๋ง์ด์ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ฐ์ฌ ๋ก๊ทธ๋ ๋๊ฐ ํ์ดํ๋ผ์ธ์ ํธ๋ฆฌ๊ฑฐํ๋์ง, ์ํฌ๋ฆฟ์ ๋ณ๊ฒฝํ๋์ง, ํ๋ก๋์ ๋ฐฐํฌ๋ฅผ ์น์ธํ๋์ง๋ฅผ ๊ธฐ๋กํฉ๋๋ค. GitHub Audit Log API๋ ๋ณด์ ๋ถ์๊ณผ ์ปดํ๋ผ์ด์ธ์ค ๋ณด๊ณ ์๋ฅผ ์ง์ํ๊ณ , GitLab Audit Events๋ ๋ชจ๋ ๋ณด์ ๊ด๋ จ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํฉ๋๋ค. Jenkins Audit Trail Plugin์ ํ์์คํฌํ์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
CI/CD ๋ฉด์ ์ค๋น๋ฅผ ์ํด CI/CD ๊ธฐ์ด์ ํ๋ซํผ๋ณ ๋ชจ๋์ธ GitHub Actions, GitLab CI, Jenkins์์์ ์ค์ต์ด ํจ๊ณผ์ ์ ๋๋ค. CI/CD ์ธ์ DevOps ์์ญ์ ๋ํด์๋ DevOps ๋ฉด์ ์ง๋ฌธ ์ข ํฉ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ ์ ์์ต๋๋ค.
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
๊ฒฐ๋ก
- GitHub Actions๋ GitHub๊ณผ์ ์ํํ ํตํฉ, ํ๋ถํ Marketplace, Parallel Steps ๋ฑ ์ ๊ท ๊ธฐ๋ฅ์ผ๋ก ์คํ์์ค ์ํ๊ณ๋ฅผ ์ ๋ํ๊ณ ์์ผ๋, ๊ณต๊ธ๋ง ์ํ์ ๋๋นํ SHA ๊ณ ์ ์ ์ฒ ์ ํ ์ ์ฉ์ด ํ์ํฉ๋๋ค
- GitLab CI๋ CI/CD์ ๋ณด์ ์ค์บ์ ๊ธด๋ฐํ ํตํฉ์ ์ ๊ณตํ๋ฉฐ, ๋ฒ์ 18.3 ์ดํ SLSA ์ธ์ฆ๊ณผ ์ธ๋ถํ๋ ์์ ํ ํฐ ๊ถํ ๊ด๋ฆฌ๊ฐ ๊ตฌํ๋์ด ์์ต๋๋ค
- Jenkins๋ ์์ ํ ์ธํ๋ผ ์ ์ด๊ฐ ํ์ํ ์กฐ์ง์ ๊ฐ์ฅ ์ ์ฐํ ์ ํ์ง์ด์ง๋ง, 2026๋ 1์๋ถํฐ Java 21์ด ํ์์ด๋ฉฐ ์ด์ ๋น์ฉ์ด ๋๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค
- ์ํฌ๋ฆฟ ๊ด๋ฆฌ๋ ์ธ ํ๋ซํผ ๋ชจ๋์์ ๊ฐ์ฅ ์์ฃผ ์ถ์ ๋๋ ๋ณด์ ์ฃผ์ ์ด๋ฉฐ, ๋ฒ์ ์ง์ ์ํฌ๋ฆฟ, ๋ณดํธ ๋ณ์, ์๊ฒฉ ์ฆ๋ช ์ํ ์ ๋ต์ ๋ํ ์ง์์ด ํ์์ ์ ๋๋ค
- ์บ์ฑ, ๋ณ๋ ฌํ, ์กฐ๊ฑด๋ถ ์คํ์ ํตํ ํ์ดํ๋ผ์ธ ์ต์ ํ๋ ๋ณดํธ์ ์ธ ์คํฌ์ด๋ฉฐ, ์ค๋ฌด ๊ฒฝํ์ ์ฆ๊ฑฐ๋ก์ ๋ฉด์ ๊ด์๊ฒ ๋์ด ํ๊ฐ๋ฉ๋๋ค
- ๋ฉด์ ์ค๋น ์ ๊ฐ ํ๋ซํผ์ ๋ํด ์ต์ ํ๋์ ์ค์ฉ์ ์ธ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ์ค๋นํ๊ณ , ๋จ์ํ ์์ ๊ฐ ์๋ ์ค์ ํจํด์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
ํ๊ทธ
๊ณต์
๊ด๋ จ ๊ธฐ์ฌ

Terraform ๋ฉด์ ์ง๋ฌธ ์๋ฒฝ ๊ฐ์ด๋ 2026: Infrastructure as Code ํต์ฌ ์ ๋ฆฌ
Terraform ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ ์ํ ๊ด๋ฆฌ, ๋ชจ๋, ์ํฌ์คํ์ด์ค, ํ๋ก๋ฐ์ด๋, IaC ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค. 2026๋ Terraform 1.14 ๋ฐ HCP Terraform ์ต์ ๋ด์ฉ์ ๋ฐ์ํ์์ต๋๋ค.

Kubernetes ๋ฉด์ ์๋ฒฝ ๊ฐ์ด๋: Pod, Service, Deployment ํต์ฌ ์ ๋ฆฌ
Kubernetes ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ Pod, Service, Deployment์ ํต์ฌ ๊ฐ๋ ์ YAML ์์ ์ ํจ๊ป ์์ธํ ์ ๋ฆฌํฉ๋๋ค. 2026๋ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ์ํ ์ค์ ๋๋น ๊ฐ์ด๋์ ๋๋ค.

DevOps ์ธํฐ๋ทฐ ํ์ ์ง๋ฌธ: ์์ ๊ฐ์ด๋ 2026
CI/CD, Kubernetes, Docker, Terraform, SRE ์ค์ฒ์ ๊ดํ ํ์ ์ง๋ฌธ์ผ๋ก DevOps ์ธํฐ๋ทฐ๋ฅผ ์ค๋นํ์ญ์์ค. ์์ธํ ๋ต๋ณ ํฌํจ.