summaryrefslogtreecommitdiff
path: root/travis-ci/managers/fedora.sh
blob: b3c85ebd09276c3aa9cd98d91b51008519a39d59 (plain)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/bin/bash

# Run this script from the root of the systemd's git repository
# or set REPO_ROOT to a correct path.
#
# Example execution on Fedora:
# dnf install docker
# systemctl start docker
# export CONT_NAME="my-fancy-container"
# travis-ci/managers/fedora.sh SETUP RUN CLEANUP

PHASES=(${@:-SETUP RUN RUN_ASAN CLEANUP})
FEDORA_RELEASE="${FEDORA_RELEASE:-rawhide}"
CONT_NAME="${CONT_NAME:-fedora-$FEDORA_RELEASE-$RANDOM}"
DOCKER_EXEC="${DOCKER_EXEC:-docker exec -it $CONT_NAME}"
DOCKER_RUN="${DOCKER_RUN:-docker run}"
REPO_ROOT="${REPO_ROOT:-$PWD}"
ADDITIONAL_DEPS=(dnf-plugins-core
                 jq iputils
                 hostname libasan
                 python3-pyparsing
                 python3-evdev
                 libubsan
                 clang
                 llvm
                 perl
                 libfdisk-devel
                 libpwquality-devel
                 openssl-devel
                 p11-kit-devel)

info() {
    echo -e "\033[33;1m$1\033[0m"
}

error() {
    echo >&2 -e "\033[31;1m$1\033[0m"
}

success() {
    echo >&2 -e "\033[32;1m$1\033[0m"
}

# Simple wrapper which retries given command up to five times
_retry() {
    local EC=1

    for i in {1..5}; do
        if "$@"; then
            EC=0
            break
        fi

        sleep $((i * 5))
    done

    return $EC
}

set -e

source "$(dirname $0)/travis_wait.bash"

for phase in "${PHASES[@]}"; do
    case $phase in
        SETUP)
            info "Setup phase"
            info "Using Fedora $FEDORA_RELEASE"
            # Pull a Docker image and start a new container
            docker pull fedora:$FEDORA_RELEASE
            info "Starting container $CONT_NAME"
            $DOCKER_RUN -v $REPO_ROOT:/build:rw \
                        -w /build --privileged=true --name $CONT_NAME \
                        -dit --net=host fedora:$FEDORA_RELEASE /sbin/init
            # Wait for the container to properly boot up, otherwise we were
            # running following dnf commands during the initializing/starting
            # (early/late bootup) phase, which caused nasty race conditions
            $DOCKER_EXEC bash -c 'systemctl is-system-running --wait || :'
            _retry $DOCKER_EXEC dnf makecache
            # Install necessary build/test requirements
            _retry $DOCKER_EXEC dnf -y --exclude selinux-policy\* upgrade
            _retry $DOCKER_EXEC dnf -y install "${ADDITIONAL_DEPS[@]}"
            _retry $DOCKER_EXEC dnf -y builddep systemd
            ;;
        RUN)
            info "Run phase"
            # Build systemd
            $DOCKER_EXEC meson --werror -Dtests=unsafe -Dslow-tests=true build
            $DOCKER_EXEC ninja -v -C build
            $DOCKER_EXEC ninja -C build test
            ;;
        RUN_CLANG)
            docker exec -e CC=clang -e CXX=clang++ -it $CONT_NAME meson --werror -Dtests=unsafe -Dslow-tests=true -Dman=true build
            $DOCKER_EXEC ninja -v -C build
            $DOCKER_EXEC ninja -C build test
            ;;
        RUN_ASAN|RUN_CLANG_ASAN)
            if [[ "$phase" = "RUN_CLANG_ASAN" ]]; then
                ENV_VARS="-e CC=clang -e CXX=clang++"
                MESON_ARGS="-Db_lundef=false" # See https://github.com/mesonbuild/meson/issues/764
            fi
            docker exec $ENV_VARS -it $CONT_NAME meson --werror -Dtests=unsafe -Db_sanitize=address,undefined $MESON_ARGS build
            $DOCKER_EXEC ninja -v -C build

            # Never remove halt_on_error from UBSAN_OPTIONS. See https://github.com/systemd/systemd/commit/2614d83aa06592aedb.
            travis_wait docker exec --interactive=false \
                -e UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1 \
                -e ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 \
                -e "TRAVIS=$TRAVIS" \
                -t $CONT_NAME \
                meson test --timeout-multiplier=3 -C ./build/ --print-errorlogs
            ;;
        RUN_BUILD_CHECK_GCC|RUN_BUILD_CHECK_CLANG)
            ARGS=(
                "--optimization=0"
                "--optimization=2"
                "--optimization=3"
                "--optimization=s"
                "-Db_lto=true"
                "-Db_ndebug=true"
            )

            if [[ "$phase" = "RUN_BUILD_CHECK_CLANG" ]]; then
                ENV_VARS="-e CC=clang -e CXX=clang++"
                $DOCKER_EXEC clang --version
            else
                $DOCKER_EXEC gcc --version
            fi

            for args in "${ARGS[@]}"; do
                SECONDS=0
                info "Checking build with $args"
                # Redirect meson/ninja logs into separate files, otherwise we
                # would trip over Travis' log size limit
                if ! docker exec $ENV_VARS -it $CONT_NAME meson --werror $args build &> meson.log; then
                    cat meson.log
                    error "meson failed with $args"
                    exit 1
                fi

                if ! $DOCKER_EXEC ninja -v -C build &> ninja.log; then
                    cat ninja.log
                    error "ninja failed with $args"
                    exit 1
                fi

                $DOCKER_EXEC rm -fr build
                rm -f meson.log ninja.log
                success "Build with $args passed in $SECONDS seconds"
            done

            ;;
        CLEANUP)
            info "Cleanup phase"
            docker stop $CONT_NAME
            docker rm -f $CONT_NAME
            ;;
        *)
            error "Unknown phase '$phase'"
            exit 1
    esac
done