Boss Jeerapat

Git: GitLab CI/CD pipeline สำหรับโปรเจค iOS

💡บทความนี้จะเขียนในภาพรวมการทำงานของ pipeline ว่าต้องมีอะไรบ้าง และจะเจาะลึกลงไปอีกในแต่ละส่วนในบทความครั้งหน้า

pipeline ใช้เพื่อ build, test รวมถึง deploy โปรเจค จะทำงานทุกครั้งเมื่อเรา commit และ push โค้ดขึ้นไป ตามสคริปต์ที่เราได้กำหนดไว้

หากเราจะใช้งานเจ้าตัว pipline เราจะต้องมีเจ้าพวกนี้ให้พร้อม

1. ไฟล์ .gitlab-ci.yml

2. Runner

3. เครื่อง Mac

ไฟล์ .gitlab-ci.yml

เป็นไฟล์ประเภท yaml ภายในไฟล์ประกอบไปด้วย syntax ที่เป็นคีย์เวิรดของ Gitlab สามารถศึกษาได้ที่

ประกอบไปด้วย keywords ได้แก่ variables, jobs , keywords, global keywords, header keywords

สร้างไฟล์ .gitlab-ci.yml ไว้ภายในโปรเจคที่โฟล์เดอร์ข้างนอกสุด ระดับเดียวกับไฟล์ project.xcodeproj 💡pipeline จะถูกสร้างจาก job ที่เราเขียนไว้ในไฟล์ 💡 ไม่ต้องกลัวว่าเราจะเขียนผิด เราสามารถเช็ค systax ได้ที่เมนู Build -> Pipeline editor -> แท็บ Validate -> Lint CI/CD sample -> วางโค้ด yaml -> Validate

# This file is a template, and might need editing before it works on your project. # You can copy and paste this template into a new `.gitlab-ci.yml` file. # You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword. # # To contribute improvements to CI/CD templates, please follow the Development guide at: # https://docs.gitlab.com/development/cicd/templates/ # This specific template is located at: # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Swift.gitlab-ci.yml # Lifted from: https://about.gitlab.com/2016/03/10/setting-up-gitlab-ci-for-ios-projects/ # This file assumes an own GitLab CI runner, setup on a macOS system. stages: - build - test - archive - deploy build_project: stage: build script: - xcodebuild clean -project My\ Map.xcodeproj -scheme My\ Map - xcodebuild build-for-testing -project My\ Map.xcodeproj -scheme My\ Map -destination id=3767AAB7-40C0-4AD7-B7B5-C996F5461325 tags: - ios_11-3 - xcode_9-3 - macos_10-13 # archive_project: # stage: archive # script: # - xcodebuild clean archive -archivePath build/My\ Map -scheme My\ Map # - xcodebuild -exportArchive -exportFormat ipa -archivePath "build/My\ Map.xcarchive" -exportPath "build/My\ Map.ipa" -exportProvisioningProfile "ProvisioningProfileName" # rules: # - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # artifacts: # paths: # - build/ProjectName.ipa # tags: # - ios_11-3 # - xcode_9-3 # - macos_10-13 # deploy: # stage: deploy # script: echo "Define your deployment script!" # environment: production

ตัวอย่างด้านบนเป็นสคริปต์ไว้รันกับโปรเจคส่วนตัว ชื่อโปรเจค “My Map” ซึ่งมีทั้งหมด 1 job ได้แก่ build_project

ภายใต้ script: จะคลีนโปรเจคของเราจากนั้นจะบิวด์โปรเจคของเราต่อ (ใช้ Xcode command line)

คีย์เวิรด stages คือ Global keyword ตามเอกสารของ git ที่ไว้กำหนดวิธีการรัน pipeline ซึ่ง stages จะหมายถึงให้ทำงานตาม job ที่เรียงไว้ตามนี้ นอกจากนี้ยังมี global keywords อื่นๆ อีก เช่น

- default: ให้เราสามารถกำหนด global keyword เองได้ แล้วคีย์เวิร์ดเหล่านี้จะถูกใช้งานกับทุก job หากภายใน job มีคีย์เวิร์ดที่ซ้ำกัน default keyword จะไม่ถูกใช้งานภายใน job นั้นๆ

- include: import config จากไฟล์ .yml อื่น

- workflow จะเป็นตัวควบคุมสำหรับ pipeline ตัวอย่างตามสคริปต์ด้านล่าง

workflow: auto_cancel: on_new_commit: interruptible job1: interruptible: true script: sleep 60 job2: interruptible: false # Default when not defined. script: sleep 60

จะหมายความว่าเมื่อเรา push โค้ดของเราขึ้นไป pipeline จะรัน job1 และ job2

และหากเรา push โค้ดอีก จะมีแค่ job1 ที่ถูกยกเลิก

อาจจะไม่ต้องเขียนตามนี้ก็ได้ แต่แนะนำให้ใส่คีย์เวิร์ด tags ภายใต้ job ไว้ด้วย เนื่องจากตัว Git Runner จะเข้ามาอ่าน tags พวกนี้ (แต่ก็สามารถตั้งค่า Git runner ทำงาน job ที่ไม่มี tags ก็ได้เช่นกัน)

สร้าง Runner

pipeline พึ่งพา runner ในการ trigger ให้ทำงาน โดยวิธีการสร้างสามารถไปที่เมนูของโปรเจค Settings -> CI/CD -> Runners -> Create project runner

ใส่ Tags ของ job ลงไปและตั้ง Maximum job timeout แล้วคลิกปุ่ม Create runner

หน้าเว็บจะพาเรามาให้ Register runner โดยปกติแล้ว Linux จะเป็นค่าเริ่มต้นของ runner (ไม่มี macOS)

เราจำเป็นต้องใช้เครื่องส่วนตัวหรือ local ของเราเพื่อ register runner

ให้เราคลิกที่ How do i install Gitlab Runner? จะแสดงหน้าต่างด้านขวาให้เราใช้คำสั่งติดตั้ง โดยต้องเลือก Architecture ของเครื่อง local เราให้ถูกต้อง ของผู้เขียนจะเป็น arm64 คำสั่งติดตั้งจะเป็น

# Download the binary for your system sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-arm64 # Give it permission to execute sudo chmod +x /usr/local/bin/gitlab-runner # The rest of the commands execute as the user who will run the runner # Register the runner (steps below), then run cd ~ gitlab-runner install gitlab-runner start

เมื่อติดตั้งเสร็จแล้วให้ย้อนกลับไปดู Step 1 คัดลอกคำสั่งไปที่ terminal ของเครื่อง local แล้ววางและ enter เพื่อ register

ตัว gitlab-runner จะให้เราใส่ url ของ instance ให้เรากด enter ได้เลย

และจะถามด้วยว่าจะให้ใช้ executer แบบใด (จำไม่ค่อยได้แล้ว) ให้เราเลือก shell ไป เสร็จแล้วให้ใช้คำสั่ง

gitlab-runner run

เพื่อสตาร์ทตัว gitlab-runner ให้ทดลอง commit และ push โค้ดโปรเจคที่สามารถบิวด์ได้ขึ้นไปจะเห็นว่า job กำลัง running ที่เมนู Build -> pipelines ของโปรเจค gitlab ของเรา