Ini adalah postingan pertama saya semenjak blog ini pindah rumah (lagi!). Kali ini saya menggunakan Jekyll kembali dan menggunakan server gratisan dari OVH (NICE! 😊).

Berhubung kita kembali menggunakan static site generator, membuat pos masih serba manual. Kalau nggak copy+paste, ya, create new file. Ini membuat proses menulis menjadi membosankan dan tulisan mudah menjadi tidak konsisten. Oleh sebab itu, sebuah automation diperlukan!

Automation kali ini adalah sebuah script yang melakukan beberapa hal berikut ini:

  • memunculkan prompt di command line untuk mengisi Post title:,
  • membuat sebuah GitHub issue di repository ini https://github.com/firewalker06/didik-id-comments,
    • ngomong-ngomong soal komentar, kini blog ini bisa memunculkan komentar dari GitHub issue. Please, try it out! (Terinspirasi dari: https://dc25.github.io/myBlog/2017/06/24/using-github-comments-in-a-jekyll-blog.html)
  • membuat sebuah post di direktori _posts dengan front-matter berikut:
    title:
    slug:
    date_published:
    date_updated:
    github_comments_issueid:
    

Berikut ini adalah isinya:

#!/usr/bin/env ruby
require "tty-prompt"
require "net/http"
require "json"
require "fileutils"
require "yaml"
require "time"
require "dotenv/load"   # <-- loads .env automatically

# -------------------------
# LOAD REPO FROM _config.yml
# -------------------------
config = YAML.load_file("_config.yml")
REPO = config["github_comments_repository"]

unless REPO
  puts "❌ Missing `github_comments_repository:` in _config.yml"
  exit 1
end

JEKYLL_POST_DIR = "_posts"

# -------------------------
# PROMPTS
# -------------------------
prompt = TTY::Prompt.new

title = prompt.ask("Post title:", required: true)

# Prefer .env → fallback to prompt
github_token = ENV["GITHUB_TOKEN"]
github_token ||= prompt.mask("GitHub Token:", required: true)

slug = title.downcase.strip.gsub(" ", "-").gsub(/[^a-z0-9\-]/, "")
date = Time.now
post_filename = "#{JEKYLL_POST_DIR}/#{date.strftime('%Y-%m-%d')}-#{slug}.md"
date_and_slug = "#{date.strftime('%Y/%m/%d')}/#{slug}"

# -------------------------
# CREATE GITHUB ISSUE
# -------------------------
issue_data = {
  title: "Comments for: #{title}",
  body: "This issue is created to hold comments for : https://didik.id/#{date_and_slug}.",
}.to_json
uri = URI("https://api.github.com/repos/#{REPO}/issues")

req = Net::HTTP::Post.new(uri)
req["Authorization"] = "token #{github_token}"
req["User-Agent"] = "jekyll-post-script"
req["Content-Type"] = "application/json"
req.body = issue_data

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }

unless res.is_a?(Net::HTTPSuccess)
  puts "❌ GitHub Issue failed: #{res.code} - #{res.body}"
  exit 1
end

issue_id = JSON.parse(res.body)["number"]
puts "✅ Created GitHub Issue ##{issue_id}"

# -------------------------
# CREATE JEKYLL POST
# -------------------------
FileUtils.mkdir_p(JEKYLL_POST_DIR)

front_matter = <<~YAML
---
title: "#{title}"
slug: "#{slug}"
date_published: #{date.iso8601}
date_updated: #{date.iso8601}
github_comments_issueid: #{issue_id}
---
YAML

File.write(post_filename, front_matter)

puts "✅ Created Jekyll post #{post_filename}"
puts "✅ Injected issue ID #{issue_id}"

Kesan-kesan

Sungguh tak terbayangkan dalam benak saya bahwa semua script ini bisa saya coba dan selesaikan dalam waktu kurang dari 2 jam saja. Sebelum ada AI, saya mesti menghabiskan 2-3 jam hanya untuk browsing dokumentasi setiap library yang saya pakai di atas. This is fun!