fastlane กับ dotenv แก้ code ซ้ำ ๆ

Wasith T. (Bai-Phai)
odds.team
Published in
2 min readAug 29, 2019

Environments ของโปรเจคมีเยอะเหลือเกิน สะท้อนออกมาที่ build configurations หรือ schema ของโปรเจค ที่นี้พอจะใช้ fastlane ก็เลยมี lanes เยอะตาม

https://www.flickr.com/photos/southtopia/7510644690

ยกตัวอย่างที่ผมเจอที่ลดจากตอนแรกแล้ว

  • Debug เป็นสำหรับ build, run ใน simulator หรือเครื่องจริง
  • UAT, SIT เอาขึ้น AppStore หรือ Crashlytics Beta
  • Production ภายใน
  • SIT, Production ของจริง

เพราะแต่ละแบบใช้ Provisioning Profiles ต่างชนิดกัน เลยตั้ง build configuration ต่างกันด้วย ย้อนกลับไปอ่านได้ที่

แต่สิ่งที่ทำเหมือนกันคือ

  1. Build ตามแต่ละ config
  2. จัดเก็บใน artifactory อาจจะเป็น git release ก็ได้
  3. ปล่อยขึ้น 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-8
SLACK_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=f2c8c90a134fdca6c9c68731f41454678485784db27328661e17dd15e53db1a9
APPLE_ID=mail@domain.com
FASTLANE_PASSWORD=appleIDP@SSW0RD
# TODO: This is not good for security please find other solution
GIT_SSL_NO_VERIFY=true
ENSURE_GIT_BRANCH="master|release|hotfix|test"
BUILD_CONFIGURATION=Debug
EXPORT_METHOD=development
APP_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 ได้ที่

สวัสดีครับ 🙏🏽

--

--

Wasith T. (Bai-Phai)
odds.team

ตบมือเป็นกำลังใจให้ผมด้วยนะครับ 😘