aboutsummaryrefslogtreecommitdiff
path: root/binary_search_tool/cros_pkg/README.cros_pkg_triage.md
blob: 17121dd71226c6b1be453ca11be6d71df8ec9ac3 (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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# CrOS's binary search tool

`binary_search_state.py` is a general binary search triage tool that
performs a binary search on a set of things to try to identify which
thing or thing(s) in the set is 'bad'.  `binary_search_state.py` assumes
that the user has two sets, one where everything is known to be good,
ane one which contains at least one bad item.  `binary_search_state.py`
then copies items from the good and bad sets into a working set and
tests the result (good or bad).  `binary_search_state.py` requires that
a set of scripts be supplied to it for any particular job.  For more
information on `binary_search_state.py`, see

https://sites.google.com/a/google.com/chromeos-toolchain-team-home2/home/team-tools-and-scripts/binary-searcher-tool-for-triage

This particular set of scripts is designed to work wtih
`binary_search_state.py` in order to find the bad package or set of
packages in a ChromeOS build.


## QUICKSTART

After setting up your 3 build trees (see Prerequisites section), do the
following:

-   Decide which test script to use (`boot_test.sh` or
    `interactive_test.sh`)
-   Get the IP name or address of the chromebook you will use for testing.
-   Do the following inside your chroot:

    ```
    $ cd ~/trunk/src/third_party/toolchain_utils/binary_search_tool
    $ ./cros_pkg/setup.sh <board-to-test> <IP-name-or-address-of-chromebook>
    ```

    If you chose the boot test, then:

    ```
    $ python ./binary_search_state.py \
        --get_initial_items=cros_pkg/get_initial_items.sh \
        --switch_to_good=cros_pkg/switch_to_good.sh \
        --switch_to_bad=cros_pkg/switch_to_bad.sh \
        --test_setup_script=cros_pkg/test_setup.sh \
        --test_script=cros_pkg/boot_test.sh \
        --file_args \
        --prune
    ```

    Otherwise, if you chose the interactive test, then:

    ```
    $ python ./binary_search_state.py \
        --get_initial_items=cros_pkg/get_initial_items.sh \
        --switch_to_good=cros_pkg/switch_to_good.sh \
        --switch_to_bad=cros_pkg/switch_to_bad.sh \
        --test_setup_script=cros_pkg/test_setup.sh \
        --test_script=cros_pkg/interactive_test.sh \
        --file_args \
        --prune
    ```

    Once you have completely finished doing the binary search/triage,
    run the genereated cleanup script, to restore your chroot to the state
    it was in before you ran the `setup.sh` script:

    ```
    $ cros_pkg/${BOARD}_cleanup.sh
    ```


## FILES AND SCRIPTS

`boot_test.sh` - One of two possible test scripts used to determine
                 if the ChromeOS image built from the packages is good
                 or bad.  This script tests to see if the image
                 booted, and requires no user intervention.

`create_cleanup_script.py` - This is called by setup.sh, to
                             generate ${BOARD}_cleanup.sh,
                             which is supposed to be run by the user
                             after the binary search triage process is
                             finished, to undo the changes made by
                             setup.sh and return everything
                             to its original state.

`get_initial_items.sh` - This script is used to determine the current
                         set of ChromeOS packages.

`test_setup.sh` - This script will build and flash your image to the
                  remote machine. If the flash fails, this script will
                  help the user troubleshoot by flashing through usb or
                  by retrying the flash over ethernet.

`interactive_test.sh` - One of two possible scripts used to determine
                        if the ChromeOS image built from the packages
                        is good or bad.  This script requires user
                        interaction to determine if the image is
                        good or bad.

`setup.sh` - This is the first script the user should call, after
             taking care of the prerequisites.  It sets up the
             environment appropriately for running the ChromeOS
             package binary search triage, and it generates two
             necessary scripts (see below).

`switch_to_bad.sh` - This script is used to copy packages from the
                     'bad' build tree into the work area.

`switch_to_good.sh` - This script is used to copy packages from the
                      'good' build tree into the work area.


## GENERATED SCRIPTS

`common.sh`  - contains basic environment variable definitions for
               this binary search triage session.

`${BOARD}_cleanup.sh` - script to undo all the changes made by
                        running setup.sh, and returning
                        everything to its original state. The user
                        should manually run this script once the
                        binary search triage process is over.

## ASSUMPTIONS

-   There are two different ChromeOS builds, for the same board, with the
    same set of ChromeOS packages.  One build creates a good working ChromeOS
    image and the other does not.

-   You have saved the complete build trees for both the good and bad builds.


## PREREQUISITES FOR USING THESE SCRIPTS (inside the chroot)

-   The "good" build tree, for the board, is in /build/${board}.good
    (e.g. /build/lumpy.good or /build/daisy.good).

-   The "bad" build tree is in /build/${board}.bad
    (e.g. /build/lumpy.bad or /build/daisy.bad).

-   You made a complete copy of the "bad" build tree , and put it in
    /build/${board}.work (e.g. /build/lumpy.work or /build/daisy.work.
    The easiest way to do this is to use something similar to the
    following set of commands (this example assumes the board is
    'lumpy'):

    ```
    $ cd /build
    $ sudo tar -cvf lumpy.bad.tar lumpy.bad
    $ sudo mv lumpy.bad lumpy.work
    $ sudo tar -xvf lumpy.bad.tar
    ```


## USING THESE SCRIPTS FOR BINARY TRIAGE OF PACKAGES

To use these scripts, you must first run setup.sh, passing it two
arguments (in order): the board for which you are building the image;
and the name or ip address of the chromebook you want to use for
testing your chromeos images.  setup.sh will do the following:

-   Verify that your build trees are set up correctly (with good, bad and work).
-   Create a soft link for /build/${board} pointing to the work build tree.
-   Create the common.sh file that the other scripts passed to the binary triage
    tool will need.
-   Create a cleanup script, ${board}_cleanup.sh, for you to run after you are
    done with the binary triages, to undo all of these various changes that
    setup.sh did.

This set of scripts comes with two alternate test scripts.  One test
script, `boot_test.sh`, just checks to make sure that the image
booted (i.e. responds to ping) and assumes that is enough.  The other
test script, `interactive_test.sh`, is interactive and asks YOU
to tell it whether the image on the chromebook is ok or not (it
prompts you and waits for a response).


Once you have run `setup.sh` (and decided which test script you
want to use) run the binary triage tool using these scripts to
isolate/identify the bad package:

```
~/trunk/src/third_party/toolchain_utils/binary_search_tool/binary_search_state.py \
    --get_initial_items=cros_pkg/get_initial_items.sh \
    --switch_to_good=cros_pkg/switch_to_good.sh \
    --switch_to_bad=cros_pkg/switch_to_bad.sh \
    --test_setup_script=cros_pkg/test_setup.sh \
    --test_script=cros_pkg/boots_test.sh \  # could use interactive_test.sh instead
    --prune
```

After you have finished running the tool and have identified the bad
package(s), you will want to run the cleanup script that `setup.sh`
generated (`cros_pkg/${BOARD}_cleanup.sh`).