Table of Contents

Managed Gitlab CI: Python Example

General Information

If using GitLab.com, you can take advantage of their managed job runners with no setup beyond creating the gitlab-ci file.

This is an example of testing python code.

Checklist


Enable Shared Runners

Shared runners should be on by default for your project, but verify they are:


CI File Examples

The .gitlab-ci.yml file belongs in the root of your project.

Create, commit and push the file to your project.


Python CI with Pip Installs

.gitlab-ci.yml
---
# GitLab CI Job
# Check python files syntax and security
 
# Docker image python 3.7
image: python:3.7
 
# Change pip's cache directory to be inside the project directory since we can
# only cache local items.
variables:
    PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
 
# Pip's cache doesn't store the python packages
# To also cache the installed packages, install
# them in a virtualenv and cache it as well.
# This allows multiple stages to use the same venv.
cache:
    paths:
        - .cache/pip
        - venv/
 
# Setup the Python virtualenv
before_script:
    - python -V
    - pip install virtualenv
    - virtualenv venv
    - source venv/bin/activate

stages:
    - build
    - test

build:install packages:
    # Install required packages for testing
    stage: build
    script: pip install bandit black

test:script syntax:
    # Check syntax and formatting
    stage: test
    script: black --check *.py

test:test script security:
    # Check for security issues - warn about them
    stage: test
    allow_failure: true
    script: bandit --recursive *.py
...

Python CI no installs

.gitlab-ci.yml
---
# GitLab CI Job
# Check python files syntax and security
 
# Docker image based on latest python 3
image: whowe/py3tester

stages:
    - build
    - test

build:verify packages:
    # Verify required packages for testing
    stage: build
    script:
        - "which bandit"
        - "which black"

test:script syntax:
    # Check syntax and formatting
    stage: test
    script:
        - "black --check *.py"
        - "black --check unit-tests/*.py"

test:test script security:
    # Check for security issues - warn about them
    stage: test
    allow_failure: true
    script: "bandit --recursive *.py"
...