-
Notifications
You must be signed in to change notification settings - Fork 22
/
build.sh
executable file
·148 lines (122 loc) · 3.69 KB
/
build.sh
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
#!/bin/bash -e
# shellcheck disable=SC2119,SC1091
run_stage(){
log "Begin ${STAGE_DIR}"
STAGE="$(basename "${STAGE_DIR}")"
STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
pushd "${STAGE_DIR}" > /dev/null
# Create the Work folder
mkdir -p "${STAGE_WORK_DIR}"
# Check wether to skip or not
if [ ! -f "${STAGE_DIR}/SKIP" ]; then
# mount the image for this stage
if [ ! -f "${STAGE_DIR}/SKIP_IMAGE" ]; then
# Copy the image from the previous stage
if [ -f "${PREV_WORK_DIR}/IMAGE.img" ]; then
unmount_image
cp "${PREV_WORK_DIR}/IMAGE.img" "${STAGE_WORK_DIR}/IMAGE.img"
mount_image
else
log "[ERROR] No image to copy in ${PREV_WORK_DIR}/"
fi
fi
# iterate different files
for i in {00..99}; do
if [ -x ${i}-run.sh ]; then
SKIP_STEP="${STAGE_DIR}/SKIP_STEP${i}"
if [ ! -f "${SKIP_STEP}" ]; then
log "Begin ${STAGE_DIR}/${i}-run.sh"
./${i}-run.sh
log "End ${STAGE_DIR}/${i}-run.sh"
touch "${SKIP_STEP}"
fi
fi
if [ -f ${i}-run-chroot.sh ]; then
SKIP_CH_STEP="${STAGE_DIR}/SKIP_CH_STEP${i}"
if [ ! -f "${SKIP_CH_STEP}" ]; then
log "Begin ${STAGE_DIR}/${i}-run-chroot.sh"
on_chroot < ${i}-run-chroot.sh
log "End ${STAGE_DIR}/${i}-run-chroot.sh"
touch "${SKIP_CH_STEP}"
fi
fi
done
fi
# SKIP this stage next time
touch "${STAGE_DIR}/SKIP"
PREV_STAGE="${STAGE}"
PREV_STAGE_DIR="${STAGE_DIR}"
PREV_WORK_DIR="${WORK_DIR}/${STAGE}"
if [ ! -f "${STAGE_DIR}/SKIP_IMAGE" ]; then
unmount_image
fi
popd > /dev/null
log "End ${STAGE_DIR}"
}
if [ "$(id -u)" != "0" ]; then
echo "Please run as root" 1>&2
exit 1
fi
if [ -f config ]; then
source config
fi
if [ -z "${IMG_NAME}" ]; then
echo "IMG_NAME not set" 1>&2
exit 1
fi
# Variables
export IMG_DATE="${IMG_DATE:-"$(date +%Y-%m-%d)"}"
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export SCRIPT_DIR="${BASE_DIR}/scripts"
export WORK_DIR="${BASE_DIR}/work"
export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
export LOG_FILE="${WORK_DIR}/build.log"
mkdir -p "${WORK_DIR}"
# Get the dynamic information from the image
curl $BASE_IMAGE_URL/$BASE_IMAGE".info" > $WORK_DIR/infofile
GIT_KERNEL_SHA1=$(cat $WORK_DIR/infofile | grep -Po '\b(Kernel: https:\/\/github\.com\/raspberrypi\/linux\/tree\/\K)+(.*)$')
KERNEL_VERSION_V7=$(cat $WORK_DIR/infofile | grep -Po '\b(Uname string: Linux version )\K(?<price>[^\ ]+)')
KERNEL_VERSION=${KERNEL_VERSION_V7%"-v7+"}"+"
export BASE_DIR
export CLEAN
export IMG_NAME
export BASE_IMAGE_URL
export BASE_IMAGE
export J_CORES
export GIT_KERNEL_SHA1
export KERNEL_VERSION
export KERNEL_VERSION_V7
export APT_PROXY
export STAGE
export STAGE_DIR
export STAGE_WORK_DIR
export PREV_STAGE
export PREV_STAGE_DIR
export PREV_WORK_DIR
export ROOTFS_DIR
export PREV_ROOTFS_DIR
export IMG_SUFFIX
# shellcheck source=scripts/common
source "${SCRIPT_DIR}/common"
log "IMG ${BASE_IMAGE}"
log "SHA ${GIT_KERNEL_SHA1}"
log "V7 ${KERNEL_VERSION_V7}"
log "VER ${KERNEL_VERSION}"
log "Begin ${BASE_DIR}"
# Iterate trough the steps
for STAGE_DIR in "${BASE_DIR}/stages/"*; do
if [ -d "${STAGE_DIR}" ]; then
run_stage
fi
done
if [ -f "${PREV_WORK_DIR}/IMAGE.img" ]; then
mkdir -p "${DEPLOY_DIR}" || true
cp "${PREV_WORK_DIR}/IMAGE.img" "${DEPLOY_DIR}/${IMG_NAME}-${IMG_DATE}.img"
fi
# Clean up SKIP_STEP files since we finished the build
# and it should be clean for the next run. Maybe make
# this an option?
cd ${BASE_DIR}
find stages -name "SKIP_STEP*" -exec rm {} \;
#find stages -name "SKIP*" -exec rm {} \;
log "End ${BASE_DIR}"