aboutsummaryrefslogtreecommitdiff
path: root/tcwg-llvm-staged-build.yaml
blob: 25c99cafe14f3b9fc3fb87d707bcf87a81349bb7 (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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
- job:
    name: tcwg-llvm-staged-build
    project-type: matrix
    defaults: global
    properties:
        - authorization:
            anonymous:
                - job-read
                - job-extended-read
            linaro:
                - job-build
                - job-cancel
        - build-discarder:
            days-to-keep: 10
            num-to-keep: 10
    parameters:
        - string:
            name: revision
            default: ''
            description: 'SVN revision in the format rNNNNN. Empty string will bring trunk on all repos.'
        - string:
            name: toolchain
            default: ''
            description: 'URL of the toolchain to use. This needs to be a tarball with a /bin directory inside with either GCC or LLVM from make install'
        - string:
            name: build_type
            default: 'Release'
            description: 'Build type. Accepts: Release, RelWithDebInfo, Debug, MinSizeRel'
        - string:
            name: cmake_flags
            default: ''
            description: 'Additional CMake flags, ex. CMAKE_CXX_FLAGS, etc.'
        - string:
            name: build_container_tag
            default: 'xenial'
            description: 'Type of image to use in the container: trusty, xenial.'
        - bool:
            name: twostage
            default: false
            description: 'Whether or not to trigger a second stage with this build.'
        - bool:
            name: testsuite
            default: false
            description: 'Whether or not to trigger a test-suite with this build.'
        - string:
            name: compiler
            default: 'clang'
            description: 'Override the default system compiler. Only used if "toolchain" is empty. Accepts: clang, gcc.'
        - string:
            name: repository
            default: 'https://git-us.linaro.org/toolchain/llvm'
            description: 'Repository to pull changes from.'
        - string:
            name: projects
            default: ''
            description: 'Which projects to build - llvm clang compiler-rt lld libcxx libcxxabi libunwind.'
        - string:
            name: branch
            default: 'master'
            description: 'Which branch to pull from. Need to exist in all projects above, if any selected.'
        - string:
            name: scripts_branch
            default: 'refs/remotes/origin/llvmprod'
            description: 'Branch to pull jenkins-script from'
        - string:
            name: target_list
            default: 'tcwg-x86_64-cam'
            description: 'List of targets -- tcwg-x86_64-cam tcwg-tk1_32-build tcwg-apm_64-build -- should be a subset of slave axis'
    disabled: false
    node: tcwg-coordinator
    retry-count: 3
    concurrent: true
    display-name: 'TCWG LLVM Staged Build'
    scm:
        - git:
            url: http://git-us.linaro.org/toolchain/jenkins-scripts.git
            refspec: +refs/heads/*:refs/remotes/origin/* +refs/changes/*:refs/changes/*
            name: origin
            branches:
                - ${scripts_branch}
            skip-tag: true
            shallow-clone: true
            wipe-workspace: true
    axes:
        - axis:
            type: slave
            name: label
            values:
                - tcwg-x86_64-cam
                - tcwg-tk1_32-build
                - tcwg-apm_64-build
        - axis:
            type: dynamic
            name: target
            values:
                - target_list
    execution-strategy:
        combination-filter: |
            label==target
        sequential: false
    wrappers:
        - timeout:
            timeout: 300
        - timestamps
        - ssh-agent-credentials:
            # tcwg-buildslave user id
            users:
                - 'e0958a95-204f-4c14-a66c-5e2be6c5d50a'
        - build-name:
            name: '#${BUILD_NUMBER}-${GIT_REVISION,length=8}'
    builders:
        - shell: |
            #!/bin/bash
            set -ex

            . jenkins-helpers.sh

            # Select builder arch/type/container
            buildjobs=1
            case ${label} in
                tcwg-x86_64-build|tcwg-x86_64-cam)
                    builder_arch=amd64
                    buildjobs=8 # 1 slot is 32/4
                    ;;
                tcwg-tk1_32-build)
                    builder_arch=armhf
                    buildjobs=4 # TK1s only have 4 cores
                    ;;
                tcwg-apm_64-build)
                    builder_arch=arm64
                    buildjobs=8 # APMs only have 8 cores
                    ;;
                *) echo "ERROR: Unsupported label: $label"; exit 1 ;;
            esac
            linkjobs=${buildjobs}

            # Sets the system compiler
            compiler_option=''
            if [ "${toolchain:+set}" != "set" ] && [ "${compiler:+set}" = "set" ]; then
              compiler_option="--compiler=${compiler}"
            fi

            # Trigger toolchain name
            toolchain_file="${WORKSPACE}/llvm.params.toolchain"
            toolchain_file_option=""
            if ${twostage} || ${testsuite}; then
              toolchain_file_option="--toolchain-file=$toolchain_file"
            fi

            # Start build container
            builder=$(print_host_for_node $NODE_NAME)
            bash ${WORKSPACE}/start-container-docker.sh --arch ${builder_arch} --distro ${build_container_tag} --session-host ${builder} --weight 1 --prefix run_ > build-container.sh

            # Source container logic, set cleanup job
            . ./build-container.sh
            trap "cleanup_all_containers" EXIT

            # Setup job parameters
            RUN=(bash -x ${WORKSPACE}/tcwg-llvm-build.sh \
                --workspace=${WORKSPACE} \
                --buildid=${BUILD_ID} \
                --buildjobs=${buildjobs} \
                --linkjobs=${linkjobs} \
                --revision=${revision} \
                --toolchain=${toolchain} \
                --buildtype=${build_type} \
                --repository=${repository} \
                --branch=${branch} \
                --projects="${projects}" \
                --cmakeflags="${cmake_flags}" \
                $toolchain_file_option $compiler_option)

            # Run the job
            run_container_exec "${RUN[@]}"

            # Chained jobs
            if ${twostage}; then
              # We don't want an infinite chain, 3rd stage is off
              cat << EOF > llvm.params.twostage
              twostage=false
              target_list=${label}
            EOF
              cat $toolchain_file >> llvm.params.twostage

            # If we requested 2 stages and test-suite, only test the 2nd stage
            elif ${testsuite}; then
              echo "target_list=${label}" > llvm.params.testsuite
              cat $toolchain_file >> llvm.params.testsuite

            fi

        - conditional-step:
            condition-kind: file-exists
            condition-filename: llvm.params.twostage
            steps:
                - trigger-builds:
                    - project: 'tcwg-llvm-staged-build'
                      property-file: llvm.params.twostage
                      current-parameters: true
                      block: true

        - conditional-step:
            condition-kind: file-exists
            condition-filename: llvm.params.testsuite
            steps:
                - trigger-builds:
                    - project: 'tcwg-llvm-testsuite'
                      property-file: llvm.params.testsuite
                      current-parameters: true
                      block: true