GitHub Actions memang terkenal sebagai alat otomatisasi CI/CD, tapi tahukah kamu kalau platform ini juga bisa dipakai untuk mengatur streaming YouTube? Dengan sedikit konfigurasi, kamu bisa membuat proses streaming menjadi otomatis, terjadwal, dan bahkan terintegrasi dengan repo kode sumber kamu. Ide ini sangat berguna bagi pembuat konten yang ingin mengurangi kerja manual, atau bagi developer yang ingin men-deploy video tutorial secara rutin.
Pada artikel ini, kita akan membahas contoh workflow GitHub Actions yang dapat menjalankan streaming ke YouTube secara langsung. Mulai dari persiapan environment, mengatur secrets, menulis file YAML, hingga menambahkan trik-trik kecil agar streaming kamu berjalan mulus tanpa gangguan. Jadi, siapkan kopi, buka editor favorit, dan ikuti langkah demi langkahnya!
Kenapa Memilih GitHub Actions untuk Streaming YouTube?
GitHub Actions menawarkan beberapa keunggulan yang membuatnya cocok untuk tugas streaming:
- Otomatisasi penuh: Jadwalkan streaming, trigger lewat push, atau bahkan lewat webhook eksternal.
- Environmen terisolasi: Setiap job berjalan di container atau VM yang bersih, mengurangi risiko konflik dependensi.
- Integrasi dengan Secrets: Simpan API key YouTube, OAuth token, atau credential lain dengan aman.
- Skalabilitas: Kamu bisa menambah runner self‑hosted jika butuh performa lebih tinggi (misalnya untuk resolusi 1080p).
Jika kamu baru saja membaca Cara Menghubungkan YouTube Live dengan GitHub Actions, kamu pasti sudah merasakan betapa mudahnya mengotomatiskan proses streaming. Pada bagian ini, kita akan menambahkan layer detail teknis sehingga workflow kamu semakin robust.
Komponen Utama dalam Workflow Streaming
1. Repository dan Struktur Direktori
Pastikan repo kamu memiliki struktur yang jelas, misalnya:
/
├─ .github/
│ └─ workflows/
│ └─ youtube-stream.yml
├─ scripts/
│ └─ start-stream.sh
└─ README.md
Folder .github/workflows adalah tempat menyimpan file YAML yang mendefinisikan aksi. Sementara scripts/start-stream.sh berisi perintah yang akan mengeksekusi streaming menggunakan ffmpeg atau library lain.
2. Secrets dan Credential
Untuk mengakses API YouTube Live, kamu memerlukan OAuth 2.0 access token atau API key. Simpan nilai-nilai ini di Settings > Secrets > Actions pada repo kamu dengan nama seperti YOUTUBE_CLIENT_ID, YOUTUBE_CLIENT_SECRET, YOUTUBE_REFRESH_TOKEN. GitHub secara otomatis menyembunyikan nilai ini saat workflow dijalankan.
3. Runner (Ubuntu vs Self‑Hosted)
Untuk kebanyakan kasus, runner berbasis Ubuntu (misalnya ubuntu-latest) sudah cukup. Jika kamu butuh GPU atau hardware khusus untuk encoding, pertimbangkan menambahkan self‑hosted runner dengan spesifikasi yang sesuai.
Contoh Workflow Lengkap
Berikut adalah contoh file youtube-stream.yml yang siap pakai. Kamu dapat menyesuaikannya sesuai kebutuhan, misalnya menambah jadwal atau trigger lain.
name: YouTube Live Streaming
on:
schedule:
# Setiap hari Senin jam 20:00 UTC (sesuaikan dengan timezone kamu)
- cron: '0 20 * * 1'
workflow_dispatch: # Memungkinkan manual trigger lewat UI GitHub
jobs:
stream:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js (jika pakai script Node)
uses: actions/setup-node@v3
with:
node-version: '20'
- name: Install ffmpeg
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg
- name: Prepare environment variables
env:
YOUTUBE_CLIENT_ID: ${{ secrets.YOUTUBE_CLIENT_ID }}
YOUTUBE_CLIENT_SECRET: ${{ secrets.YOUTUBE_CLIENT_SECRET }}
YOUTUBE_REFRESH_TOKEN: ${{ secrets.YOUTUBE_REFRESH_TOKEN }}
run: |
echo "YOUTUBE_CLIENT_ID=${YOUTUBE_CLIENT_ID}" >> $GITHUB_ENV
echo "YOUTUBE_CLIENT_SECRET=${YOUTUBE_CLIENT_SECRET}" >> $GITHUB_ENV
echo "YOUTUBE_REFRESH_TOKEN=${YOUTUBE_REFRESH_TOKEN}" >> $GITHUB_ENV
- name: Generate Access Token
id: token
run: |
ACCESS_TOKEN=$(curl -s
-X POST
-d client_id=${YOUTUBE_CLIENT_ID}
-d client_secret=${YOUTUBE_CLIENT_SECRET}
-d refresh_token=${YOUTUBE_REFRESH_TOKEN}
-d grant_type=refresh_token
https://oauth2.googleapis.com/token | jq -r .access_token)
echo "access_token=${ACCESS_TOKEN}" >> $GITHUB_OUTPUT
- name: Start streaming (ffmpeg)
env:
ACCESS_TOKEN: ${{ steps.token.outputs.access_token }}
run: |
# Contoh streaming dari file video lokal
ffmpeg -re -i ./assets/intro.mp4
-c:v libx264 -preset veryfast -b:v 2500k
-c:a aac -b:a 128k
-f flv "rtmp://a.rtmp.youtube.com/live2/${{ secrets.YOUTUBE_STREAM_KEY }}"
- name: Notify via Discord (optional)
if: always()
uses: sarisia/actions-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
username: "GitHub Actions Bot"
avatar_url: "https://i.imgur.com/XYZ.png"
content: "Streaming YouTube Live selesai! 🎬"
Penjelasan singkat tiap langkah:
- Schedule & manual trigger: Kamu dapat menjadwalkan streaming atau menjalankannya secara manual melalui UI.
- Install ffmpeg: Alat utama untuk meng‑encode video dan meng‑stream ke RTMP endpoint YouTube.
- Generate Access Token: Karena token refresh diperlukan untuk mengakses API, langkah ini mengambil token baru tiap kali workflow berjalan.
- Start streaming: Perintah
ffmpegmengirimkan video ke endpoint RTMP YouTube dengan stream key yang disimpan sebagai secret. - Notify via Discord: Opsional, tapi sangat membantu untuk memberi tahu tim kalau streaming sudah selesai atau terjadi error.
Tips Optimasi dan Troubleshooting
Gunakan Self‑Hosted Runner untuk Latency Rendah
Jika kamu mengalami lag atau buffering pada kualitas tinggi, pertimbangkan menambahkan self‑hosted runner yang berada di dekat data center Google Cloud. Hal ini dapat mengurangi latency antara runner dan server ingest YouTube.
Pastikan Stream Key Tidak Kedaluwarsa
Stream key YouTube memiliki masa berlaku tertentu. Simpan key dalam Secrets dan refresh secara berkala. Jika key berubah, update secret segera agar workflow tidak gagal.
Monitoring Log dengan Artifacts
Tambahkan langkah untuk meng‑upload log ffmpeg sebagai artifact. Dengan begitu, bila streaming berhenti tiba‑tiba, kamu bisa melihat detail error di tab “Actions”. Contoh:
- name: Upload ffmpeg log
if: failure()
uses: actions/upload-artifact@v3
with:
name: ffmpeg-log
path: ffmpeg.log
Gunakan Variable Substitution untuk Resolusi Dinamis
Jika kamu ingin mengubah resolusi atau bitrate secara otomatis berdasarkan ukuran file, gunakan ffprobe untuk membaca metadata sebelum memanggil ffmpeg. Berikut contoh singkatnya:
VIDEO_INFO=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height,bit_rate -of json input.mp4)
WIDTH=$(echo $VIDEO_INFO | jq '.streams[0].width')
HEIGHT=$(echo $VIDEO_INFO | jq '.streams[0].height')
BITRATE=$(echo $VIDEO_INFO | jq '.streams[0].bit_rate')
Integrasi dengan Tools Lain
Deploy Konten ke CDN setelah Streaming Selesai
Setelah live selesai, kamu mungkin ingin menyimpan rekaman ke bucket Cloud Storage atau CDN. Tambahkan job terpisah yang menyalin file hasil ffmpeg ke storage dan meng‑generate link publik.
Gunakan GitHub Pages untuk Landing Page Live
Jika kamu ingin menampilkan embed player YouTube di website statis, buat workflow yang otomatis memperbarui file HTML di gh-pages setiap kali streaming dimulai. Kombinasi ini memberi penonton akses mudah lewat satu klik.
Automasi Caption dengan Whisper AI
Untuk meningkatkan aksesibilitas, kamu dapat menambahkan langkah yang mengeksekusi model Whisper (OpenAI) untuk menghasilkan subtitle otomatis dari audio stream. Simpan subtitle sebagai file .vtt dan upload ke YouTube lewat API.
Semua integrasi di atas dapat dikelola dalam satu file YAML atau dipisah menjadi beberapa job yang berkomunikasi lewat needs dan outputs. Fleksibilitas GitHub Actions memungkinkan kamu menyesuaikan pipeline sesuai kebutuhan kreatif atau teknis.
Kalau kamu masih mencari panduan lebih detail tentang cara menyiapkan streaming dengan Node.js, cek Cara Mudah Streaming Video YouTube Pakai Node.js dan GitHub – Panduan Lengkap untuk Pemula. Di sana dijelaskan bagaimana menulis script Node yang memanggil API YouTube, yang dapat kamu integrasikan ke dalam workflow di atas.
Dengan contoh workflow ini, kamu tidak lagi harus membuka OBS atau software streaming lain setiap kali ingin siaran. Semua dapat dijadwalkan, dipantau, dan di‑log secara otomatis lewat GitHub. Selamat mencoba, dan semoga streaming kamu makin profesional serta bebas ribet!