podman

Форк
0
/
make-and-check-size 
136 строк · 4.7 Кб
1
#!/bin/bash
2
#
3
# make-and-check-size - wrapper around 'make' that also checks binary growth
4
#
5
# This script is intended to be run via 'git rebase -x', in a form such as:
6
#
7
#     context_dir=$(mktemp -d --tmpdir make-size-check.XXXXXXX)
8
#     git rebase ${GIT_BASE_BRANCH}^ -x "hack/make-and-check-size $context_dir"
9
#     rm -rf $context_dir
10
#
11
# (Carefully note the '^' next to GIT_BASE_BRANCH!)
12
#
13
# A 'git rebase -x' has long been a part of our usual CI; it guarantees
14
# that each commit (whether in a single- or multi-commit PR) can be
15
# compiled individually.
16
#
17
# By adding the '^' to GIT_BASE_BRANCH we establish a baseline and store
18
# the binary sizes of each file (podman, podman-remote) prior to our PR.
19
#
20
# context_dir is a temporary directory used to store the original sizes
21
# of each binary file under bin/
22
#
23
# *IMPORTANT NOTE*: this script will leave the git checkout in a funky state!
24
# (because we rebase onto a nonterminal commit). I believe this is OK, since
25
# this script is only invoked in CI from runner.sh and only in a scratch VM.
26
# Running this in a development environment would yield unpredictable results
27
# anyway, by rebasing onto origin/main by default and by leaving an aborted
28
# rebase on failure.
29
#
30
ME=$(basename $0)
31

32
###############################################################################
33
# BEGIN end-user-customizable settings
34

35
# Maximum allowable size, in bytes
36
MAX_BIN_GROWTH=$((50 * 1024))
37

38
# Github label which allows overriding this check
39
OVERRIDE_LABEL=bloat_approved
40

41
# END   end-user-customizable settings
42
###############################################################################
43

44
#
45
# Helper function: queries github for labels on this PR
46
#
47
function bloat_approved() {
48
    # Argument is the actual size increase in this build.
49
    # FIXME: 2022-03-21: this is not actually used atm, but Ed hopes some day
50
    #        to implement a more robust size-override mechanism, such as by
51
    #        requiring a MAX_BIN_GROWTH=nnn statement in github comments.
52
    local actual_growth="$1"
53

54
    if [[ -z "$CIRRUS_PR" ]]; then
55
        echo "$ME: cannot query github: \$CIRRUS_PR is undefined" >&2
56
        return 1
57
    fi
58
    if [[ -z "$CIRRUS_REPO_CLONE_TOKEN" ]]; then
59
        echo "$ME: cannot query github: \$CIRRUS_REPO_CLONE_TOKEN is undefined" >&2
60
        return 1
61
    fi
62

63
    query="{
64
  \"query\": \"query {
65
  repository(owner: \\\"containers\\\", name: \\\"podman\\\") {
66
    pullRequest(number: $CIRRUS_PR) {
67
      labels(first: 100) {
68
        nodes {
69
          name
70
        }
71
      }
72
    }
73
  }
74
}\"
75
}"
76

77
    result=$(curl -s -H "Authorization: bearer $CIRRUS_REPO_CLONE_TOKEN" -H "Accept: application/vnd.github.antiope-preview+json" -H "Content-Type: application/json" -X POST --data @- https://api.github.com/graphql <<<"$query")
78

79
    labels=$(jq -r '.data.repository.pullRequest.labels.nodes[].name' <<<"$result")
80

81
    grep -q -w "$OVERRIDE_LABEL" <<<"$labels"
82
}
83

84
# ACTUAL CODE BEGINS HERE
85
set -e
86

87
# Must be invoked with one argument, an existing context directory
88
context_dir=${1?Missing CONTEXT-DIR argument}
89
if [[ ! -d $context_dir ]]; then
90
    echo "$ME: directory '$context_dir' does not exist"
91
    exit 1
92
fi
93

94
# This is the original (and primary) purpose of this check: if 'make' fails,
95
# there is no point in continuing.  Show at least the commit title since
96
# the ID may not match anything human recognisable.
97
echo
98
echo "Building: $(git log -n 1 --no-show-signature --oneline)"
99
make
100

101
# Determine size of each built file.
102
# - If this is our first time through, preserve that size in a tmpfile
103
# - On all subsequent runs, compare built size to initial size
104
for bin in bin/*;do
105
    size=$(stat -c %s $bin)
106

107
    saved_size_file=$context_dir/$(basename $bin)
108
    if [[ -e $saved_size_file ]]; then
109
        # Not the first time through: compare to original size
110
        size_orig=$(< $saved_size_file)
111
        delta_size=$(( size - size_orig ))
112

113
        printf "%-20s size=%9d  delta=%6d\n" $bin $size $delta_size
114
        if [[ $delta_size -gt $MAX_BIN_GROWTH ]]; then
115
            separator=$(printf "%.0s*" {1..75})   # row of stars, for highlight
116
            echo "$separator"
117
            echo "* $bin grew by $delta_size bytes; max allowed is $MAX_BIN_GROWTH."
118
            echo "*"
119
            if bloat_approved $delta_size; then
120
                echo "* Continuing due to '$OVERRIDE_LABEL' label"
121
                echo "*"
122
                echo "$separator"
123
            else
124
                echo "* Please investigate, and fix if possible."
125
                echo "*"
126
                echo "* A repo admin can override by setting the $OVERRIDE_LABEL label"
127
                echo "$separator"
128
                exit 1
129
            fi
130
        fi
131
    else
132
        # First time through: preserve original file size
133
        echo $size >$saved_size_file
134
        printf "%-20s size=%9d\n" $bin $size
135
    fi
136
done
137

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.