action.yml (124 lines of code) (raw):

name: Pysa Action author: Meta description: Analyze data flows and detect security and privacy issues in Python code branding: icon: 'search' color: 'orange' inputs: repo-directory: description: Path to the python source code you want to analyze. If you want to analyze the root of your repo, use './' required: true requirements-path: description: Path to requirements file, relative to `repo-directory`, to look for dependencies. Default will look for requirements.txt in the root of repo-directory required: true default: "requirements.txt" use-nightly: description: Use nightly (unstable) version of Pysa required: false type: boolean default: false infer-types: description: Runs pyre infer in-place to add type annotations. Note that this will change your source code during analysis required: false type: boolean default: false # SAPP Inputs sapp-version: description: Version of fb-sapp to be used required: false default: 'latest' sapp-filters-directory: description: Path to your custom SAPP filters required: false include-default-sapp-filters: description: Use SAPP filters packaged with Pysa required: false default: true type: boolean runs: using: "composite" steps: - name: Set up Python uses: actions/setup-python@v2 with: python-version: '>=3.6' - name: Validate repo-directory path run: | if [ ! -d "${{inputs.repo-directory}}" ] || [ -ne "$(ls -A "${{inputs.repo-directory}}")" ]; then echo "Repository path '${{inputs.repo-directory}}' must exist and cannot be empty" exit 1 fi shell: bash - name: Install Pysa # https://github.com/actions/runner/issues/1483 run: | if ${{inputs.use-nightly != 'false'}}; then pip install pyre-check-nightly else pip install pyre-check fi shell: bash - name: Install dependencies working-directory: ${{inputs.repo-directory}} run: | if ${{inputs.requirements-path != ''}} && [ -f ${{inputs.requirements-path}} ]; then pip install -r ${{inputs.requirements-path}} else echo 'Path '${{inputs.repo-directory}}/${{inputs.requirements-path}}' does not exist' exit 1 fi shell: bash - name: Prepare SAPP filters directory run: | filters_path='tmp/sapp_filters' mkdir -p $filters_path if ${{inputs.sapp-filters-directory != ''}}; then echo 'Copying custom sapp filters to temporary directory' cp -r ${{inputs.sapp-filters-directory}}/* $filters_path fi if ${{inputs.include-default-sapp-filters == 'true'}}; then echo 'Copying default sapp filters to temporary directory' cp -r ${{env.LD_LIBRARY_PATH}}/pyre_check/pysa_filters/* $filters_path fi if ! [[ "$(ls -A "$filters_path")" ]]; then echo 'Using neither custom sapp filters or default sapp filters' echo '{ "name": "Pass through filter", "description": "Shows all issues", "paths": ["%"] }' > $filters_path/empty_filter.json fi echo "SAPP_FILTERS_PATH=$filters_path" >> $GITHUB_ENV shell: bash - name: Set up Pyre working-directory: ${{inputs.repo-directory}} run: | if [ ! -f .pyre_configuration ]; then echo '{ "source_directories": ["."], "taint_models_path": "${{env.LD_LIBRARY_PATH}}" }' > .pyre_configuration fi shell: bash - name: Run Pyre Infer working-directory: ${{inputs.repo-directory}} if: ${{inputs.infer-types == 'true'}} run: | pyre infer pyre infer -i --annotate-from-existing-stubs shell: bash - name: Run Pysa working-directory: ${{inputs.repo-directory}} run: | pyre analyze --no-verify --save-results-to=./pysa-output shell: bash - name: Saving Pysa results for SAPP uses: actions/upload-artifact@v2 with: name: pysa-results path: ${{inputs.repo-directory}}/pysa-output if-no-files-found: error - name: Postprocess Pysa results with SAPP uses: facebook/sapp-action@main with: version: ${{inputs.sapp-version}} artifact-handle: pysa-results filters-directory: ${{env.SAPP_FILTERS_PATH}}