Skip to content
CodeSook
CodeSook

13. Job Outputs


Job Outputs คืออะไร

Job Outputs คือข้อมูลที่ Job หนึ่งสามารถส่งผ่านไปให้ Job อื่นๆ ใน Workflow เดียวกันใช้งานได้ โดยจะส่งเป็นข้อความธรรมดาในรูปแบบของ Key กับ Value

ใช้ทำอะไร? • แชร์ข้อมูลระหว่าง Jobs • ส่งผลลัพธ์จาก Job หนึ่งไปใช้ใน Job อื่น

ตัวอย่างการใช้งาน

name: Build and Deploy
on: [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 Project
on:
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 OutputsArtifacts
ข้อมูลขนาดเล็ก (string, number)ไฟล์/โฟลเดอร์ ขนาดใหญ่
ส่งผ่านทันทีระหว่าง Jobsอัปโหลด/ดาวน์โหลดผ่าน GitHub Storage
ใช้ใน Workflow เดียวกันเท่านั้นเก็บไว้ได้นาน, ดาวน์โหลดภายหลังได้