Section 9/131 menit

9. Integrasi dengan CI/CD

9. Integrasi dengan CI/CD

XcodeGen di Xcode Cloud

swift
#!/bin/zsh
# ci_scripts/ci_post_clone.sh

# Install XcodeGen
brew install xcodegen

# Generate project sebelum Xcode Cloud mulai build
cd "$CI_PRIMARY_REPOSITORY_PATH"
xcodegen generate

echo "XcodeGen: project generated successfully"

Tuist di Xcode Cloud / GitHub Actions

swift
#!/bin/zsh
# ci_scripts/ci_post_clone.sh — Xcode Cloud dengan Tuist

# Install mise dan Tuist
curl https://mise.run | sh
~/.local/bin/mise install tuist

# Generate project dengan cache
cd "$CI_PRIMARY_REPOSITORY_PATH"
~/.local/bin/mise exec -- tuist install   # resolve SPM dependencies
~/.local/bin/mise exec -- tuist generate

echo "Tuist: project generated with cache"
swift
# .github/workflows/ios.yml — GitHub Actions dengan Tuist

name: iOS CI
on:
  pull_request:
    branches: [main, develop]

jobs:
  build-and-test:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4

      - name: Install mise
        uses: jdx/mise-action@v2

      - name: Install Tuist
        run: mise install

      - name: Cache Tuist dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.tuist/Cache
            .tuist/Dependencies
          key: ${{ runner.os }}-tuist-${{ hashFiles('Tuist/Package.resolved') }}
          restore-keys: |
            ${{ runner.os }}-tuist-

      - name: Generate Xcode project
        run: tuist install && tuist generate

      - name: Build and test
        run: |
          xcodebuild test \
            -scheme MyApp \
            -destination "platform=iOS Simulator,name=iPhone 15,OS=latest" \
            -resultBundlePath TestResults.xcresult

Bazel di GitHub Actions dengan Remote Cache

swift
# .github/workflows/bazel.yml

name: Bazel CI
on: [push, pull_request]

jobs:
  build-test:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4

      - name: Configure Bazel remote cache
        run: |
          cat >> ~/.bazelrc << EOF
          build:ci --remote_cache=grpcs://remote.buildbuddy.io
          build:ci --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_API_KEY }}
          build:ci --noremote_upload_local_results  # hanya CI yang upload
          EOF

      - name: Build
        run: bazel build //... --config=ci

      - name: Test
        run: bazel test //... --config=ci --test_output=errors