พอดีมีโอกาสทำ pipeline บน Gitlab ci ในการที่จะทำ build android ให้ออกมาได้ไฟล์ apk ซึ่งการ build ละแต่ครั้งนั้นเราจำเป็นต้องมีไฟล์ .keystore ไว้เสมอ ซึ่งมันเป็นไฟล์ที่สำคัญมากห้ามหลุดออกไปไหนเด็ดขาด และไม่ควรเก็บไว้ใน git ด้วย

โดย Gitlab นั้นมีสิ่งที่เรียก Secure Files มาให้ใช้แล้ว เราสามารถจัดเก็บไฟล์อย่างปลอดภัยเพื่อใช้ใน Pipeline CI/CD ได้อย่างปลอดภัย โดยมันจะถูกจัดเก็บไว้อย่างปลอดภัยภายนอกที่เก็บของโปรเจ็กต์ และไม่ได้ควบคุมเวอร์ชัน

ผมจะมาอธิบายวิธีการใช้งาน และวิธีการเขียน Gitlab-ci ให้โหลดไฟล์มันมาใช้ได้

วิธีเก็บ Secure file ใน Gitlab

ให้ไปที่ Project ของเราจากนั้นไปที่เมนู Settings > CICD > Secure files แล้วอัพโหลดไฟล์ที่ต้องการเก็บไว้

จะสามารถอัพโหลดได้สูงสุด 100 ไฟล์ต่อ Project และรองรับขนาดไฟล์สูงสุดแค่ 5MB

วิธีโหลด Secure file ใน gitlab-ci

ผมขอยกตัวอย่างสั้นๆ จากโปรเจ็ค React-native นะ ไฟล์ .gitlab-ci.yml

variables:
  PROJECT_ID: "42102345"
  PROD_SECURE_FILES: "https://gitlab.com/api/v4/projects/$PROJECT_ID/secure_files/2629/download"
before_script:
    - 'curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$PROD_SECURE_FILES" >> android/app/my-release-key.keystore'
script:
    - fastlane buildReleaseAPK

หลังจากอัพโหลดไฟล์เก็บไว้แล้ว เราสามารถโหลดลงมาในงานในตอน pipeline เราได้ตามตัวอย่างด้านบน ดังนี้

PROJECT_ID = เป็นเลขไอดีของ project เรา

PROD_SECURE_FILES = ที่อยู่ของไฟล์เรา จะสังเกตุว่าจะมีเลข 2629 อยู่ซึ่งมันคือ id ของไฟล์เรา แล้วเราจะหามันมาได้ยังไงละ? ใช้คำสั่งดังนี้ครับ

$ curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "https://gitlab.com/api/v4/projects/$PROJECT_ID/secure_files"
  • $PRIVATE_TOKEN เป็น token ของเราเอง
  • $PROJECT_ID เป็นไอดีของ project เรา

เมื่อเรียกคำสั่งแล้วจะได้ผลลัพธ์ดังนี้

[{"id":2629,"name":"my-release-key.keystore","checksum":"674eb25ba1c50ff9353a94a76745bxxxxxxxxx4dd0c5e52f0fed241d0811f","checksum_algorithm":"sha256","created_at":"2020-01-16T08:03:59.835Z"}]

เราจะเห็นไฟล์เราพร้อมเลข ID ก็เอาเลขนั้นมาใช้

จากนั้นเราก็มาดูวิธีการโหลดไฟล์มาใช้กันโดยใช้คำสั่ง

$ curl --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$PROD_SECURE_FILES" >> android/app/my-release-key.keystore

ที่อยู่ใน before_script เพียงเท่านั้นนี้เราก็จะได้ไฟล์ keystore ที่เราอัพโหลดเก็บไว้ใน secure file มาใช้งานแล้ว

นำไปประยุกต์ใช้งานกันได้ตามนะจ๊ะ... :)

อ่านเพิ่มเติม: https://docs.gitlab.com/ee/ci/secure_files/ และ https://docs.gitlab.com/ee/api/secure_files.html