มีงานซ้ำๆ ที่เราต้องทำทุกวัน ซึ่งอาจน่าเบื่อ ยาก และน่าเบื่อหน่าย
แทนที่จะทำงานเหล่านั้นเอง คุณสามารถมอบหมายให้คนอื่นหรือระบบอัตโนมัติทำให้ คุณจะมีเวลาทำสิ่งที่อยากทำและพักผ่อนได้
หากเคยพัฒนาแอป Android คุณจะรู้ว่างานบางอย่างน่าเบื่อมาก:
- รันการทดสอบ
- ตรวจสอบว่าแอปคอมไพล์ได้เมื่อ merge โค้ดใหม่
- สร้างและเผยแพร่แอปพลิเคชัน
ควรมอบหมายให้ใคร? เพื่อนร่วมงาน? พวกเขาก็จะส่งต่อให้คนอื่น และไม่ได้ช่วยให้ใครมีเวลาว่างขึ้น ไม่ควรทำให้เพื่อนร่วมงานผิดหวัง วิธีแก้คือ GitHub Actions 👐
GitHub Actions คืออะไร?
GitHub Actions คือคำสั่งที่เราสามารถทริกเกอร์เมื่อมีเหตุการณ์เกิดขึ้นใน repository โดยปืนฐาน Action คือไฟล์การตั้งค่า YAML (.yml) ที่มีรายการคำสั่งอธิบายว่า:
- ต้องทำอะไร
- เมื่อใดควรทำ
ตัวอย่างไฟล์ YAML:
name: My GitHub Action on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1แยกวิเคราะห์ตัวอย่าง:
- ตั้งชื่อ action (My GitHub Action) [Optional]
- ระบุเมื่อ action ควรทำงาน (เมื่อ pull request ถูกเปิด)
- เริ่มรายการงาน (jobs) ที่ควรเกิดขึ้นเมื่อ action ถูกทริกเกอร์
- งานแรกคือ build
- runs-on บอก GitHub ว่า runner ไหนจะรัน job นี้ (virtual server เลือก Windows/Mac/Linux)
- แต่ละ job มีหลายขั้นตอน จัดกลุ่มด้วย keyword steps
- uses บอกสคริปต์ว่าให้ทำ action อะไร
นี่เป็นตัวอย่างสั้น ไม่แสดงฟีเจอร์ทั้งหมด แต่แสดงโครงสร้างไฟล์ตั้งค่า
ต่อไปเราจะสร้าง actions ที่ช่วยให้รอบการพัฒนาประสิทธิภาพและมีประสิทธิผล
โปรดทราบว่าไฟล์ GitHub Actions ทั้งหมดต้องอยู่ในโฟลเดอร์ .github/workflows ของโปรเจกต์:

สร้าง GitHub Action สำหรับ Pull Requests
ไม่ว่าคุณจะทำงานคนเดียวหรือทีม การรับรองว่าแอปพลิเคชันเสถียรเป็นสิ่งสำคัญ จึงควรตรวจสอบว่าแอปคอมไพล์ได้และทดสอบผ่านทุกครั้งก่อน merge pull request
เราได้แสดงวิธี checkout โค้ดแล้ว ใน action นี้เราจะเพิ่มขั้นตอน:
- ตั้งค่า JDK version
- เปลี่ยน permission สำหรับ virtual environment
- รันการทดสอบ (ถ้ามี)
- สร้างแอปพลิเคชัน
name: Android Build on: pull_request jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Set Up JDK // 1 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Change wrapper permissions // 2 run: chmod +x ./gradlew - name: Run Tests // 3 run: ./gradlew test - name: Build Project // 4 run: ./gradlew assembleแต่ละขั้นตอนมี properties และ attributes เฉพาะตัว ไม่ได้ลงรายละเอียดแต่ละอย่าง เพราะคุณอ่านเอกสารได้เอง สิ่งที่เหมือนกันในส่วนใหญ่คือ keyword run ที่ระบุคำสั่งที่จะรัน
✋ ขั้นตอนที่ 2 จำเป็น เพื่อให้ virtual environment รันคำสั่ง gradle ได้ มิฉะนั้นจะไม่ทำงาน
สร้าง GitHub Action สำหรับเผยแพร่แอปพลิเคชัน
หลังจากเผยแพร่แอปครั้งแรก การเผยแพร่ซ้ำกลายเป็นงานน่าเบื่อ ต้องอัปเกรด version สร้าง APK ส่งผ่าน Google Play Console ฯลฯ
เราสามารถทำให้อัตโนมัติด้วย GitHub action อีกตัวหนึ่ง ซึ่งซับซ้อนกว่าเดิม เพราะต้องใช้ GitHub Secrets
GitHub Secrets คือวิธีเก็บข้อมูลสำคัญเป็น environment variables ของ repository เราต้องใช้เพราะ:
- ต้องเซ็นแอปพลิเคชัน
- ให้ action มีสิทธิ์ส่งแอปที่สร้างขึ้นไปที่ Google Play Store
มาดูวิธีสร้าง GitHub Secrets:
- ในหน้าหลัก repository คลิกแท็บ Settings

- เมนูซ้ายมีตัวเลือก Secrets

- กดปุ่ม New repository secret เพื่อสร้าง secret

ดูสคริปต์สำหรับเผยแพร่แอป:
name: Android Publish on: workflow_dispatch: jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Set Up JDK uses: actions/setup-java@v1 with: java-version: 1.8 - name: Change wrapper permissions run: chmod +x ./gradlew - name: Run Tests run: ./gradlew test - name: Build Project run: ./gradlew build - name: Build Release AAB // 1 run: ./gradlew bundleRelease - name: Sign AAB // 2 uses: r0adkll/sign-android-release@v1 with: releaseDirectory: app/build/outputs/bundle/release signingKeyBase64: ${{ secrets.SIGN_KEY }} alias: ${{ secrets.ALIAS }} keyStorePassword: ${{ secrets.STORE_KEY_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD }} - name: Deploy to Play Store // 3 uses: r0adkll/upload-google-play@v1 with: serviceAccountJsonPlainText: ${{secrets.SERVICE_ACCOUNT}} packageName: com.tomerpacific.laundry releaseFiles: app/build/outputs/bundle/release/app-release.aab track: productionสังเกตว่า action นี้รัน on workflow_dispatch หมายถึงสามารถทริกเกอร์ด้วยตนเองจาก GitHub ได้ คุณสามารถตั้งให้รันเมื่อ push ไปที่ main branch ก็ได้
ขั้นตอนที่ 1 สร้าง .aab ของแอป ต่อมาเซ็น .aab เหมือนตอน build ใน Android Studio นี่คือครั้งแรกที่ใช้ GitHub Secrets ต้องสร้าง secrets สำหรับ:
- Signing Key (secrets.SIGN_KEY)
- Key Alias (secrets.ALIAS)
- Store Key Password (secrets.STORE_KEY_PASSWORD)
- Key Password (secrets.KEY_PASSWORD)
หลังเซ็น .aab แล้ว สามารถ deploy ไป Google Play Store ได้ ขั้นตอนนี้ต้องทำเพิ่มเติม ให้ GitHub Action มีสิทธิ์ deploy แอปให้เราบน Google Play โดยใช้ Service Account
สร้าง Service Account
Service account คือ entity ที่คุณสร้างขึ้น เพื่อบอกบริการหรือแอปพลิเคชันที่มันโต้ตอบว่า มันทำงานแทนคุณ
ในกรณีนี้ GitHub Action จะโต้ตอบกับ Google Play Store เพื่ออัปโหลด version ใหม่ของแอป
ไปที่ Google Cloud Console สร้างบัญชีหากยังไม่มี เมนูซ้ายมี Service Accounts

คลิกแล้วจะเห็น service accounts ที่มีอยู่ ด้านขวาบนมีปุ่มสร้างใหม่

กรอกชื่อและคำอธิบาย service account

ชื่อที่นี่จะเป็น unique identifier ขั้นตอนที่ 2 ให้ role จาก dropdown Select A Role เลือก Basic → Editor

ขั้นตอนที่ 3 กรอกอีเมลในทั้งสองช่องภายใต้ "Grant users access to this service account"

กด Done แล้วต้องสร้าง key ให้ service account Action จะใช้ key นี้เพื่อระบุตัวตนกับ Google Play
คลิกสามจุดแนวนอนใต้ Actions ในหน้า service account หลัก เลือก Manage keys

สร้าง key ใหม่โดยกด New Key เลือก "Create new key"

เลือก format JSON (default) แล้ว Create

ไฟล์จะดาวน์โหลดมาเก็บไว้ เนื่องจากดาวน์โหลดได้ครั้งเดียว ให้เอาเนื้อหาไฟล์สร้าง GitHub secret (secrets.SERVICE_ACCOUNT)
สุดท้าย ทำให้ Google Play รู้จัก service account โดย login Google Play Console ไปที่ Setup → API Access
เลื่อนลงมาหัวข้อ Service Accounts คลิก Grant Access

ในการตั้งค่า ไปที่ App permissions เลือกแอปที่ service account จะโต้ตอบ ใน Account permissions ทุกอย่างภายใต้ releases ควรติ๊กถูก สามารถตรวจสอบการตั้งค่าอื่นๆ ได้ กด Invite user มุมขวาล่าง

หลังส่งคำเชิญแล้ว สามารถรัน action เผยแพร่ได้
ตรวจสอบ Actions ใน GitHub
คลิกแท็บ Actions เพื่อดู workflows ที่กำหนดและที่รันแล้ว

ซ้ายแสดง actions ที่กำหนด ขวาแสดง actions ที่รันแล้ว คลิกดูรายละเอียดแต่ละ action ได้

ถ้า action ตั้งค่า workflow_dispatch จะมีปุ่ม Run workflow (เห็นในภาพ)
ดูการรันเฉพาะ workflow ได้จากหน้า Workflows หลัก โดยคลิกที่การรันนั้น หาก action ล้มเหลว นี่คือที่สำรวจสาเหตุ
Action แรกควรทริกเกอร์เมื่อ pull request เปิด ถ้าทำงานถูกต้องจะเห็น:

สรุป
อ่านมายาว แต่เราได้ผ่านทุกอย่างที่ต้องการสำหรับเริ่มสร้าง CI/CD pipeline สำหรับแอปพลิเคชัน
สนใจดู GitHub Actions ตั้งค่าอย่างไร ดูได้ใน repository ของผม:
Actions · TomerPacific/LaundrySymbolsAn application written in Kotlin showing the different laundry symbols with an explanation :cyclone: - Actions · TomerPacific/LaundrySymbols
TomerPacificGitHub
อ่านเพิ่มเติมเกี่ยว GitHub Actions:
GitHub Actions Documentation - GitHub DocsAutomate, customize, and execute your software development workflows right in your repository with GitHub Actions. You can discover, create, and share actions to perform any job you’d like, including CI/CD, and combine actions in a completely customized workflow.
GitHub Docs