You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.4 KiB
190 lines
6.4 KiB
name: Install
|
|
|
|
on:
|
|
- push
|
|
- pull_request
|
|
|
|
jobs:
|
|
create-release:
|
|
name: Create release
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
upload-url: ${{ steps.create-release.outputs.upload_url }}
|
|
steps:
|
|
- name: Create Release
|
|
id: create-release
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: actions/create-release@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: ${{ github.ref }}
|
|
release_name: Infer version ${{ github.ref }}
|
|
draft: true
|
|
prerelease: false
|
|
body: |
|
|
BEFORE PUBLISHING CHECKLIST:
|
|
1. From the commit tagged on GitHub, create and push a new version of the website with "make new-website-version" (see website/README.md for how to test).
|
|
2. Consider deleting the oldest documentation version (see Docusaurus 2 documentation for details).
|
|
3. Fill in the changelog below to go on GitHub.
|
|
4. Download the release tarballs and test that the binaries works.
|
|
5. Fill in the shasums by running the command at the end of the release text.
|
|
--- PUBLISH GITHUB RELEASE HERE ---
|
|
6. At some point, copy the GitHub changelog to Changelog.md in the repo.
|
|
7. Tweet.
|
|
--- DELETE EVERYTHING ABOVE THIS LINE ---
|
|
|
|
This is a binary release of Infer for Linux and MacOS. To use it follow these [instructions](http://fbinfer.com/docs/getting-started).
|
|
|
|
- new feature 1
|
|
- new feature 2
|
|
|
|
The sha256 checksums of the tarballs are:
|
|
```
|
|
$ shasum -a 256 infer-*-v<VERSION GOES HERE>.tar.xz
|
|
DOWNLOAD BOTH TARBALLS AND PUT RESULT OF THE ABOVE COMMAND HERE BEFORE PUBLISHING
|
|
```
|
|
|
|
build:
|
|
name: Build Infer
|
|
needs: create-release
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os:
|
|
- macOS-latest
|
|
- ubuntu-latest
|
|
ocaml-version:
|
|
- 4.11.1
|
|
runs-on: ${{ matrix.os }}
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v2
|
|
|
|
- name: Install Required Apt Packages for Ubuntu
|
|
run: |
|
|
sudo apt install libmpfr-dev libsqlite3-dev ninja-build
|
|
sudo apt clean
|
|
if: runner.os == 'Linux'
|
|
|
|
- name: Install Required Brew Packages for MacOS
|
|
run: brew install automake jq ninja pkg-config
|
|
if: runner.os == 'macOS'
|
|
|
|
- name: Compute hash of clang installation
|
|
id: clang-hash
|
|
run: |
|
|
echo "::set-output name=value::$(./facebook-clang-plugins/clang/setup.sh --clang-hash)"
|
|
|
|
- name: Attempt to get clang from the cache
|
|
id: cache-clang
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: facebook-clang-plugins/clang/install
|
|
key: clang-${{ runner.os }}-${{ steps.clang-hash.outputs.value }}
|
|
|
|
- name: Record that the clang cache was hit
|
|
if: steps.cache-clang.outputs.cache-hit == 'true'
|
|
run: ./facebook-clang-plugins/clang/setup.sh --only-record-install
|
|
|
|
- name: Build clang on cache misses
|
|
if: steps.cache-clang.outputs.cache-hit != 'true'
|
|
run: |
|
|
./facebook-clang-plugins/clang/src/prepare_clang_src.sh
|
|
./facebook-clang-plugins/clang/setup.sh --ninja --sequential-link
|
|
|
|
- name: Attempt to get opam tree from the cache
|
|
uses: actions/cache@v2
|
|
with:
|
|
path: ~/.opam
|
|
key: opam-${{ runner.os }}-${{ hashFiles('opam.locked') }}
|
|
|
|
- name: Use OCaml ${{ matrix.ocaml-version }}
|
|
uses: avsm/setup-ocaml@v1
|
|
with:
|
|
ocaml-version: ${{ matrix.ocaml-version }}
|
|
|
|
- run: ./build-infer.sh --yes all
|
|
|
|
- run: make install BUILD_MODE=opt
|
|
if: runner.os == 'macOS'
|
|
|
|
- run: |
|
|
sudo make install BUILD_MODE=opt
|
|
# restore permissions after root build
|
|
sudo chown $USER: -R .
|
|
if: runner.os == 'Linux'
|
|
|
|
- name: Test infer
|
|
run: |
|
|
eval $(opam env)
|
|
|
|
{
|
|
echo 'class FailingTest {'
|
|
echo ' String mayReturnNull(int i) {'
|
|
echo ' if (i > 0) {'
|
|
echo ' return "Hello, Infer!";'
|
|
echo ' }'
|
|
echo ' return null;'
|
|
echo ' }'
|
|
echo ' int mayCauseNPE() {'
|
|
echo ' String s = mayReturnNull(0);'
|
|
echo ' return s.length();'
|
|
echo ' }'
|
|
echo '}'
|
|
} > FailingTest.java
|
|
|
|
{
|
|
echo " class PassingTest {"
|
|
echo " String mayReturnNull(int i) {"
|
|
echo " if (i > 0) {"
|
|
echo ' return "Hello, Infer!";'
|
|
echo " }"
|
|
echo " return null;"
|
|
echo " }"
|
|
echo " int mayCauseNPE() {"
|
|
echo " String s = mayReturnNull(0);"
|
|
echo " return s == null ? 0 : s.length();"
|
|
echo " }"
|
|
echo " }"
|
|
} > PassingTest.java
|
|
|
|
# first command should exit with status 2
|
|
infer --fail-on-issue -P -- javac FailingTest.java || if [[ $? -ne 2 ]]; then exit 1; fi
|
|
infer --fail-on-issue -P -- javac PassingTest.java
|
|
|
|
{
|
|
echo "#include <stdio.h>"
|
|
echo "int main()"
|
|
echo "{ int *s = NULL; *s = 42; return 0; } "
|
|
} > FailingTest.c
|
|
|
|
{
|
|
echo "#include <stdio.h>"
|
|
echo "int main()"
|
|
echo "{ int *s = NULL; if (s != NULL) { *s = 42; } return 0; }"
|
|
} > PassingTest.c
|
|
|
|
# first command should exit with status 2
|
|
infer --fail-on-issue -P -- clang -c FailingTest.c || if [[ $? -ne 2 ]]; then exit 1; fi
|
|
infer --fail-on-issue -P -- clang -c PassingTest.c
|
|
|
|
- name: Build release tarball
|
|
id: build-release
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
run: |
|
|
./scripts/create_binary_release.sh "$(echo '${{ github.ref }}' | rev | cut -d / -f 1 | rev)"
|
|
|
|
- name: Upload Release Asset
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: actions/upload-release-asset@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
upload_url: ${{ needs.create-release.outputs.upload-url }}
|
|
asset_path: ${{ steps.build-release.outputs.tarball-path }}
|
|
asset_name: ${{ steps.build-release.outputs.tarball-path }}
|
|
asset_content_type: application/x-gtar
|