Skip to content

Instantly share code, notes, and snippets.

@MichaelCurrie
Last active April 26, 2021 17:18
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save MichaelCurrie/802ce28c993ff2dd632c to your computer and use it in GitHub Desktop.
Save MichaelCurrie/802ce28c993ff2dd632c to your computer and use it in GitHub Desktop.
Automatically fix PEP-8 issues using Travis-CI

PEP-8 is a set of Python style recommendations. pep8 is a module that checks your .py file for violations. To make your Travis-CI build fail if you have any violations, you could add these lines to your .travis.yml:

before_install:
    - pip install pep8
    
script:
    # Run pep8 on all .py files in all subfolders
    # (I ignore "E402: module level import not at top of file"
    # because of use case sys.path.append('..'); import <module>)
    - find . -name \*.py -exec pep8 --ignore=E402 {} +

However, since this makes my build fail for very trivial violations, like extra whitespace after a line of code, I find it isn't practical to include this check unless I also automatically fix any issues. autopep8(https://pypi.python.org/pypi/autopep8) can perform this fix; now let's get Travis-CI to run it after every build, and if there are corrections, commit and push these changes.

language: python
python:
    - 2.7
    - 3.3
    - 3.4
    - 3.5
notifications:
    email: false

before_install:
    - sudo apt-get update
    - sudo apt-get -y install python-pip
    - sudo pip install --upgrade pip
    - pip install --upgrade pip
    - pip install pep8
    - pip install autopep8

script:
    # Run pep8 on all .py files in all subfolders
    # We must ignore E402 module level import not at top of file
    # because of use case sys.path.append('..'); import <module>
    - num_errors_before=`find . -name \*.py -exec pep8 --ignore=E402 {} + | wc -l`
    - echo $num_errors_before

    - cd "$TRAVIS_BUILD_DIR"
    - git config --global user.email "mcurrie@bruceforceresearch.com"
    # From https://help.github.com/articles/setting-your-username-in-git/:
    # "Tip: You don't have to use your real name--any name works. Git 
    # actually associates commits by email address; the username is only 
    # used for identification. If you use your email address associated 
    # with a GitHub account, we'll use your GitHub username, instead of 
    # this name.
    - git config --global user.name "Travis"
    - git checkout $TRAVIS_BRANCH

    - find . -name \*.py -exec autopep8 --recursive --aggressive --aggressive --in-place {} +
    - num_errors_after=`find . -name \*.py -exec pep8 --ignore=E402 {} + | wc -l`
    - echo $num_errors_after

    - |
        if (( $num_errors_after < $num_errors_before )); then
            git commit -a -m "PEP-8 Fix"
            git config --global push.default simple # Push only to the current branch.  
            # Make sure to make the output quiet, or else the API token will 
            # leak!  This works because the API key can replace your password.
            git push --quiet
        fi
    - cd "$TRAVIS_BUILD_DIR"

    # List the remaining errors - these will have to be fixed manually
    - find . -name \*.py -exec pep8 --ignore=E402 {} +

I've so far only tested this on a repository that only I can edit. I'm not totally clear how to get this to work when other people are also making commits. The answer may have to do with these two things, however:

http://stackoverflow.com/questions/23277391/how-to-publish-to-github-pages-from-travis-ci

STEP 1. Get a Personal Access Token under https://github.com/settings/tokens

Only enable "public_repo" access for public repositories, "repo" for private.

Save the token somewhere as you can only see it once.

STEP 2. On the Travis settings for the repository https://travis-ci.org///settings create an environment variable:

GITHUB_API_KEY=<token> and make sure to mark "Display value in build log" as "Off".

This is safe because only authorized pushes by you see such environment variables, so if a malicious user tries to make a pull request to get your string, the variable won't be there.

Just make sure that you never, ever list your environment variables on your build!

http://stackoverflow.com/questions/19845679/build-with-travis-ci-and-push-some-files-folder-to-another-repository

In summary, we can't control the way Travis-ci clones the repository. This means the remote isn't setup with authentication credentials, so we remove the remote, and add the remote with credentials:

cd clonedrepofolder
git remote rm origin
git remote add origin https://username:${GH_TOKEN}@github.com/username/repo.git
@leoyyoung
Copy link

Hi,

Glad to see your travis config with pep8.
I tried your config but I found if there are errors, the travis does not show "Failed", see console log here:
Do you meet this issue? Thx

./src/base/BatmanSBApi.py:12:1: E302 expected 2 blank lines, found 1
./src/base/BatmanSBApi.py:21:1: E302 expected 2 blank lines, found 1
./src/base/BatmanSBApi.py:23:1: W293 blank line contains whitespace
2 E302 expected 2 blank lines, found 1
1 W293 blank line contains whitespace
The command "find . -name *.py -exec pep8 --statistics {} ;" exited with 0.
Done. Your build exited with 0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment