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

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.html).
- 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