ลองเอา cotton ขึ้น homebrew ครั้งแรก

จั่วหัวไว้ว่าครั้งแรก แปลได้เลยว่าไม่สำเร็จ แต่ได้เรียนรู้อะไรหลายอย่างจากการลอง รวมถึงเหตุผลว่าทำไมถึงไม่ได้

เริ่มจากทำ cotton ด้วย go แล้วอยาก install cotton ได้ด้วยคำสั่ง brew install cotton มันน่าจะสะดวกไม่น้อย ไม่ต้องมาเสียเวลา go get https://github.com/chonla/cotton บางคนไม่มี go อีกต้องมานั่ง install go เองอีก

เริ่มต้นจากเตรียม formula

ใน homebrew พวก software package มันจะเก็บขั้นตอน install ไว้ใน ruby file (.rb) ไฟล์พวกนี้จะเรียกเป็น formula (ส่วนแบบที่มี ui ที่จะต้องลาก install จะเรียกเป็น cask แต่ cotton เป็น command line ก็ใช้ formula เฉย ๆ)

วิธีสร้าง formula package ใช้คำสั่ง brew create https://foo.com/bar-1.0.tgz โดยที่ foo.com คือ domain ของเรา ส่วน bar-1.0.tgz เป็น file package ของเรา วิธีง่ายสุดก็ทำ release บน git แล้วเอา archive ที่ได้มาทำเลย เช่น cotton host อยู่บน github ก็แค่ tag version แล้วก็สั่ง brew create https://github.com/chonla/cotton/archive/0.1.9.tar.gz เท่านี้ brew ก็จะสร้าง cotton.rb มาให้เราไว้ใน /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/cotton.rb เราก็ไปแก้เนื้อหาข้างในให้เป็นประมาณนี้

class Cotton < Formula
    desc "Markdown Test Specification Runner"
    homepage "https://github.com/chonla/cotton"
    url "https://github.com/chonla/cotton/archive/0.1.17.tar.gz"
    sha256 "f199d6672b75dcefa8c517ddbbc4b94a8df2289597f6b598e0c37b211a3f6766"
    depends_on "go" => :build

    def install
      system "bash", "build.sh"
      bin.install "/tmp/.gobuild/bin/cotton" => "cotton"
    end

    test do
      system "#{bin}/cotton", "-v"
    end
end

จากไฟล์ formula จะประกอบด้วย

desc เป็น description ของ package
homepage เป็น homepage ของ package
url เป็น url ของไฟล์ archive ที่เราจะเอามาใช้
sha256 เป็น hash value ของไฟล์จาก url ที่เกิดจาก algorithm sha256
depends_on เป็น dependency ของ formula นี้ ซึ่งระบุว่าเป็น go แสดงว่าตอน install มันจะลง go ให้เราด้วยเลย ไม่ต้องลงเอง
def install เป็นขั้นตอนการ install ว่าจะต้องทำอะไรบ้าง ในนี้จะระบุแค่ให้ไปสั่ง build.sh กับ copy ผลลัพธ์ที่ได้ไปวางไว้ใน bin directory
test do เป็นขั้นตอน test หลัง install เสร็จ เราก็แค่สั่ง -v ดูว่ามันทำงานได้ไหม

ส่วนไฟล์ build.sh ที่ระบุ ก็เอาไปใส่ไว้ใน repository ของเราเลย หน้าตาแบบนี้

#!/bin/bash

set -eux

export GOPATH="/tmp/.gobuild"
SRCDIR="${GOPATH}/src/github.com/chonla/cotton"

[ -d ${GOPATH} ] && rm -rf ${GOPATH}
mkdir -p ${GOPATH}/{src,pkg,bin}
mkdir -p ${SRCDIR}
cp -R . ${SRCDIR}
(
    echo ${GOPATH}
    cd ${SRCDIR}
    go get .
    go install .
)

หลัก ๆ คือสร้าง temporary directory, set GOPATH ไปที่นั่น, copy code ทั้งหมดไปลงในนั้น เสร็จแล้ว build ซะ ตรงไปตรงมา

เมื่อทุกอย่างพร้อมก็ไปขั้นตอนต่อไป

ทดสอบ formula ที่ได้

ด้วยคำสั่ง brew audit --strict cotton ถ้ามัน error มันจะบอกว่าเจอปัญหาอะไร ถ้าไม่เจอปัญหาอะไร มันจะเด้งกลับมาที่ prompt ตามปกติ

เมื่อขั้นตอนนี้ผ่านก็ไปต่อ

ลอง install ดู

ด้วยคำสั่ง brew install --build-from-source cotton ทุกอย่างควรจะผ่านด้วยดี

เมื่อพร้อมแล้วก็เตรียมส่งเข้า brew formula ได้เลย

สร้าง formula ลงใน homebrew

เริ่มจากเอา brew formula มาก่อน โดยการ fork repository homebrew-core มาเป็นของเรา เสร็จแล้ว clone ลงมาที่ local เรา เปิดไปที่ directory Formula เพิ่มไฟล์ formula ที่เราเตรียมไว้ลงไปได้เลย เช่น ในก่อนหน้านี้ เราทำ cotton.rb ไว้ ก็เอาไอ้นั่นแหละ มาวางใน Formula/ เลย เสร็จแล้ว add + commit ด้วย message ที่มี format แบบนี้เป๊ะ ๆ

cotton 0.1.17 (new formula)

เพราะว่า process ของ homebrew ส่วนใหญ่มันใช้ bot ดังนั้นทุกอย่างเป็น auto เกือบทั้งหมด เสร็จแล้วก็ push กลับเข้าไปที่ github หลังจากนั้นก็ไป create pull request กลับเข้าไปที่ homebrew-core

ที่เหลือก็แค่รอระบบ auto มันมา review formula เราว่าโอเคไหม ถ้าทุกอย่างโอเค ก็รอ merge ได้เลย

ส่วนผลของ cotton ก็ review ไม่ผ่าน ด้วยเหตุผลว่า

  • GitHub repository not notable enough (<30 forks, <30 watchers and <75 stars)
  • GitHub repository too new (<30 days old)

อ้าวววว คือ repo จะต้องดังหน่อยนะ ต้องมี fork 30+ watcher 30+ star 75+ แถมว่า repo ต้องอายุมากด้วย (30+ วัน) โถถถถถถ อดเลยทีนี้

อะฮ้า

จริง ๆ น่าจะรู้ตัวก่อนหน้านี้ด้วยซ้ำ เพราะใน homebrew-core เอง มันมีที่นึงบอกว่า ตอน audit ให้ใช้ --new-formula นะ ไอ้ก่อนหน้านี้มัน --strict เนี่ย ไปเอามาจากเว็บอื่นที่มีคนทำไว้ พอลองทำปุ๊บ แม่งขึ้นเลยทันที

http://www.chonla.com/wp-content/uploads/2018/07/Screen-Shot-2561-07-24-at-22.12.06.png

เอาไงต่อ

เดี๋ยวรอให้ condition มันครบตามที่มันบอกก่อน แล้วเดี๋ยวค่อยกลับมาทำใหม่ละกัน

อ้างอิง

  • https://brew.sh/
  • https://github.com/Homebrew/homebrew-core/blob/master/CONTRIBUTING.md
  • https://gist.github.com/mickep76/ca29cca70f0b458aee4d

One thought on “ลองเอา cotton ขึ้น homebrew ครั้งแรก

Leave a Reply