-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathblackfire
executable file
·77 lines (59 loc) · 3.11 KB
/
blackfire
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
#!/usr/bin/env bash
# Build Path: /app/.heroku/php
OUT_PREFIX=$1
# fail hard
set -o pipefail
# fail harder
set -eu
source $(dirname $BASH_SOURCE)/_util/include/manifest.sh
bin_dir=${OUT_PREFIX}/bin
dep_formula=${0#$WORKSPACE_DIR/}
dep_name=$(basename $BASH_SOURCE)
dep_version=${dep_formula#"${dep_name}-"}
dep_package=${dep_name}-${dep_version}
dep_manifest=${dep_package}.composer.json
echo "-----> Packaging ${dep_package}..."
echo "FYI: Blackfire API reports latest version as $(curl -A "Heroku" -I -L -s https://blackfire.io/api/v1/releases/cli/linux/$(dpkg --print-architecture) | grep -i 'X-Blackfire-Release-Version: ' | sed "s%X-Blackfire-Release-Version: %%i" | sed s%.$%%)"
curl -L "https://packages.blackfire.io/binaries/blackfire/${dep_version}/blackfire-linux_$(dpkg --print-architecture).tar.gz" | tar xz
mkdir -p ${OUT_PREFIX}/var/blackfire/run
mkdir -p ${bin_dir}
chmod +x blackfire
mv blackfire ${bin_dir}/
find ${OUT_PREFIX} -type f \( -executable -o -name '*.a' \) -exec sh -c "file -i '{}' | grep -Eq 'application/x-(archive|(pie-)?executable|sharedlib); charset=binary'" \; -print | xargs strip --strip-unneeded
# these env var defaults we want both during a build (used in the INI futher below) and at boot time
tee ${OUT_PREFIX}/bin/export.blackfire.sh > ${OUT_PREFIX}/bin/profile.blackfire.sh <<'EOF'
# hard-code these two; no need for users to override them
export BLACKFIRE_LOG_FILE=stderr
export BLACKFIRE_AGENT_SOCKET="unix:///app/.heroku/php/var/blackfire/run/agent.sock"
EOF
# PATH should be available both for subsequent buildpacks and on boot
cat >> ${OUT_PREFIX}/bin/export.blackfire.sh <<'EOF'
export PATH="/app/.heroku/php/bin:$PATH"
EOF
# gets sourced on dyno boot
cat >> ${OUT_PREFIX}/bin/profile.blackfire.sh <<'EOF'
export PATH="$HOME/.heroku/php/bin:$PATH"
# we need no config, as everything will be read from the environment
# exception is BLACKFIRE_SOCKET, which we pass in explicitly; the extension uses BLACKFIRE_AGENT_SOCKET instead
/app/.heroku/php/bin/blackfire agent:start --config="/dev/null" --socket="${BLACKFIRE_AGENT_SOCKET}" &
blackfire_pid=$!
# give it a moment to start up...
while ! test -S "${BLACKFIRE_AGENT_SOCKET#"unix://"}"; do
# ...unless it somehow crashes on start, then we have to bail to prevent an infite loop
if ! kill -0 $blackfire_pid 2> /dev/null; then # kill -0 checks if process exists
echo "Failed to start blackfire agent!" >&2
break;
fi
if [[ "$BLACKFIRE_LOG_LEVEL" == [34] ]]; then
echo "Waiting for blackfire agent..." >&2
fi
sleep 0.1
done
EOF
MANIFEST_REQUIRE="${MANIFEST_REQUIRE:-"{}"}"
MANIFEST_CONFLICT="${MANIFEST_CONFLICT:-"{}"}"
MANIFEST_REPLACE="${MANIFEST_REPLACE:-"{}"}"
MANIFEST_PROVIDE="${MANIFEST_PROVIDE:-"{}"}"
MANIFEST_EXTRA="${MANIFEST_EXTRA:-"{\"export\":\"bin/export.blackfire.sh\",\"profile\":\"bin/profile.blackfire.sh\"}"}"
python $(dirname $BASH_SOURCE)/_util/include/manifest.py "heroku-sys-program" "heroku-sys/${dep_name}" "$dep_version" "${dep_formula}.tar.gz" "$MANIFEST_REQUIRE" "$MANIFEST_CONFLICT" "$MANIFEST_REPLACE" "$MANIFEST_PROVIDE" "$MANIFEST_EXTRA" > $dep_manifest
print_or_export_manifest_cmd "$(generate_manifest_cmd "$dep_manifest")"