Files Action
Deplite/files-action@v1은 GitHub Actions에서 Deplite 스토리지에 파일을 업·다운·삭제하는 공식 액션이에요.
하나의 액션이 mode 입력으로 세 동작을 분기해요.
Inputs
| 이름 | 필수 | 모드 | 기본값 | 설명 |
|---|---|---|---|---|
api-token | ✅ | 공통 | — | Deplite API 토큰 (Bearer) |
mode | ✅ | 공통 | — | upload, download, delete 중 하나 |
path | ✅ | upload | — | 업로드할 로컬 파일 경로 |
filename | upload | basename(path) | 저장될 파일명 오버라이드 | |
content-type | upload | — | MIME 타입 (예: application/vnd.android.package-archive) | |
cleanup-rule | ✅ | upload | — | ttl 또는 persistent |
ttl-seconds | upload | — | cleanup-rule=ttl일 때 TTL 초 (60 ≤ ttl ≤ 90일) | |
binding-id | upload | — | 스토리지 binding UUID. 토큰이 여러 binding 허용 시 필수 | |
file-id | ✅ | download, delete | — | 파일 UUID |
dest | ✅ | download | — | 다운로드 결과 저장 로컬 경로 |
base-url | 공통 | https://api.deplite.io/v1 | API 베이스 URL 오버라이드 |
Outputs
| 이름 | 모드 | 설명 |
|---|---|---|
file-id | upload | 새로 생성된 파일의 UUID |
size | upload, download | 파일 크기(byte) |
status | upload | 파일 상태 (pending / active …) |
동작 상세
Upload — 3단계 (presign + PUT + complete)
1. POST ${base-url}/storage/files/presign-upload
body: { filename, cleanupRule, contentType?, ttlSeconds?, bindingId? }
→ { fileId, uploadUrl, uploadHeaders?, expiresInSeconds? }
2. PUT ${uploadUrl}
headers: ...uploadHeaders, [Content-Type]
body: <file stream> (undici duplex: 'half')
3. POST ${base-url}/storage/files/${fileId}/complete
→ FileMeta { id, size, status, ... }- 1·3은 Bearer 인증, 2는 presigned URL이라 헤더만 그대로 따라가요.
- 파일은 메모리에 통째로 올리지 않고
fs.createReadStream으로 PUT에 흘려보내요. - 재시도는 액션 자체에서 하지 않아요(아래 “에러 처리” 참고).
업로드가 끝나면 outputs.file-id로 다른 step에 넘기거나, trigger-action의 params에 실어 워크플로우로 전달하면 돼요.
Download — 2단계
1. GET ${base-url}/storage/files/${file-id}/download-url
→ { downloadUrl, expiresInSeconds }
2. GET ${downloadUrl}
→ 응답 본문을 ${dest}에 스트림으로 저장dest의 상위 디렉토리는 자동 생성돼요.- 응답 헤더의
Content-Length(있을 때)가outputs.size로 들어와요.
Delete — 1단계
DELETE ${base-url}/storage/files/${file-id}
→ 204 No Content (또는 2xx)- 404를 받으면 step은 실패 처리돼요. “이미 없으면 OK”가 필요하면
continue-on-error: true로 감싸주세요.
에러 처리
- 모든 단계에서 비-2xx 응답은 HTTP status + body를 포함한 메시지로 즉시 throw →
core.setFailed()→ step 실패 (exit 1) - 네트워크 오류·디스크 오류도 마찬가지
- 자동 재시도는 없어요.
일시적 5xx에 대응하려면 step 단위 retry를 직접 구성해주세요 (예:nick-fields/retry@v3).
Bearer 인증 외 환경변수 사용 없음
trigger-action과 달리 files-action은 GITHUB_* 환경변수를 사용하지 않아요.
모든 동작은 inputs와 토큰으로만 결정돼요.
cleanup-rule 선택 기준
| 값 | 의미 | 적합한 용도 |
|---|---|---|
ttl | 지정한 초 후 자동 삭제 | 빌드 산출물, 단기 임시 파일 |
persistent | 명시 삭제 전까지 보관 | 릴리즈 아티팩트, 정식 배포물 |
빌드 산출물에 persistent를 쓰면 스토리지가 빠르게 차오르니, CI 산출물은 ttl + 짧은 ttl-seconds(잡 평균 실행 시간 +α)를 추천드려요.
스토리지 binding이 여러 개일 때
조직 안에 여러 storage binding이 있고 토큰이 그중 둘 이상에 권한을 가진 경우, 어떤 binding에 올릴지 binding-id로 명시해야 해요.
- uses: Deplite/files-action@v1
with:
api-token: ${{ secrets.DEPLITE_API_TOKEN }}
mode: upload
binding-id: ${{ vars.STAGING_STORAGE_BINDING_ID }}
path: ./build/app.apk
cleanup-rule: persistent토큰이 단일 binding만 허용한다면 자동으로 그 binding이 선택돼요.
모드별 최소 예제
Upload
- uses: Deplite/files-action@v1
id: upload
with:
api-token: ${{ secrets.DEPLITE_API_TOKEN }}
mode: upload
path: ./build/app.apk
content-type: application/vnd.android.package-archive
cleanup-rule: ttl
ttl-seconds: 86400
- run: echo "fileId=${{ steps.upload.outputs.file-id }}"Download
- uses: Deplite/files-action@v1
with:
api-token: ${{ secrets.DEPLITE_API_TOKEN }}
mode: download
file-id: 00000000-0000-0000-0000-000000000000
dest: ./downloaded.binDelete
- uses: Deplite/files-action@v1
with:
api-token: ${{ secrets.DEPLITE_API_TOKEN }}
mode: delete
file-id: 00000000-0000-0000-0000-000000000000관련 문서
최종 수정 일자: