ใช้ FSH ทำ FHIR Implementation Guide แล้ว Publish บน Github Pages

ช่วงหลายวันมานี้ได้มีโอกาสสร้าง FHIR Implementation Guide โดยใช้ FHIR Shorthand (FSH) มาครับ ผมรู้จัก FSH ครั้งแรกจาก blog ที่พี่กวินเขียน หลังจากนั้นก็เห็นคนพูดถึงมากขึ้นเรื่อย ๆ เลยคิดว่าน่าสนใจครับ พอดีมีงานที่ต้องทำ IG เข้ามา ก็เลยถือโอกาสลองใช้ FSH ดูเลยครับ

ต้องบอกว่าจริง ๆ FSH ก็แอบมี learning curve ที่ไม่ง่ายมากนะครับ คือส่วน basic มันไม่ยากหรอก แต่ส่วนที่ซับซ้อนขึ้นมาก็ใช้เวลาเป็นวันเหมือนกันครับ แต่ว่าพอเข้าใจหลักการแล้ว ผมว่า FSH ดีมาก ๆ เลยนะครับ คือถ้าต้องทำทั้ง Profiles ทำทั้งตัวอย่าง resource instance โดยใช้เครื่องมือที่มีในปัจจุบัน (เช่น Forge) ก็คงไม่ได้เสร็จได้ง่าย ๆ และจะแก้อะไรทีละเยอะ ๆ ก็ลำบาก พอเป็น command-line tool แบบนี้ แก้รวดเดียว build รวดเดียว เสร็จเลย ผมว่านี่น่าจะกลายเป็นท่ามาตรฐานในการทำ FHIR artifact ในอนาคตเลยครับ

สำหรับ blog นี้ ก็คือโอกาสสรุปขั้นตอนที่ทำ เพื่อบันทึกไว้กันลืม และเพื่อแชร์ให้คนอื่นด้วยครับ

Special Thanks: วิดีโอจาก FHIR DevDays เหล่านี้ที่ให้ความรู้ครับ

ภาพ featured image โดย Francesco Ungaro บน Unsplash


ขั้นที่ 1: เตรียมเครื่องมือ

ซึ่งได้แก่ NodeJS, SUSHI (npm package)

  • Install Node ผมทำผ่าน Homebrew โดย install NVM ก่อน (link)
  • Install SUSHI (link)
npm install -g fsh-sushi

ขั้นที่ 2: สร้าง FSH โปรเจคท์ใหม่

sushi --init

การ config เพิ่มเติมต่าง ๆ ดูได้ที่หน้า Project Structure และ Configuration ครับ หลัก ๆ ที่ต้องแก้ขั้นพื้นฐาน ก็คือไฟล์ sushi-config.yaml ดูตรงส่วน minimum configuration หรือ recommended configuration ก็ได้ครับ (แต่เราน่าจะไม่ได้ใช้ US Core dependency) จากนั้นเวลาจะทำ artifiacts ต่าง ๆ (Profile, Instance, ฯลฯ) เราจะทำผ่านไฟล์ .fsh

ครั้งนี้ผมทำใน VS Code เพราะมี extension ชื่อ FHIR Shorthand ให้ใช้ ซึ่งจะช่วย highlight syntax ของไฟล์ .fsh ให้เราครับ ถ้าเราใช้ sushi init เราจะได้โครงสร้าง project ประมาณนี้ หลัก ๆ ที่ต้องแก้อยู่ในโฟลเดอร์ fsh จะมีกี่ไฟล์กี่โฟลเดอร์ย่อยข้างในนั้นก็ได้ เวลามัน process ออกมามันจะไปดูไฟล์ทั้งหมดในโฟลเดอร์

อันนี้เป็นตัวอย่างของโปรเจคท์ที่ผมทำไปพอสมควรแล้วนะครับ ก็เลยมีอะไรเยอะหน่อย

ขั้นที่ 3: ลองรัน SUSHI

จากนั้นก็ลองเข้าไปที่ directory แล้วลองรัน SUSHI โดยรันคำสั่งนี้

sushi .

ถ้าไม่มี error อะไร ก็จะขึ้นเป็นกล่องเขียว ๆ ไม่มี error แต่ถ้ามีก็จะเป็นกล่องแดงแล้วบอกเราว่า error อยู่ตรงไหน

ขั้นที่ 4: ลองใช้ Publishing tool สร้าง Implementation Guide (IG)

ลองดูตรงหน้า Running SUSHI ตรงส่วนนี้เพิ่มเติมครับ ที่ต้องทำก็คือ download IG Publisher มาก่อน

./_updatePublisher.sh

จากนั้นลองรันดู

./_genonce.sh

มันจะ generate ไฟล์ทั้งหมดไปไว้ที่ /output/index.html ถ้าเรามีพวก live-server extension ก็จะสะดวกดีครับ ไม่ต้องคอยเปิดไฟล์

ขั้นที่ 5: จัดการเรื่อง Git และ GitHub

จริง ๆ git init นี่ควรจะทำตั้งแต่แรก ๆ แต่ไม่เป็นไรครับ สมมติทำในขั้นนี้ก็ได้ จากนั้นเราก็ไปเปิด repo ใหม่บน GitHub อันนี้ไม่ยากนะครับ ทำตามขั้นตอนไป แล้วก็มาเพิ่ม remote branch เข้าไปใน git ของเรา

git init
echo "# MESSAGE" >> README.md
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:User/UserRepo.git
git push -u origin main

ขั้นที่ 6: จัดการเรื่อง GitHub Page

ไปเปิดใช้ที่ Settings ของ repo นั้น แล้วไปที่ส่วน Pages ตอนนี้เลือกเป็น main ไปก่อนก็ได้ครับ

หลังจากนั้นให้สร้าง Action ใหม่ โดยสร้างไฟล์ชื่อ main.yml ที่ [repo]/.github/workflows/ กลายเป็น [repo]/.github/workflows/main.yml โดยเนื้อหาของไฟล์ ให้นำมาจากไฟล์นี้ของ HL7 Belgium กลายเป็นแบบนี้นะครับ

จากนั้น เมื่อเรา push code ของเราขึ้นไป ระบบจะไป build ให้เราเอง โดยนำ output ที่ได้ไปอยู่ที่ gh-pages branch แบบนี้ครับ

ตอนนี้เราต้องไปเปลี่ยน Source ของ GitHub Page ตรง Setting ของ repo ตรงส่วน Page ให้เป็น gh-pages branch ก่อนครับ

เราจะสามารถเข้าผ่าน https://username.github.com/repo/ ได้ครับ

หมายเหตุ: ในขั้นตอนการ build หลังจากที่ push code และในขั้นตอนการเปลี่ยน source จะมีระยะเวลาต้องรอนิดนึงนะครับ วิธีดูง่าย ๆ ว่าเสร็จแล้วคือดูจากลูกศรสีเขียวข้างบน repo ครับ

สังเกตลูกศรเขียวที่มีเลย 8694f30 ตาม แสดงว่าเสร็จแล้ว

ขั้นที่ 7: ลงมือแก้ไข FHIR Artifacts

ทั้งเรื่องการใช้ FSH และการแก้ไขข้อมูลใน IG เพื่อทำการ publish มีรายละเอียดที่ค่อนข้างเยอะ จะเขียนในนี้คงยาวครับ ไว้มีโอกาสมาสรุปให้ฟังครับ หากสนใจหาข้อมูลเพิ่มเติม ผมแนะนำแหล่งต่อไปนี้ครับ

ในด้านการใช้ FSH ผมว่า Docs ของเขาก็เขียนได้ดี แต่หาข้อมูลยากไปนิด

  • ตรงส่วน Overview จะพอเข้าใจการใช้งานขั้นพื้นฐานที่สำคัญ ๆ ได้ แต่ไม่พอทำอะไรซับซ้อน เช่น Slicing
  • ตรงส่วน Language Reference อันนี้เป็นการใช้งานโดยละเอียด แต่ยาวมาก
  • FSH school อันนี้ก็เป็นการแนะนำการใช้งานเบื้องต้นที่ดีครับ ทีเด็ดจริง ๆ อยู่ที่ Play with FSH ครับ โดยเราสามารถไปเอา Profile ดัง ๆ ที่คนอื่นเขียน (เช่น US Core, IPS) เอามา convert เป็น FSH ได้ครับ เราก็พอได้ไอเดียว่าต้องเขียน FSH ของเรายังไง

ในด้านการใช้ IG publishing มี 2 แหล่งที่สำคัญครับ

  • Guidance for FHIR IG Creation อันนี้บอกเรื่องการสร้าง IG ค่อนข้างละเอียด
  • IG Publisher Documentation อันนี้บอกวิธีการใช้ publishing tool
  • tutorial-ig GitHub repo ของ HL7-BE ลองดูไปแต่ละ commit ครับ เขาอธิบายวิธีการ config publishing tool ได้ค่อนข้างดี หรือดูคลิปที่คุณ José Costa Teixeira สอนชั่วโมงที่สอง จะอธิบายเรื่องนี้ครับ

อันนี้ก็เป็น IG ที่ผมสร้างวันนี้นะครับ ยังไม่เสร็จหลาย ๆ หน้าครับ

หากสนใจสามารถเข้าไปดูได้ที่ https://rathpanyowat.github.io/ncd-th-ig-demo/ ครับ


ก็จบแล้วครับ ไว้ได้เรียนรู้ประเด็นนี้เพิ่มเติมอย่างไรเอามาแชร์เพิ่มครับ

Leave a Reply

Your email address will not be published. Required fields are marked *