-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
build-plugin-zip.sh
executable file
·131 lines (118 loc) · 3.76 KB
/
build-plugin-zip.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
#!/bin/bash
# Exit if any command fails.
set -e
# Change to the expected directory.
cd "$(dirname "$0")"
cd ..
# Enable nicer messaging for build status.
BLUE_BOLD='\033[1;34m';
GREEN_BOLD='\033[1;32m';
RED_BOLD='\033[1;31m';
YELLOW_BOLD='\033[1;33m';
COLOR_RESET='\033[0m';
error () {
echo -e "\n${RED_BOLD}$1${COLOR_RESET}\n"
}
status () {
echo -e "\n${BLUE_BOLD}$1${COLOR_RESET}\n"
}
success () {
echo -e "\n${GREEN_BOLD}$1${COLOR_RESET}\n"
}
warning () {
echo -e "\n${YELLOW_BOLD}$1${COLOR_RESET}\n"
}
status "💃 Time to release Gutenberg 🕺"
if [ -z "$NO_CHECKS" ]; then
# Make sure there are no changes in the working tree. Release builds should be
# traceable to a particular commit and reliably reproducible. (This is not
# totally true at the moment because we download nightly vendor scripts).
changed=
if ! git diff --exit-code > /dev/null; then
changed="file(s) modified"
elif ! git diff --cached --exit-code > /dev/null; then
changed="file(s) staged"
fi
if [ ! -z "$changed" ]; then
git status
error "ERROR: Cannot build plugin zip with dirty working tree. ☝️
Commit your changes and try again."
exit 1
fi
# Do a dry run of the repository reset. Prompting the user for a list of all
# files that will be removed should prevent them from losing important files!
status "Resetting the repository to pristine condition. ✨"
to_clean=$(git clean -xdf --dry-run)
if [ ! -z "$to_clean" ]; then
echo $to_clean
warning "🚨 About to delete everything above! Is this okay? 🚨"
echo -n "[y]es/[N]o: "
read answer
if [ "$answer" != "${answer#[Yy]}" ]; then
# Remove ignored files to reset repository to pristine condition. Previous
# test ensures that changed files abort the plugin build.
status "Cleaning working directory... 🛀"
git clean -xdf
else
error "Fair enough; aborting. Tidy up your repo and try again. 🙂"
exit 1
fi
fi
fi
# Download all vendor scripts
status "Downloading remote vendor scripts... 🛵"
vendor_scripts=""
# Using `command | while read...` is more typical, but the inside of the `while`
# loop will run under a separate process this way, meaning that it cannot
# modify $vendor_scripts. See: https://stackoverflow.com/a/16855194
exec 3< <(
# Get minified versions of vendor scripts.
php bin/get-vendor-scripts.php
# Get non-minified versions of vendor scripts (for SCRIPT_DEBUG).
php bin/get-vendor-scripts.php debug
)
while IFS='|' read -u 3 url filename; do
echo "$url"
echo -n " > vendor/$filename ... "
http_status=$( curl \
--location \
--silent \
"$url" \
--output "vendor/_download.tmp.js" \
--write-out "%{http_code}"
)
if [ "$http_status" != 200 ]; then
error "HTTP $http_status"
exit 1
fi
mv -f "vendor/_download.tmp.js" "vendor/$filename"
echo -e "${GREEN_BOLD}done!${COLOR_RESET}"
vendor_scripts="$vendor_scripts vendor/$filename"
done
# Run the build.
status "Installing dependencies... 📦"
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm install
status "Generating build... 👷♀️"
npm run build
# Temporarily modify `gutenberg.php` with production constants defined. Use a
# temp file because `bin/generate-gutenberg-php.php` reads from `gutenberg.php`
# so we need to avoid writing to that file at the same time.
php bin/generate-gutenberg-php.php > gutenberg.tmp.php
mv gutenberg.tmp.php gutenberg.php
build_files=$(ls build/*/*.{js,css,asset.php} build/block-library/blocks/*.php)
# Generate the plugin zip file.
status "Creating archive... 🎁"
zip -r gutenberg.zip \
gutenberg.php \
lib/*.php \
lib/demo-block-templates/*.html \
packages/block-serialization-default-parser/*.php \
post-content.php \
$vendor_scripts \
$build_files \
readme.txt \
changelog.txt \
README.md
# Reset `gutenberg.php`.
git checkout gutenberg.php
success "Done. You've built Gutenberg! 🎉 "