ใช้ Athens ทำ GOPROXY

Pallat Anchaleechamaikorn
odds.team
Published in
1 min readMar 28, 2019

เวลาที่เราอยากจะทำ CI/CD กับภาษา go ในระบบปิด หลายครั้งที่เรามักจะยอมแพ้ให้กับท่า vendor เพราะการทำ artifactory กับ go modules มันไม่ง่ายเท่าไหร่ โดยเฉพาะถ้าจะไปถามหาเอาจาก ยี่ห้อดังๆ หลายเจ้าก็ยังไม่มีฟีเจอร์นี้ ส่วนเจ้าที่มีก็คิดตังค์แพง วันนี้เราเลยจะมาลอง Athens ซึ่งเป็น opensource ที่มีคนให้ดาวเยอะระดับหนึ่ง

โดย repo ของเขาอยู่ที่ https://github.com/gomods/athens และมี document อยู่ที่ https://docs.gomods.io/

ก่อนอื่นผมคิดว่าการที่เราคิดจะมาท่านี้ ส่วนหนึ่งเราก็อยากใช้ lib ที่เราเขียนกันเองภายในบริษัทด้วย ซึ่งผมเคยเขียน blog เล่าไว้แล้วว่าต้องทำอะไรกับ git นิดหน่อย คราวนี้ก็จะขอข้ามไป ใครจำไม่ได้ รบกวนกลับไปหาอ่านก่อน ที่นี่

ผมขี้เกียจจะ install ก็เลยจะเล่นผ่าน docker โดยมี command ยาวๆแบบนี้

docker run --rm -d \
-v $(pwd)/$ATHENS_STORAGE:/var/lib/athens \
-v $(pwd)/.gitconfig:/root/.gitconfig \
-v $(pwd)/.ssh:/root/.ssh \
-e ATHENS_DISK_STORAGE_ROOT=/var/lib/athens -e ATHENS_STORAGE_TYPE=disk --name athens-proxy -p 3000:3000 gomods/athens:canary

แต่! เดี๋ยวก่อน!!! อย่าเพิ่งรันนะ มันจะยังใช้ไม่ได้ เพราะเราต้องทำบางอย่างก่อน จากที่เห็นในคำสั่ง มันต้องการค่า env ที่ชื่อ $ATHENS_STORAGE ซึ่งเป็นการ Map Path ที่เก็บ mod cache ออกมาไว้ในเครื่อง host แทนที่จะเก็บไว้ใน container ครับ

เพราะฉะนั้น ถ้าต้องการเก็บ cache ไว้ในเครื่อง host ก็ต้องสร้าง directory และกำหนด env ก่อน เช่น

$ mkdir storage$ export ATHENS_STORAGE=storage

ต่อมา -v $(pwd)/.gitconfig:/root/.gitconfig ตัวนี้ เป็นการ map volume ที่เป็น git confg ในเครื่องเราเข้าไปข้างใน container นั่นหมายความว่าเราจะต้องรันคำสั่งนี้ที่ home directory นะครับ ไม่งั้นก็อาจจะต้องแก้ path ตอนที่รันก่อน $(pwd) ตัวนี้คือคำสั่ง print working directory มันจะเอา directory ที่รันคำสั่งใส่ไปครับ

ต่อมา -v $(pwd)/.ssh:/root/.ssh ตัวนี้เป็นการ map volume ส่วนของ security key ของเราให้กับ container ไปเลย คล้ายๆกับการโอนสิทธิ์ของเราให้ container ไปใช้ puhs/pull กับ git ได้

ถ้าทำตามนี้แล้วก็สามารถรันคำสั่งยาวๆด้านบนได้แล้วครับ

การใช้งาน

วิธีใช้งานก็ง่ายมากๆ ลองดูตัวอย่างคำสั่งครับ

export GOPROXY=http://127.0.0.1:3000

เราแค่ชี้ GOPROXY ไปที่ Athens แค่นี้ หลังจากนี้เวลาที่เราสั่ง go mod tidy หรือคำสั่ง run หรือ test มันจะดู cache มาเก็บไว้แล้วก็ใช้ได้ตลอด

สำหรับคนที่มี internal library อาจจะต้องสลับ network ไปๆมาๆ สักรอบนึง เพื่อสั่ง go mod tidy หรือ go mod download ให้มันดึงของให้ครบก่อนนะครับ

--

--