워크플로우
이 문서는 워크플로우 YAML의 모든 필드를 다뤄요.
입문자라면 워크플로우 생성부터 보시는 게 좋아요.
파일 규칙
- 위치: Agent의 워크플로우 디렉토리 (기본
./workflows/,DEPLITE_WORKFLOWS_DIR로 오버라이드 가능) - 확장자:
.yaml또는.yml - 파일이 추가·수정·삭제되면 Agent가 파일시스템 이벤트로 즉시 감지해서 반영해요
최상위 필드
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
name | string | ✓ | — | 워크플로우 식별자. 영문 대소문자·숫자·_·.·-만 허용, 1~128자 |
steps | object[] | ✓ | — | 최소 1개 |
timeout-minutes | int | 전체 워크플로우 timeout (지정 시 step 전체에 적용) | ||
env | object | {} | 모든 step에 적용되는 환경변수 | |
secrets | string[] | [] | Agent 프로세스의 DEPLITE_SECRET_<KEY> 환경변수에서 가져와 마스킹할 시크릿 이름 목록 |
Step 필드
| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
name | string | ✓ | — | 워크플로우 안에서 고유해야 해요 |
run | string | ✓ | — | 실행할 셸 명령 (multi-line 가능) |
verbose | bool | false | debug 실행 대상 step 표시 (아래 참고) | |
timeout-minutes | int | (워크플로우 값 상속) | step별 timeout | |
working-directory | string | (Agent 작업 폴더) | cd 후 실행 | |
env | object | {} | step별 환경변수 | |
shell | string | (Agent 기본 셸) | 이 step만 다른 셸로 실행할 때 사용 | |
continue-on-error | bool | false | 실패해도 다음 step 진행 |
시크릿 값은 stdout/stderr에 노출되어도 ***로 자동 마스킹돼요.
verbose: true 동작
step에 verbose: true를 선언하면, 트리거를 debug: true로 호출했을 때 해당 step의 원본 stdout/stderr가 그대로 서버에 전송돼요.
워크플로우 안의 어느 step도 verbose: true로 선언되지 않으면 debug: true 호출 자체가 거절돼요.
환경변수 우선순위
낮은 우선순위부터 높은 우선순위 순서로 적용돼요.
- Agent 프로세스 환경변수 (호스트)
DEPLITE_WORKDIR(Agent가 자동 주입하는 step 작업 디렉토리),TMPDIR·TMP- 워크플로우
env DEPLITE_PARAM_<KEY>(트리거의params에서 자동 주입)DEPLITE_SECRET_<KEY>(워크플로우secrets목록의 시크릿)- Step
env
같은 키가 여러 곳에 있으면 아래쪽이 이겨요.
트리거 주입 변수
| 환경변수 | 의미 |
|---|---|
DEPLITE_PARAM_<KEY> | 트리거 호출 시 params.<key> 값 (대문자로 변환) |
DEPLITE_SECRET_<KEY> | 워크플로우 secrets에 선언된 키. Agent 환경변수 DEPLITE_SECRET_<KEY>에서 가져옴 |
DEPLITE_WORKDIR | step별로 새로 생성되는 임시 작업 디렉토리 |
TMPDIR, TMP | DEPLITE_WORKDIR과 같은 값 |
트리거의 ref·debug·jobId는 환경변수로 자동 주입되지 않아요.
워크플로우에서 받고 싶다면 트리거의 params에 명시적으로 포함해서 호출하면 DEPLITE_PARAM_REF 같은 형태로 받을 수 있어요.
시크릿
secrets:
- DATABASE_URL
- API_KEY여기 나열된 이름은 stdout에서 자동 마스킹되고, 어떤 경우에도 서버로 전송되지 않아요.
시크릿 값은 Agent 머신의 환경변수에 DEPLITE_SECRET_DATABASE_URL·DEPLITE_SECRET_API_KEY 형태로 주입해주세요.
출력 (output)
마지막 step에서 stdout으로 단일 라인 JSON을 출력하면 Job의 output 필드로 저장돼요.
- name: Deploy
run: |
DEP_ID=$(deploy.sh)
echo "{\"deploymentId\":\"$DEP_ID\",\"url\":\"https://app.example.com\"}"대시보드와 API 응답에서 이 JSON을 그대로 받을 수 있어요.
검증 규칙
name: 영문 대소문자·숫자·_·.·-만 허용, 1~128자steps: 1개 이상- 각
step.name: 비어있지 않고, 같은 워크플로우 안에서 중복되지 않음 - 각
step.run: 비어있지 않음
규칙을 어기면 Agent 시작 시 또는 워크플로우 파일이 다시 스캔될 때 에러 로그가 남고, 해당 파일은 서버 카탈로그에서 제외돼요.
실전 레시피 모음
1) DB 야간 백업
PostgreSQL 표준 환경변수(PGHOST·PGUSER·PGPASSWORD·PGDATABASE)를 step에 주입하면 psql 계열 도구(psql·pg_dump 등)가 별도 인자 없이 자동 인식해요.
name: backup-pg
timeout-minutes: 60
secrets:
- PGPASSWORD
- AWS_SECRET_ACCESS_KEY
env:
PGHOST: db.internal
PGPORT: "5432"
PGUSER: backup
PGDATABASE: prod
steps:
- name: connectivity-check
run: psql -c "SELECT 1" > /dev/null
env:
PGPASSWORD: $DEPLITE_SECRET_PGPASSWORD
timeout-minutes: 1
- name: dump
run: pg_dump --no-owner --clean | gzip > /tmp/backup.sql.gz
env:
PGPASSWORD: $DEPLITE_SECRET_PGPASSWORD
timeout-minutes: 30
- name: upload
run: |
aws s3 cp /tmp/backup.sql.gz \
s3://backups/pg/$(date +%F).sql.gz
timeout-minutes: 15
- name: cleanup
run: rm -f /tmp/backup.sql.gz
continue-on-error: true2) Docker 이미지 빌드·푸시·배포
name: deploy-myapp
timeout-minutes: 25
env:
IMAGE: registry.example.com/myapp
secrets:
- REGISTRY_PASSWORD
steps:
- name: build
run: docker build -t "$IMAGE:$DEPLITE_PARAM_REF" .
timeout-minutes: 12
- name: push
run: |
echo "$DEPLITE_SECRET_REGISTRY_PASSWORD" | docker login -u deploy --password-stdin registry.example.com
docker push "$IMAGE:$DEPLITE_PARAM_REF"
timeout-minutes: 8
- name: rollout
run: |
kubectl set image deployment/myapp myapp="$IMAGE:$DEPLITE_PARAM_REF"
kubectl rollout status deployment/myapp --timeout=5m
timeout-minutes: 6
- name: report
run: |
DEP_URL=$(kubectl get ingress myapp -o jsonpath='{.spec.rules[0].host}')
echo "{\"deployedRef\":\"$DEPLITE_PARAM_REF\",\"url\":\"https://$DEP_URL\"}"트리거 호출 시 params: { "ref": "main-7f3a9b" }로 넘기면 워크플로우에서 $DEPLITE_PARAM_REF로 받을 수 있어요.
3) 외부 API → 데이터 웨어하우스 ETL
name: etl-orders
timeout-minutes: 45
secrets:
- SHOPIFY_TOKEN
- SNOWFLAKE_PWD
env:
WINDOW_HOURS: "24"
steps:
- name: extract
run: |
curl -H "X-Shopify-Access-Token: $DEPLITE_SECRET_SHOPIFY_TOKEN" \
"https://store.myshopify.com/admin/api/2024-01/orders.json?updated_at_min=$(date -d '24 hours ago' -Iseconds)" \
> /tmp/orders.json
timeout-minutes: 15
- name: transform
run: python3 /opt/etl/transform.py /tmp/orders.json /tmp/orders.parquet
timeout-minutes: 10
- name: load
run: python3 /opt/etl/load_snowflake.py /tmp/orders.parquet
env:
SNOWFLAKE_USER: deplite
SNOWFLAKE_ACCOUNT: ab12345.us-east-1
timeout-minutes: 204) 헬스체크 + 자동 복구
name: healthcheck
timeout-minutes: 5
steps:
- name: probe
run: |
if ! curl -fsS https://app.example.com/health > /dev/null; then
echo "UNHEALTHY"
exit 1
fi
echo "OK"
- name: restart-if-failed
run: kubectl rollout restart deployment/myapp
continue-on-error: true서버 측 트리거의 쿨다운·동시 실행 제한은 제한과 정책에서 다뤄요.
5) 디버그 환경 임시 부팅 + verbose
debug 모드로 호출할 step에 verbose: true를 붙여 두면, 트리거를 debug: true로 부를 때 원본 로그가 그대로 전송돼요.
name: spin-up-debug
timeout-minutes: 15
steps:
- name: launch
verbose: true
run: |
ID=$(docker run -d --rm -p 0:3000 myapp:debug)
HOST_PORT=$(docker port "$ID" 3000 | awk -F: '{print $2}')
echo "{\"containerId\":\"$ID\",\"url\":\"http://debug.internal:$HOST_PORT\"}"Webhook으로 호출 → 응답의 output.url을 그대로 Slack에 던질 수 있어요.