fastlane กับ dotenv แก้ code ซ้ำ ๆ
Environments ของโปรเจคมีเยอะเหลือเกิน สะท้อนออกมาที่ build configurations หรือ schema ของโปรเจค ที่นี้พอจะใช้ fastlane ก็เลยมี lanes เยอะตาม
ยกตัวอย่างที่ผมเจอที่ลดจากตอนแรกแล้ว
- Debug เป็นสำหรับ build, run ใน simulator หรือเครื่องจริง
- UAT, SIT เอาขึ้น AppStore หรือ Crashlytics Beta
- Production ภายใน
- SIT, Production ของจริง
เพราะแต่ละแบบใช้ Provisioning Profiles ต่างชนิดกัน เลยตั้ง build configuration ต่างกันด้วย ย้อนกลับไปอ่านได้ที่
แต่สิ่งที่ทำเหมือนกันคือ
- Build ตามแต่ละ config
- จัดเก็บใน artifactory อาจจะเป็น git release ก็ได้
- ปล่อยขึ้น AppStore หรือ Crashlytics Beta
หลังจากเรารู้แล้วว่าสิ่งที่เหมือนกันอยู่กันไหน เราก็สามารถแยกสิ่งที่ไม่เหมือนกันออกมาได้ และรวมสิ่งที่เหมือนกันไว้ด้วยกัน
ไปดู code ตัวอย่างแบบซ้ำ ๆ แล้วแยกกันตาม configuration กันเลยครับ
ซึ่งพอไฟล์มันยาว ๆ มาก ๆ เพราะต้องรองรับทุก build configuration เลยใช้วิธีการสร้างไฟล์แยกหลาย ๆ ไฟล์ แล้ว import ไว้ที่ Fastfile
import(“Match.Fastfile”)
import(“Fastfile.Beta”)
import(“Fastfile.UAT”)
import(“Fastfile.Production”)
import(“Plugin.Fastfile”)
สำหรับถ้าใครไปวิธีนี้ให้ระวังตั้งชื่อ lane ซ้ำ และ แต่ละ lane ต้องอยู่ข้างใน
ที่ทุกไฟล์มีชื่อว่า Fastfile
เพราะว่าตัว Visual Studio Code ที่ติดตั้ง extension iOS Common Files
แล้วจะหยิบเป็นภาษา Ruby มาให้อัตโนมัติ
platform ios do:
# CODE...
end
นะครับ เดี๋ยวจะหา lane กันไม่เจอ
ไปดูตัวที่ถูก normalize ด้วย .env แล้วกัน
จะเห็นได้ว่ามันเหลือ lane เดียว แล้วใช้เป็น environment variables หมดเลย แล้วเราไป set ได้ที่ไหนหละ
ถ้าปกติก็ไปก็ใช้คำสั่งใน command line เช่น export BUILD_CONFIGURATUIB=Debug
ใส่ทุกคำสั่งคงเหนื่อยแย่
หรือถ้า CI ตัวที่ผมใช้คือ JENKINS ก็สามารถตั้ง environment variables ได้ ถ้าไม่ต้องการเก็บไว้ใน code
แต่ตอนนี้ยังขี้เกียจอยู่เลยไว้กับ source code เลยแล้วกัน แล้วสร้างไฟล์ .env
ซึ่งเป็นไฟล์ default ของ dotenv แปลว่าถ้าอะไรที่เหมือนกัน ๆ สามารถระบุไว้ใน file นี้เลย แล้วไฟล์อื่น ๆ ก็ override เอา
นี่คือตัวอย่างของไฟล์ .env
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8SLACK_URL=https://hooks.slack.com/services/...# TODO: All these please keep secret this is workaround.
# For example please keep in jenkins variables.
CRASHLYTICS_API_TOKEN=35f9b26f30ab7cc32668f2a2c06bf5d331ba56cc
CRASHLYTICS_BUILD_SECRET=f2c8c90a134fdca6c9c68731f41454678485784db27328661e17dd15e53db1a9APPLE_ID=mail@domain.com
FASTLANE_PASSWORD=appleIDP@SSW0RD# TODO: This is not good for security please find other solution
GIT_SSL_NO_VERIFY=trueENSURE_GIT_BRANCH="master|release|hotfix|test"
BUILD_CONFIGURATION=Debug
EXPORT_METHOD=developmentAPP_IDENTIFIER="com.main.app"
APP_PROVISIONING_PROFILE="match Development com.main.app"
APP_NOTIFICATION_EXTENSION_ID="com.main.app.extension"
APP_NOTIFICATION_EXTENSION_PROVISIONING_PROFILE="match Development com.main.app.extension"
สำหรับชื่อไฟล์ที่แนะนำให้ไปอ่านที่ https://github.com/bkeepers/dotenv#frequently-answered-questions บางไฟล์เราไม่ควร commit ไปด้วย ก็ควรใส่ไว้ใน .gitignore
ไว้เลย แต่ยังสามารถสร้างไฟล์ตัวอย่างได้เช่น .env.template
แล้วใส่ KEY ของ environment variables เอาไว้ให้กรอกเอาเอง
เวลาเราใช้ fastlane เราก็ระบุ environment ไปด้วย ตามชื่อไฟล์เลย เช่นไฟล์ชื่อ .env.my-production
ก็ใช้คำสั่ง [bundle exec] fastlane build --env my-production
สำหรับการวางไฟล์ จะวางไว้ใน folder fastlane
หรือข้างนอกก็ได้ เดี๋ยวมันจะวิ่งย้อนออกไปหาเอง
สำหรับการติดตั้ง dotenv
สามารถระบุ dotenv-rails
ไว้ใน Gemfile
ได้เลย
source "https://rubygems.org"gem "fastlane"
gem "dotenv-rails"
สามารถย้อนกลับไปอ่านเกี่ยวกับ Gemfile
ได้ที่
สวัสดีครับ 🙏🏽