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