|
1 | 1 | # vim:ts=2:sw=2:et:ai:sts=2 |
2 | 2 | name: 'Build' |
3 | 3 |
|
4 | | -on: ['push', 'pull_request'] |
| 4 | +on: |
| 5 | + push: |
5 | 6 |
|
6 | 7 | jobs: |
7 | | - test: |
8 | | - name: 'Test' |
| 8 | + # Build the RocksDB C library and cache the result. |
| 9 | + librocksdb: |
| 10 | + name: 'Build librocksdb' |
9 | 11 | runs-on: ${{ matrix.os }} |
| 12 | + env: |
| 13 | + LIBROCKSDB_PATH: /opt/rocksdb-${{ matrix.rocksdb_ver }} |
10 | 14 | strategy: |
11 | 15 | matrix: |
12 | 16 | os: [ubuntu-latest] |
13 | | - #py_ver: ['3.7', '3.8', '3.9'] |
14 | | - #rocksdb_ver: ['v6.14.6', 'v6.11.4', 'v5.17.2'] |
15 | | - py_ver: ['3.9'] |
16 | | - rocksdb_ver: ['v6.14.6'] |
| 17 | + rocksdb_ver: ['v6.14.6', 'v6.11.4'] |
17 | 18 |
|
18 | 19 | steps: |
19 | | - - uses: actions/checkout@v2 |
20 | | - name: 'Checkout source repository' |
21 | | - |
22 | | - - uses: actions/setup-python@v2 |
23 | | - name: 'Set up Python ${{ matrix.py_ver }}' |
| 20 | + - uses: actions/cache@v2 |
| 21 | + id: cache-librocksdb |
24 | 22 | with: |
25 | | - python-version: ${{ matrix.py_ver }} |
| 23 | + key: ${{ matrix.os }}-librocksdb-${{ matrix.rocksdb_ver }} |
| 24 | + path: ${{ env.LIBROCKSDB_PATH }} |
26 | 25 |
|
27 | 26 | - name: 'Install dependencies' |
28 | | - run: | |
29 | | - sudo apt install -y libsnappy-dev libbz2-dev liblz4-dev libz-dev libgflags-dev libzstd-dev |
30 | | -
|
31 | | - - name: 'Install RocksDB ${{ matrix.rocksdb_ver }}' |
32 | | - run: | |
33 | | - pushd /opt && |
34 | | - git clone https://github.com/facebook/rocksdb && |
35 | | - cd rocksdb && |
36 | | - git reset --hard ${{ matrix.rocksdb_ver }} && |
| 27 | + if: steps.cache-librocksdb.outputs.cache-hit != 'true' |
| 28 | + run: > |
| 29 | + sudo apt install -y libsnappy-dev libbz2-dev liblz4-dev libz-dev |
| 30 | + libgflags-dev libzstd-dev |
| 31 | +
|
| 32 | + - name: 'Clone & build RocksDB ${{ matrix.rocksdb_ver }}' |
| 33 | + if: steps.cache-librocksdb.outputs.cache-hit != 'true' |
| 34 | + run: > |
| 35 | + git clone https://github.com/facebook/rocksdb --depth 1 |
| 36 | + --branch ${{ matrix.rocksdb_ver }} ${{ env.LIBROCKSDB_PATH }} && |
| 37 | + pushd ${{ env.LIBROCKSDB_PATH }} && |
37 | 38 | CXXFLAGS='-flto -Os -s' PORTABLE=1 make shared_lib -j 4 && |
38 | | - make shared_lib && |
39 | | - sudo make install-shared && |
40 | 39 | popd |
41 | 40 |
|
42 | | - - name: Install python-rocksdb |
43 | | - run: | |
44 | | - sudo python3 setup.py install |
45 | | -
|
46 | | - - name: Run tests |
47 | | - run: | |
48 | | - python3 setup.py test |
49 | | -
|
50 | | - build_wheels: |
51 | | - name: 'Build wheels' |
52 | | - runs-on: ubuntu-latest |
| 41 | + test: |
| 42 | + name: 'Build and test python-rocksdb' |
| 43 | + needs: librocksdb |
| 44 | + runs-on: ${{ matrix.os }} |
| 45 | + env: |
| 46 | + LIBROCKSDB_PATH: /opt/rocksdb-${{ matrix.rocksdb_ver }} |
| 47 | + strategy: |
| 48 | + matrix: |
| 49 | + os: [ubuntu-latest] |
| 50 | + py_ver: ['3.7', '3.8', '3.9'] |
| 51 | + rocksdb_ver: ['v6.14.6', 'v6.11.4'] |
53 | 52 |
|
54 | 53 | steps: |
55 | 54 | - uses: actions/checkout@v2 |
56 | 55 | name: 'Checkout source repository' |
57 | 56 |
|
58 | 57 | - uses: actions/setup-python@v2 |
59 | | - name: 'Set up Python 3.9' |
| 58 | + name: 'Set up Python ${{ matrix.py_ver }}' |
60 | 59 | with: |
61 | | - python-version: '3.9' |
62 | | - |
63 | | - - name: 'Install cibuildwheel' |
64 | | - run: | |
65 | | - python3 -m pip install cibuildwheel==1.7.1 |
| 60 | + python-version: ${{ matrix.py_ver }} |
66 | 61 |
|
67 | | - - name: 'Build wheels' |
68 | | - run: | |
69 | | - python3 -m cibuildwheel --output-dir dist |
70 | | - env: |
71 | | - ROCKSDB_VERSION: 'v6.14.6' |
72 | | - CIBW_MANYLINUX_X86_64_IMAGE: 'manylinux2014' |
73 | | - CIBW_BUILD: 'cp3*' |
74 | | - CIBW_SKIP: '*-manylinux_i686' |
75 | | - CIBW_TEST_REQUIRES: '.[test] pytest' |
76 | | - CIBW_TEST_COMMAND: 'python3 -m pytest {project}/rocksdb/tests' |
77 | | - CIBW_BEFORE_BUILD: | |
78 | | - yum install -y bzip2-devel lz4-devel snappy-devel zlib-devel && |
79 | | - pushd /opt && |
80 | | - git clone https://github.com/facebook/rocksdb && |
81 | | - cd rocksdb && |
82 | | - git reset --hard $ROCKSDB_VERSION && |
83 | | - CXXFLAGS='-flto -Os -s' PORTABLE=1 make shared_lib -j 4 && |
84 | | - make install-shared && |
85 | | - popd |
| 62 | + - name: 'Install C libraries' |
| 63 | + # XXX(Tina): The non-development versions are sufficient, but package |
| 64 | + # names are difficult to predict. |
| 65 | + run: > |
| 66 | + sudo apt install -y libsnappy-dev libbz2-dev liblz4-dev libz-dev |
| 67 | + libgflags-dev libzstd-dev |
86 | 68 |
|
87 | | - - uses: actions/upload-artifact@v2 |
88 | | - name: 'Upload build artifacts' |
| 69 | + # Recover the pre-built C library. |
| 70 | + - uses: actions/cache@v2 |
| 71 | + id: cache-librocksdb |
89 | 72 | with: |
90 | | - path: 'dist/*.whl' |
91 | | - |
| 73 | + key: ${{ matrix.os }}-librocksdb-${{ matrix.rocksdb_ver }} |
| 74 | + path: ${{ env.LIBROCKSDB_PATH }} |
92 | 75 |
|
93 | | - build_sdist: |
94 | | - name: 'Build source distribution' |
95 | | - runs-on: 'ubuntu-latest' |
96 | | - steps: |
97 | | - - uses: actions/checkout@v2 |
98 | | - name: 'Checkout source repository' |
99 | | - |
100 | | - - uses: actions/setup-python@v2 |
101 | | - name: 'Set up Python 3.9' |
102 | | - with: |
103 | | - python-version: '3.9' |
104 | | - |
105 | | - - name: 'Build sdist' |
| 76 | + - name: 'Install RocksDB ${{ matrix.rocksdb_ver }}' |
| 77 | + if: steps.cache-librocksdb.outputs.cache-hit == 'true' |
| 78 | + # DO NOT FORGET to call `ldconfig`! |
106 | 79 | run: | |
107 | | - python3 setup.py sdist |
108 | | -
|
109 | | - - uses: actions/upload-artifact@v2 |
110 | | - name: 'Upload build artifacts' |
111 | | - with: |
112 | | - path: 'dist/*.tar.gz' |
| 80 | + pushd ${{ env.LIBROCKSDB_PATH }} && |
| 81 | + sudo make install-shared && |
| 82 | + sudo ldconfig && |
| 83 | + popd |
113 | 84 |
|
| 85 | + - name: Build and install python-rocksdb |
| 86 | + # Use `pip install` instead of `setup.py` so build-dependencies from |
| 87 | + # `pyproject.toml` are installed, in particular `Cython`, without which |
| 88 | + # the build fails in confusing ways. |
| 89 | + run: | |
| 90 | + python3 -m pip install '.[test]' |
114 | 91 |
|
115 | | -# upload_pypi: |
116 | | -# name: 'Upload packages' |
117 | | -# needs: ['build_wheels', 'build_sdist'] |
118 | | -# runs-on: 'ubuntu-latest' |
119 | | -# if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') |
120 | | -# steps: |
121 | | -# - uses: actions/download-artifact@v2 |
122 | | -# name: 'Download artifacts' |
123 | | -# with: |
124 | | -# name: 'artifact' |
125 | | -# path: 'dist' |
126 | | -# |
127 | | -# - uses: pypa/gh-action-pypi-publish@master |
128 | | -# name: 'Publish built packages' |
129 | | -# with: |
130 | | -# user: '__token__' |
131 | | -# password: '${{ secrets.PYPI_API_TOKEN }}' |
| 92 | + - name: Run tests |
| 93 | + # Use `--pyargs` to interpret parameter as module to import, not as a |
| 94 | + # path, and do not use `python3 -m pytest`. This way we prevent |
| 95 | + # importing the module from the current directory instead of the |
| 96 | + # installed package, and failing when it cannot find the shared |
| 97 | + # library. |
| 98 | + run: | |
| 99 | + pytest --pyargs rocksdb |
0 commit comments