🔧
DevOps
Dagger
Dagger
프로그래밍 가능한 CI/CD 엔진. 컨테이너 기반, 로컬 실행 가능.
Dagger
프로그래밍 가능한 CI/CD 엔진. 컨테이너 기반, 로컬 실행 가능.
Dagger는 CI/CD 파이프라인을 프로그래밍 언어로 작성할 수 있게 해주는 혁신적인 도구입니다. Docker의 공동 창시자 Solomon Hykes가 만든 이 도구는 YAML이나 Jenkins 스크립트 대신 Go, Python, Node.js 등 익숙한 프로그래밍 언어로 파이프라인을 정의합니다.
// main.go - Dagger CI 파이프라인
package main
import (
"context"
"fmt"
"os"
"dagger.io/dagger"
)
func main() {
if err := build(context.Background()); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func build(ctx context.Context) error {
// Dagger 클라이언트 초기화
client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stdout))
if err != nil {
return err
}
defer client.Close()
// 소스 코드 마운트
src := client.Host().Directory(".", dagger.HostDirectoryOpts{
Exclude: []string{"node_modules", ".git"},
})
// Node.js 컨테이너 설정
node := client.Container().
From("node:20-alpine").
WithDirectory("/app", src).
WithWorkdir("/app")
// 의존성 설치
node = node.WithExec([]string{"npm", "install"})
// 테스트 실행
node = node.WithExec([]string{"npm", "test"})
// 빌드 실행
node = node.WithExec([]string{"npm", "run", "build"})
// 빌드 결과물 내보내기
_, err = node.Directory("/app/dist").Export(ctx, "./dist")
if err != nil {
return err
}
fmt.Println("Build completed successfully!")
return nil
}
// Docker 이미지 빌드 및 푸시
func buildAndPush(ctx context.Context, registry, tag string) error {
client, err := dagger.Connect(ctx)
if err != nil {
return err
}
defer client.Close()
// 레지스트리 인증
secret := client.SetSecret("registry-password", os.Getenv("REGISTRY_PASSWORD"))
// 이미지 빌드
src := client.Host().Directory(".")
image := client.Container().
Build(src).
WithRegistryAuth(registry, "username", secret)
// 이미지 푸시
addr, err := image.Publish(ctx, fmt.Sprintf("%s/myapp:%s", registry, tag))
if err != nil {
return err
}
fmt.Printf("Published: %s\n", addr)
return nil
}
# ci.py - Dagger Python SDK
import sys
import anyio
import dagger
async def main():
config = dagger.Config(log_output=sys.stdout)
async with dagger.Connection(config) as client:
# Python 컨테이너 설정
python = (
client.container()
.from_("python:3.11-slim")
.with_directory("/app", client.host().directory("."))
.with_workdir("/app")
)
# 의존성 설치
python = python.with_exec(["pip", "install", "-r", "requirements.txt"])
# 린트 검사
python = python.with_exec(["flake8", "."])
# 테스트 실행
python = python.with_exec(["pytest", "-v"])
# 결과 출력
output = await python.stdout()
print(output)
if __name__ == "__main__":
anyio.run(main)
{
"name": "my-pipeline",
"sdk": "go",
"dependencies": [],
"source": "dagger"
}
Dagger는 Docker(또는 Podman, containerd)가 필요합니다. Docker가 없는 환경에서는 실행할 수 없으며, CI 러너에 Docker 권한이 있어야 합니다.
YAML 기반 CI에 익숙한 팀은 초기에 적응 시간이 필요합니다. SDK 사용법과 컨테이너 개념에 대한 이해가 필요합니다.
여러 컨테이너 계층에서 실행되므로 디버깅이 복잡할 수 있습니다. `--debug` 플래그와 로그 분석 능력이 필요합니다.
첫 실행 시 베이스 이미지 풀링으로 시간이 걸립니다. 캐싱이 적용되면 이후 빌드는 빨라집니다.