summaryrefslogtreecommitdiff
path: root/Meta/Azure/Serenity.yml
blob: 680d8a58ca77c7b71f3058adf0468ecc93ffaa75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
parameters:
  arch: 'i686'
  coverage: 'OFF'

jobs:
  - job: 'Serenity_Clang_${{ parameters.arch }}_Coverage_${{ parameters.coverage }}'
    timeoutInMinutes: 0 # Setting to 0 means the maximum allowed timeout is used.

    variables:
    - name: LLVM_CCACHE_DIR
      value: $(Build.SourcesDirectory)/Toolchain/.ccache
    - name: LLVM_CCACHE_MAXSIZE
      value: 20GB
    - name: SERENITY_CCACHE_DIR
      value: $(Build.SourcesDirectory)/.ccache

    pool:
      vmImage: ubuntu-22.04

    steps:
    - template: Setup.yml
      parameters:
        os: 'Serenity'

    - template: Caches.yml
      parameters:
        arch: '${{ parameters.arch }}'
        coverage: '${{ parameters.coverage }}'
        toolchain: 'clang'
        build_directory: 'Build/${{ parameters.arch }}clang'
        toolchain_ccache_path: '$(LLVM_CCACHE_DIR)'
        toolchain_ccache_size: '$(LLVM_CCACHE_MAXSIZE)'
        serenity_ccache_path: '$(SERENITY_CCACHE_DIR)'

    - script: ./Toolchain/BuildClang.sh --ci
      displayName: Extract Toolchain
      env:
        TRY_USE_LOCAL_TOOLCHAIN: 'y'

    - script: |
        mkdir -p Build/superbuild
      displayName: 'Create Build Directory'

    - script: |
        cmake -S Meta/CMake/Superbuild -B Build/superbuild -GNinja \
          -DSERENITY_ARCH=${{ parameters.arch }} \
          -DSERENITY_TOOLCHAIN=Clang \
          -DENABLE_UNDEFINED_SANITIZER=ON \
          -DENABLE_USERSPACE_COVERAGE_COLLECTION=${{ parameters.coverage }} \
          -DENABLE_PCI_IDS_DOWNLOAD=OFF \
          -DENABLE_USB_IDS_DOWNLOAD=OFF \
          -DCMAKE_C_COMPILER=gcc-11 \
          -DCMAKE_CXX_COMPILER=g++-11
      displayName: 'Create Build Environment'
      workingDirectory: $(Build.SourcesDirectory)
      env:
        CCACHE_DIR: '$(SERENITY_CCACHE_DIR)'

    - script: |
        cmake --build ./Build/superbuild
      displayName: 'Build'
      workingDirectory: $(Build.SourcesDirectory)
      env:
        CCACHE_DIR: '$(SERENITY_CCACHE_DIR)'

    - script: |
        ninja install && ninja image
      displayName: 'Create RootFS'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang

    - script: |
        ninja run

        echo "##[group]Verify Output File"
        mkdir fsmount
        sudo mount -t ext2 -o loop,rw _disk_image fsmount

        echo "Results: "
        sudo cat fsmount/home/anon/test-results.log
        echo "##[endgroup]"

        if ! sudo grep -q "Failed: 0" fsmount/home/anon/test-results.log
        then
          echo "##[error]:^( Tests failed, failing job"
          exit 1
        fi
        sudo umount fsmount
      displayName: 'Test'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang
      timeoutInMinutes: 60
      env:
        SERENITY_QEMU_CPU: 'max,vmx=off'
        SERENITY_KERNEL_CMDLINE: 'fbdev=off panic=shutdown system_mode=self-test'
        SERENITY_RUN: 'ci'

    - script: |
        [ ! -e debug.log ] || cat debug.log
      displayName: 'Print Target Logs'
      workingDirectory: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang
      condition: failed()

    - ${{ if eq(parameters.coverage, 'ON') }}:
      - script: |
          ./Meta/analyze-qemu-coverage.sh
        displayName: 'Aggregate Coverage Results'
        workingDirectory: $(Build.SourcesDirectory)
        env:
          SERENITY_TOOLCHAIN: Clang
          SERENITY_ARCH: ${{ parameters.arch }}

      # FIXME: Deploy the static html pages somewhere
      # FIXME: Alter script to also (instead?) produce a raw coverage.txt file for ingestion into sonar cloud
      # Note: tmp_profile_data/Coverage.profdata has the entire combined profile data, but creating the raw txt requires
      #       all of the instrumented binaries and the profdata file.
    - ${{ if eq(parameters.coverage, 'ON') }}:
      - task: PublishPipelineArtifact@1
        inputs:
          targetPath: $(Build.SourcesDirectory)/Build/${{ parameters.arch }}clang/reports
          artifactType: 'pipeline'
          artifactName: 'Coverage'


    - script: |
        echo "##[section]Toolchain Cache"
        CCACHE_DIR='$(LLVM_CCACHE_DIR)' ccache -s

        echo "##[section]Serenity Cache"
        CCACHE_DIR='$(SERENITY_CCACHE_DIR)' ccache -s
      displayName: 'Cache Stats'