blob: 6d1203b68922a6ec5d2f403fed8da67ef337c20b [file] [log] [blame]
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -05001#!/usr/bin/env bash
2#
3# Copyright (c) 2021 Arm Limited. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7# Clones and checkout TF-A related repositories in case these are not present
8# under SHARE_FOLDER, otherwise copy the share repositories into current folder
9# (workspace)
10
11# The way it works is simple: the top level job sets the SHARE_FOLDER
12# parameter based on its name and number on top of the share
13# volume (/srv/shared/<job name>/<job number>) then it calls the clone
14# script (clone.sh), which in turn it fetches the repositories mentioned
15# above. Jobs triggered on behalf of the latter, share the same
16# SHARE_FOLDER value, and these in turn also call the clone script, but
17# in this case, the script detects that the folder is already populated so
18# its role is to simply copy the repositories into the job's
19# workspace. As seen, all jobs work with repositories on their own
20# workspace, which are just copies of the share folder, so there is no
21# change of a race condition, i.e every job works with its own copy. The
22# worst case scenario is where the down-level job, tf-a-builder, uses its
23# default SHARE_FOLDER value, in this case, it would simply clone its
24# own repositories without reusing any file however the current approach
25# prevents the latter unless the job is triggered manually from the
26# builder job itself.
27
28set -e
29
Paul Sokolovsky54f0ea22021-11-17 21:51:02 +030030# WORKAROUND START
31# Install last-minute dependencies. This should not be done like that,
32# instead all dependencies should go into the build docker image. But
33# to unbreak urgent regressions, some packages may be installed here
34# until they're moved to the docker image.
35sudo apt update
36sudo apt-get install -y python3-venv
37# WORKAROUND END
38
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -050039# Global defaults
40REFSPEC_MASTER="refs/heads/master"
41GIT_REPO="https://git.trustedfirmware.org"
42GERRIT_HOST="https://review.trustedfirmware.org"
Leonardo Sandoval49a18a42021-09-26 19:48:53 -050043GIT_CLONE_PARAMS=""
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -050044
45# Defaults Projects
46TF_GERRIT_PROJECT="${GERRIT_HOST}/${TF_GERRIT_PROJECT:-TF-A/trusted-firmware-a}"
47TFTF_GERRIT_PROJECT="${GERRIT_HOST}/${TFTF_GERRIT_PROJECT:-/TF-A/tf-a-tests}"
Zelalem Awekee8801df2021-10-25 13:41:44 -050048CI_PROJECT="${CI_PROJECT:-${GIT_REPO}/ci/tf-a-ci-scripts.git}"
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -050049JOBS_PROJECT="${JOB_PROJECT:-${GIT_REPO}/ci/tf-a-job-configs.git}"
50
51# Default Reference specs
52TF_GERRIT_REFSPEC="${TF_GERRIT_REFSPEC:-${REFSPEC_MASTER}}"
53TFTF_GERRIT_REFSPEC="${TFTF_GERRIT_REFSPEC:-${REFSPEC_MASTER}}"
Zelalem Awekee8801df2021-10-25 13:41:44 -050054CI_REFSPEC="${CI_REFSPEC:-${REFSPEC_MASTER}}"
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -050055JOBS_REFSPEC="${JOBS_REFSPEC:-${REFSPEC_MASTER}}"
56
57# Array containing "<repo url>;"<repo name>;<refspec>" elements
58repos=(
Zelalem Awekee8801df2021-10-25 13:41:44 -050059 "${CI_PROJECT};tf-a-ci-scripts;${CI_REFSPEC}"
Leonardo Sandovald1b6b5a2021-09-13 12:06:26 -050060 "${JOBS_PROJECT};tf-a-job-configs;${JOBS_REFSPEC}"
61 "${TF_GERRIT_PROJECT};trusted-firmware-a;${TF_GERRIT_REFSPEC}"
62 "${TFTF_GERRIT_PROJECT};tf-a-tests;${TFTF_GERRIT_REFSPEC}"
63)
64
65# Take into consideration non-CI runs where SHARE_FOLDER variable
66# may not be present
67if [ -z "${SHARE_FOLDER}" ]; then
68 # Default Jenkins values
69 SHARE_VOLUME="${SHARE_VOLUME:-$PWD}"
70 JOB_NAME="${JOB_NAME:-local}"
71 BUILD_NUMBER="${BUILD_NUMBER:-0}"
72 SHARE_FOLDER=${SHARE_VOLUME}/${JOB_NAME}/${BUILD_NUMBER}
73fi
74
75# clone git repos
76for repo in ${repos[@]}; do
77
78 # parse the repo elements
79 REPO_URL="$(echo "${repo}" | awk -F ';' '{print $1}')"
80 REPO_NAME="$(echo "${repo}" | awk -F ';' '{print $2}')"
81 REPO_REFSPEC="$(echo "${repo}" | awk -F ';' '{print $3}')"
82
83 # clone and checkout in case it does not exit
84 if [ ! -d ${SHARE_FOLDER}/${REPO_NAME} ]; then
85 git clone ${GIT_CLONE_PARAMS} ${REPO_URL} ${SHARE_FOLDER}/${REPO_NAME}
86
87 # fetch and checkout the corresponding refspec
88 cd ${SHARE_FOLDER}/${REPO_NAME}
89 git fetch ${REPO_URL} ${REPO_REFSPEC}
90 git checkout FETCH_HEAD
91 git log -1
92 cd $OLDPWD
93
94 else
95 # otherwise just show the head's log
96 cd ${SHARE_FOLDER}/${REPO_NAME}
97 git log -1
98 cd $OLDPWD
99 fi
100
101 # copy repository into pwd dir (workspace in CI), so each job would work
102 # on its own workspace
103 cp -a -f ${SHARE_FOLDER}/${REPO_NAME} ${PWD}/${REPO_NAME}
104
105done