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.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/infer.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 " echo "int main()" echo "{ int *s = NULL; *s = 42; return 0; } " } > FailingTest.c { echo "#include " 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