13. Job Outputs
Job Outputs คืออะไร
Job Outputs คือข้อมูลที่ Job หนึ่งสามารถส่งผ่านไปให้ Job อื่นๆ ใน Workflow เดียวกันใช้งานได้ โดยจะส่งเป็นข้อความธรรมดาในรูปแบบของ Key กับ Value
ใช้ทำอะไร? • แชร์ข้อมูลระหว่าง Jobs • ส่งผลลัพธ์จาก Job หนึ่งไปใช้ใน Job อื่น
ตัวอย่างการใช้งาน
name: Build and Deployon: [push]
jobs: build: runs-on: ubuntu-latest outputs: # กำหนด outputs version: ${{ steps.get-version.outputs.version }} build-status: ${{ steps.build.outputs.status }}
steps: - uses: actions/checkout@v3
- name: Get Version id: get-version run: | VERSION=$(cat package.json | jq -r '.version') echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Build id: build run: | npm run build echo "status=success" >> $GITHUB_OUTPUT
deploy: needs: build runs-on: ubuntu-latest steps: - name: Deploy run: | # ใช้ outputs จาก build job echo "Deploying version: ${{ needs.build.outputs.version }}" echo "Build status: ${{ needs.build.outputs.build-status }}"
สถานการณ์การใช้งานจริง • Build → Test → Deploy: ส่ง version number จาก build ไป deploy • Matrix Build: รวบรวมผลลัพธ์จากหลาย environment • Conditional Deployment: ตัดสินใจ deploy ตาม build status
flowchart TD subgraph "GitHub Actions Workflow" subgraph "Build Job" A[Get Code] --> B[Get Package Version] B --> C[Install Bun] C --> D[Install Dependencies] D --> E[Build Project] E --> F[Get Build Info] F --> G[Upload Artifacts] B -.-> O1[version: 1.2.3] F -.-> O2[build-time: 2024-01-15] F -.-> O3[build-hash: abc123] F -.-> O4[build-status: success] end subgraph "Job Outputs" O1 O2 O3 O4 end subgraph "Artifacts Storage" AR[dist folder
+ public folder] end subgraph "Deploy Job" H[Show Build Info] --> I[Download Artifacts] I --> J[List Files] J --> K[Deploy] end end G --> AR O1 --> H O2 --> H O3 --> H O4 --> H AR --> I style A fill:#89b4fa,stroke:#6c7086,color:#11111b style B fill:#89b4fa,stroke:#6c7086,color:#11111b style C fill:#89b4fa,stroke:#6c7086,color:#11111b style D fill:#89b4fa,stroke:#6c7086,color:#11111b style E fill:#89b4fa,stroke:#6c7086,color:#11111b style F fill:#89b4fa,stroke:#6c7086,color:#11111b style G fill:#89b4fa,stroke:#6c7086,color:#11111b style O1 fill:#a6e3a1,stroke:#6c7086,color:#11111b style O2 fill:#a6e3a1,stroke:#6c7086,color:#11111b style O3 fill:#a6e3a1,stroke:#6c7086,color:#11111b style O4 fill:#a6e3a1,stroke:#6c7086,color:#11111b style AR fill:#fab387,stroke:#6c7086,color:#11111b style H fill:#cba6f7,stroke:#6c7086,color:#11111b style I fill:#cba6f7,stroke:#6c7086,color:#11111b style J fill:#cba6f7,stroke:#6c7086,color:#11111b style K fill:#cba6f7,stroke:#6c7086,color:#11111b
มาลองใช้งาน Job Outputs กัน
name: Deploy Projecton: push: workflow_dispatch: pull_request:
jobs: build: runs-on: ubuntu-latest # เพิ่ม outputs outputs: build-time: ${{ steps.build-info.outputs.timestamp }} build-hash: ${{ steps.build-info.outputs.hash }} build-status: ${{ steps.build-info.outputs.status }} package-version: ${{ steps.version.outputs.version }}
steps: - name: Get Code uses: actions/checkout@v4
- name: Get Package Version id: version run: | VERSION=$(cat package.json | jq -r '.version') echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Install Bun uses: oven-sh/setup-bun@v2 with: bun-version: 1.2.18
- name: Install Dependencies run: bun i
- name: Build run: bun run build
- name: Get Build Info id: build-info run: | echo "timestamp=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_OUTPUT echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT echo "status=success" >> $GITHUB_OUTPUT
- name: upload dist folder uses: actions/upload-artifact@v4 with: name: dist path: | dist public
deploy: needs: build runs-on: ubuntu-latest steps: - name: Show Build Info run: | echo "🚀 Deploying version: ${{ needs.build.outputs.package-version }}" echo "📦 Build hash: ${{ needs.build.outputs.build-hash }}" echo "⏰ Built at: ${{ needs.build.outputs.build-time }}" echo "✅ Build status: ${{ needs.build.outputs.build-status }}"
- name: download dist folder uses: actions/download-artifact@v4 with: name: dist
- name: List all files run: ls -R
- name: Deploy run: | echo "Deploying version ${{ needs.build.outputs.package-version }}..." echo "Commit: ${{ needs.build.outputs.build-hash }}"
ลอง push code แล้วเปิดดูใน github กัน

ความแตกต่างระหว่าง Job Outputs และ Artifacts
Job Outputs | |
---|---|
ข้อมูลขนาดเล็ก (string, number) | ไฟล์/โฟลเดอร์ ขนาดใหญ่ |
ส่งผ่านทันทีระหว่าง Jobs | อัปโหลด/ดาวน์โหลดผ่าน GitHub Storage |
ใช้ใน Workflow เดียวกันเท่านั้น | เก็บไว้ได้นาน, ดาวน์โหลดภายหลังได้ |