]>
Commit | Line | Data |
---|---|---|
fd9f9810 MT |
1 | #!/bin/bash -l |
2 | ||
3 | BASEDIR="/build/nightly" | |
d2b7a495 | 4 | LOCKFILE="/tmp/.nightly-builds.lock" |
fd9f9810 MT |
5 | |
6 | UPLOAD_DIR="${BASEDIR}/upload" | |
7899475b | 7 | UPLOAD_TO="pakfire@fs01.haj.ipfire.org:/pub/nightly" |
33e0dd1c | 8 | RSYNC_ARGS=( "--delay-updates" ) |
fd9f9810 | 9 | |
fd9f9810 MT |
10 | extract_installer_from_iso() { |
11 | local dir="${1}" | |
12 | ||
13 | local tmpdir="$(mktemp -d)" | |
14 | mkdir -p "${dir}/images" | |
15 | ||
16 | local file | |
17 | for file in ${dir}/*.iso; do | |
18 | if mount -o loop,ro "${file}" "${tmpdir}"; then | |
19 | local f | |
20 | for f in vmlinuz instroot; do | |
21 | cp -f "${tmpdir}/boot/isolinux/${f}" "${dir}/images" | |
22 | done | |
23 | umount "${tmpdir}" | |
81a5283c MT |
24 | |
25 | local ext | |
26 | for ext in "" ".md5"; do | |
27 | ln -s --relative "${file}${ext}" \ | |
28 | "${dir}/images/installer.iso${ext}" | |
29 | done | |
fd9f9810 MT |
30 | break |
31 | fi | |
32 | done 2>/dev/null | |
33 | ||
34 | rm -rf "${tmpdir}" | |
35 | } | |
36 | ||
37 | build() { | |
38 | local dir="${1}" | |
39 | shift | |
40 | ||
fb8a369c MT |
41 | # Check if this actually source of IPFire 2 |
42 | [ -x "${dir}/make.sh" ] || return 1 | |
43 | ||
fd9f9810 MT |
44 | pushd "${dir}" |
45 | ||
46 | local branch="$(git config build.branch)" | |
47 | [ -z "${branch}" ] && branch="master" | |
48 | ||
49 | local commit_old="$(git rev-parse HEAD)" | |
50 | git fetch | |
51 | ||
ecab61ba MT |
52 | # Search for the latest core branch |
53 | if [ "${branch}" = "core" ]; then | |
54 | branch=$(git branch -r | awk -F/ '{ print $NF }' | grep ^core | sort --version-sort | tail -n1) | |
55 | fi | |
56 | ||
fd9f9810 MT |
57 | # If the branch was not updated, we won't build |
58 | local commit_new="$(git rev-parse origin/${branch})" | |
59 | [ "${commit_old}" = "${commit_new}" ] && return 2 | |
60 | ||
61 | # Checkout the latest commit | |
62 | git reset --hard "${commit_new}" | |
63 | ||
e685e88f | 64 | local now="$(git log --format="%ci" -1 "${commit_new}")" |
fd9f9810 MT |
65 | |
66 | local targets="$(git config build.targets)" | |
67 | [ -z "${targets}" ] && targets="i586" | |
68 | ||
69 | local target | |
70 | for target in ${targets}; do | |
c42b9259 MT |
71 | local build_path="${UPLOAD_DIR}/${branch}/${now}-${commit_new:0:8}" |
72 | local build="${build_path}/${target}" | |
fd9f9810 MT |
73 | |
74 | # Ready for build | |
75 | ./make.sh --target="${target}" clean | |
76 | ||
77 | # Download the toolchain if required | |
78 | ./make.sh --target="${target}" gettoolchain || continue | |
79 | ||
80 | # Download all sources | |
81 | ./make.sh --target="${target}" downloadsrc || continue | |
82 | ||
83 | # Execute the build | |
84 | mkdir -p "${build}" | |
85 | ./make.sh --target="${target}" build | tee "${build}/build.log" | |
86 | local ret=${PIPESTATUS[0]} | |
87 | ||
83c069b6 MT |
88 | # Save the changelog |
89 | git log -50 > "${build}/changelog.txt" | |
90 | ||
fd9f9810 MT |
91 | # Save the result |
92 | if [ "${ret}" = "0" ]; then | |
36213bbc | 93 | mv -v *.iso *.img.gz *.img.xz *.tar.bz2 *.md5 packages/ "${build}" |
fd9f9810 MT |
94 | extract_installer_from_iso "${build}" |
95 | touch "${build}/.success" | |
96 | fi | |
97 | mv -v log/ "${build}" | |
98 | ||
ef1ba4c9 | 99 | # Cleanup the build environment |
fd9f9810 | 100 | ./make.sh --target="${target}" clean |
ef1ba4c9 MT |
101 | |
102 | # Upload the result | |
103 | # If that failed, we will keep the result and it will | |
104 | # be retried with the next build. If that succeeded, the | |
105 | # build will be removed from disk. | |
106 | if sync; then | |
7a0fb04f | 107 | rm -rf "${UPLOAD_DIR}" |
ef1ba4c9 | 108 | fi |
fd9f9810 MT |
109 | done |
110 | ||
111 | popd | |
112 | } | |
113 | ||
114 | sync() { | |
115 | mkdir -p "${UPLOAD_DIR}" | |
116 | ||
7899475b MT |
117 | # Acquire a Kerberos ticket for authentication |
118 | if ! klist &>/dev/null; then | |
119 | kinit -k -t /etc/krb5.keytab "host/${HOSTNAME}" | |
120 | fi | |
121 | ||
f267213e | 122 | rsync -avH --progress "${RSYNC_ARGS[@]}" \ |
fd9f9810 MT |
123 | "${UPLOAD_DIR}/" "${UPLOAD_TO}" |
124 | } | |
125 | ||
d2b7a495 MT |
126 | is_locked() { |
127 | [ -e "${LOCKFILE}" ] | |
128 | } | |
129 | ||
130 | lock() { | |
131 | touch "${LOCKFILE}" | |
132 | } | |
133 | ||
134 | unlock() { | |
135 | rm -f "${LOCKFILE}" | |
136 | } | |
137 | ||
d2b7a495 | 138 | # Don't start again if the script is already running |
b9def775 MT |
139 | # or if an other build script is running |
140 | if is_locked || pgrep make.sh >/dev/null; then | |
d2b7a495 MT |
141 | exit 0 |
142 | fi | |
143 | ||
144 | # Lock | |
145 | trap unlock EXIT | |
146 | lock | |
147 | ||
6c6991a8 | 148 | for repo in $(find ${BASEDIR} -maxdepth 3 -type d -name ".git"); do |
fd9f9810 MT |
149 | [ -d "${repo}" ] || continue |
150 | ||
151 | build "$(dirname ${repo})" | |
152 | done | |
d2b7a495 | 153 | |
555260fa MT |
154 | # Try to sync even nothing was built for retrying failed uploads |
155 | sync | |
156 | ||
d2b7a495 | 157 | exit 0 |