-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathayer-build-function
executable file
·155 lines (133 loc) · 4.8 KB
/
ayer-build-function
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
#!/bin/bash
source /usr/lib/ayer/functions.sh || exit 1
if [ "$#" -lt 4 ]; then
die "usage: $(basename $0) build_commit previous_ref target_path build_release"
fi
ayer_init
build_commit=$1
previous_ref=$2
target_path=$3
build_release=${4%_trunk}
# globals: git_dir build_dir
function create_build_plan() {
local git_list=$1
local previous_ref=$2
git_fetch_repos $build_commit >/dev/null
cd "$git_dir/${BASE_PROJECT}.git"
build_commit=$(git rev-parse $build_commit)
echo "$build_commit $BASE_PROJECT" > $git_list
if [ -n "$previous_ref" ]; then
git diff-tree -r origin/$previous_ref..$build_commit |
while read mode1 mode2 hash1 hash2 ignored path; do
if [ "$mode2" == 160000 ]; then
echo "$hash2 $(basename $path)" >> $git_list
fi
done
else
git ls-tree -r "$build_commit" | while read mode type hash path; do
if [ "$mode" == 160000 ]; then
echo "$hash $(basename $path)" >> $git_list
fi
done
fi
}
function execute_build_plan() {
local build_release=$1
local git_list=$2
local project_baseurl=$3
cd "$build_dir"
mkdir -p SOURCES SRPMS
echo "$project_baseurl" > SOURCES/baseurl
while read refspec repo_name; do
repo_name="${repo_name%.git}"
echo "processing repository $repo_name"
cd "$git_dir/${repo_name}.git"
if [ "$repo_name" == deps ]; then
# FIXME: ignore deps now!
continue
rm -rf "$build_dir/deps"
git archive --format=tar --prefix=deps/ $refspec | tar -x -C "$build_dir"
rm -rf "$build_dir/deps/".git*
find "$build_dir/deps/" -type f -name '*rpm' | while read f; do
repo_dir=$(dirname $f)
if [ ! -d "$repo_dir/repodata" ]; then
createrepo "$repo_dir" >/dev/null
fi
done
else
ayer-rpm -bs --builddir $build_dir --release "$build_release" --treeish $refspec
fi
done < "$git_list"
}
function build_bin_rpms() {
local srpms_dir="$build_dir/SRPMS"
local build_script=ayer-mock
cd "$build_dir"
if [ -n "$BUILD_SERVER_SSH" ]; then
echo -n "building binary rpms at $BUILD_SERVER_SSH"
local remote_dir=$(ssh "$BUILD_SERVER_SSH" "mktemp -d /tmp/ayer.XXXXXX")
echo ":$remote_dir"
scp -r "$srpms_dir" "$BUILD_SERVER_SSH:$remote_dir/"
scp "$(which "$build_script")" "$BUILD_SERVER_SSH:$remote_dir/"
ssh "$BUILD_SERVER_SSH" "cd $remote_dir && \"./$build_script\" $BUILD_BIN_RPMS_ARGS" && binrpm_exitcode=0 || binrpm_exitcode=$?
rm -rf "$build_dir/RPMS"
[ "$binrpm_exitcode" != "0" ] || scp -r "$BUILD_SERVER_SSH:$remote_dir/RPMS" "$build_dir"
ssh "$BUILD_SERVER_SSH" "rm -rf '$remote_dir'"
[ "$binrpm_exitcode" == "0" ] || die "binary rpm build failed with exit code $binrpm_exitcode"
else
# use `eval' to support, e.g., BUILD_BIN_RPMS_ARGS="altai --define 'with_doc 1'"
eval "$build_script" "$BUILD_BIN_RPMS_ARGS"
fi
if [ -n "$AYER_RPM_SIGN" ]; then
echo "signing rpms"
$AYER_RPM_SIGN "$build_dir/RPMS"/*rpm > /dev/null
fi
}
function append_rpms() {
local git_list=$1
local previous_ref=$2
local rpm_dir="$build_dir/RPMS"
if [ -n "$previous_ref" ]; then
previous_dir="$YUM_REPO_DIR/dev/$previous_ref"
if [ ! -d "$build_dir/deps" -a -d "$previous_dir/deps" ]; then
cp -al "$previous_dir/deps" "$build_dir/deps"
fi
for i in "$previous_dir/$build_os"/*; do
if [ ! -f "$i" -o -f "$rpm_dir/$(basename "$i")" ]; then
continue
fi
local commit=$(rpm -q -p "$i" --changelog 2>/dev/null | head -2 | grep -E -o '[0-9a-z]{40}' || true)
if [ -n "$commit" ] && grep -q "$commit" "$git_list"; then
cp -al "$i" "$rpm_dir"
fi
done
fi
createrepo "$rpm_dir" >/dev/null
}
# body
if [[ "$target_path" == dev/* ]]; then
project_baseurl="$YUM_REPO_BASEURL_DEV/$target_path"
else
project_baseurl="$YUM_REPO_BASEURL_RELEASE/$target_path"
fi
echo "build is available at $YUM_REPO_BASEURL_DEV/$target_path"
base_target_dir="$YUM_REPO_DIR/$target_path"
build_dir="$base_target_dir/build"
function clean_at_exit() {
cd "$build_dir"
for i in *; do
if [ "$i" != deps -a "$i" != RPMS ]; then
rm -rf "$build_dir/$i"
fi
done
}
rm -rf "$build_dir"
mkdir -p "$build_dir"
trap clean_at_exit EXIT
git_list="$build_dir/git-diff.list"
create_build_plan "$git_list" "$previous_ref"
execute_build_plan "$build_release" "$git_list" "$project_baseurl"
build_bin_rpms
git_list="$build_dir/git-all.list"
create_build_plan "$git_list" ""
append_rpms "$git_list" "$previous_ref"