| # Reusable Cobalt CI workflow. |
| |
| name: main |
| |
| on: |
| workflow_call: |
| inputs: |
| platform: |
| description: 'Cobalt platform.' |
| required: true |
| type: string |
| nightly: |
| description: 'Nightly workflow.' |
| required: true |
| type: string |
| default: 'false' |
| modular: |
| description: 'Whether this is a modular build.' |
| required: false |
| type: boolean |
| default: false |
| |
| # Global env vars. |
| env: |
| REGISTRY: ghcr.io |
| IPV6_AVAILABLE: 0 |
| LANG: en_US.UTF-8 |
| IS_BUILDBOT_DOCKER: 1 |
| #BUILD_ID_SERVER_URL: |
| IS_CI: 1 |
| IS_DOCKER: 1 |
| NINJA_STATUS: '[%e sec | %f/%t %u remaining | %c/sec | j%r]' |
| SCCACHE: 1 |
| SCCACHE_GCS_BUCKET: cobalt-actions-sccache-windows |
| SCCACHE_GCS_OAUTH_URL: http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token |
| SCCACHE_GCS_RW_MODE: READ_WRITE |
| SCCACHE_IDLE_TIMEOUT: 0 # prevent sccache server from shutting down after long idle. |
| STARBOARD_TOOLCHAINS_DIR: /root/starboard-toolchains |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event_name }}-${{ inputs.platform }} @ ${{ github.event.label.name || github.event.pull_request.number || github.sha }} @ ${{ github.event.label.name && github.event.pull_request.number || github.event.action }} |
| cancel-in-progress: true |
| |
| # A workflow run is made up of one or more jobs that can run sequentially or in parallel |
| jobs: |
| # Generates build matrix based on json configuration file. |
| initialize: |
| runs-on: ubuntu-latest |
| permissions: |
| pull-requests: write |
| env: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| GITHUB_PR_REPO_URL: ${{ github.event.pull_request.base.repo.url }} |
| GITHUB_EVENT_NUMBER: ${{ github.event.number }} |
| # All triggers except draft PRs, unless PR is labeled with runtest |
| if: | |
| github.event.action != 'labeled' || |
| github.event.pull_request.merged == false && |
| ( |
| github.event.action == 'labeled' && |
| github.event.label.name == 'runtest' || |
| github.event.label.name == 'on_device' |
| ) |
| timeout-minutes: 10 |
| steps: |
| - id: Checkout |
| uses: kaidokert/checkout@v3.5.999 # Temporary version |
| with: |
| fetch-depth: 1 |
| persist-credentials: false |
| - name: Remove runtest if exists |
| if: github.event_name == 'pull_request' |
| continue-on-error: true # Ignore this step if we cannot remove the label. |
| run: | |
| set +e |
| curl \ |
| -X DELETE \ |
| -H "Accept: application/vnd.github+json" \ |
| -H "Authorization: Bearer ${GITHUB_TOKEN}" \ |
| ${GITHUB_PR_REPO_URL}/issues/${GITHUB_EVENT_NUMBER}/labels/runtest |
| shell: bash |
| - id: set-platforms |
| shell: bash |
| run: | |
| platforms=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -c '.platforms') |
| echo "platforms=${platforms}" >> $GITHUB_ENV |
| - id: set-includes |
| shell: bash |
| run: | |
| includes=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -c '.includes') |
| echo "includes=${includes}" >> $GITHUB_ENV |
| - id: set-on-device-test |
| shell: bash |
| run: | |
| on_device_test=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.on_device_test.enabled') |
| echo "on_device_test=${on_device_test}" >> $GITHUB_ENV |
| - id: set-on-host-test |
| shell: bash |
| run: | |
| on_host_test=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.on_host_test') |
| echo "on_host_test=${on_host_test}" >> $GITHUB_ENV |
| - id: set-on-host-test-shards |
| shell: bash |
| run: | |
| on_host_test_shards=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -c '.on_host_test_shards') |
| echo "on_host_test_shards=${on_host_test_shards}" >> $GITHUB_ENV |
| - id: set-docker-service |
| shell: bash |
| run: | |
| docker_service=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.docker_service') |
| echo "docker_service=${docker_service}" >> $GITHUB_ENV |
| - id: set-docker-runner-service |
| shell: bash |
| run: | |
| docker_runner_service=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.docker_runner_service') |
| echo "docker_runner_service=${docker_runner_service}" >> $GITHUB_ENV |
| - id: set-runner-tag |
| shell: bash |
| run: | |
| runner_tag=$(cat ${GITHUB_WORKSPACE}/.github/config/${{ inputs.platform }}.json | jq -rc '.runner_tag') |
| echo "runner_tag=${runner_tag}" >> $GITHUB_ENV |
| outputs: |
| platforms: ${{ env.platforms }} |
| includes: ${{ env.includes }} |
| on_device_test: ${{ env.on_device_test }} |
| on_host_test: ${{ env.on_host_test }} |
| on_host_test_shards: ${{ env.on_host_test_shards }} |
| docker_service: ${{ env.docker_service }} |
| docker_runner_service: ${{ env.docker_runner_service }} |
| runner_tag: ${{ env.runner_tag }} |
| # Build windows docker images. |
| build-docker-image: |
| needs: [initialize] |
| permissions: |
| packages: write |
| runs-on: windows-2019 |
| timeout-minutes: 120 |
| steps: |
| - name: Checkout files |
| uses: kaidokert/checkout@v3.5.999 |
| with: |
| fetch-depth: 0 |
| persist-credentials: false |
| - name: Login to Docker Registry ${{env.REGISTRY}} |
| uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a # v2.1.0 |
| with: |
| registry: ${{ env.REGISTRY }} |
| username: ${{ github.actor }} |
| password: ${{ secrets.GITHUB_TOKEN }} |
| - name: Build docker image |
| id: build-docker-image |
| uses: ./.github/actions/docker_win |
| with: |
| service: ${{ needs.initialize.outputs.docker_service }} |
| - name: Build runner docker image |
| id: build-runner-docker-image |
| uses: ./.github/actions/docker_win |
| with: |
| service: ${{ needs.initialize.outputs.docker_runner_service }} |
| # Runs builds. |
| build: |
| needs: [initialize] |
| permissions: {} |
| runs-on: [self-hosted, "${{ needs.initialize.outputs.runner_tag }}"] |
| name: ${{matrix.name}}_${{matrix.config}} |
| strategy: |
| fail-fast: false |
| matrix: |
| platform: ${{ fromJson(needs.initialize.outputs.platforms) }} |
| include: ${{ fromJson(needs.initialize.outputs.includes) }} |
| config: [devel, debug, qa, gold] |
| timeout-minutes: 90 |
| steps: |
| - name: Checkout |
| uses: kaidokert/checkout@v3.5.999 |
| with: |
| # Use fetch depth of 0 to get full history for a valid build id. |
| fetch-depth: 0 |
| persist-credentials: false |
| - name: GN |
| uses: ./.github/actions/gn |
| - name: Build Cobalt |
| uses: ./.github/actions/build |
| - name: Upload Nightly Artifacts |
| if: ${{ ( inputs.nightly == 'true' || github.event_name == 'schedule' ) && matrix.config != 'debug' }} |
| uses: ./.github/actions/upload_nightly_artifacts |
| - name: Upload On Host Test Artifacts |
| if: ${{ matrix.config == 'devel' && needs.initialize.outputs.on_host_test == 'true' }} |
| uses: ./.github/actions/upload_test_artifacts |
| with: |
| type: onhost |
| os: windows |
| |
| # Runs on the host unit and integration tests. |
| on-host-test: |
| needs: [initialize, build] |
| permissions: {} |
| if: needs.initialize.outputs.on_host_test == 'true' |
| runs-on: [self-hosted, "${{ needs.initialize.outputs.runner_tag }}"] |
| name: ${{matrix.name}}_${{matrix.shard}}_test |
| strategy: |
| fail-fast: false |
| matrix: |
| platform: ${{ fromJson(needs.initialize.outputs.platforms) }} |
| shard: ${{ fromJson(needs.initialize.outputs.on_host_test_shards) }} |
| config: [devel] |
| include: ${{ fromJson(needs.initialize.outputs.includes) }} |
| env: |
| MODULAR_BUILD: ${{ inputs.modular && 1 || 0 }} |
| timeout-minutes: 90 |
| steps: |
| - name: Checkout |
| uses: kaidokert/checkout@v3.5.999 |
| with: |
| fetch-depth: 1 |
| persist-credentials: false |
| - name: Run Tests |
| uses: ./.github/actions/on_host_test |
| with: |
| os: windows |