Compile Python requirement files for MacOs, Linux or Windows.
- Compile Python requirement files (from requirements.in or pyproject.toml) for MacOs, Linux or Windows.
- Create PRs with the changes.
- Create Artifacts with compiled requirements.
This project will be irrelevant for you if:
- Your entire team uses Docker for development.
- Or you are the sole developer of a project.
- Or your entire team uses the same operating system (MacOs, Linux or Windows).
If none of the statements above qualifies, read further.
When a single project is being worked on by multiple developers, it's useful to streamline the installation process and ensure everyone is using exactly the same package versions.
It's a good practice to compile your input requirements and build your production environment from compiled requirements to prevent unpleasant surprises.
In many cases, pip-tools is your best friend, however, what pip-tools doesn't do is compiling requirements for multiple platforms. It can only compile requirements for the platform it's being executed on.
Software engineering is multi-diverse. Some may find Docker an essential tool, some others won't even bother using it and would prefer to work in a virtual environment.
And then it's your job to make sure everyone is working efficiently and does not accidentally break the project. If a Linux user makes a change in input requirements, you want to make sure requirements are properly compiled for all designated systems so that when a MacOs user pulls the changes and runs the installation script, he immediately has the project up-and-running with properly synchronized package versions.
Required The path to the input file (example: requirements.in).
Required Operating system name (platform slug).
GitHub Token for creating pull requests.
The path to directory to place the compiled requirements (default value: requirements/).
Branch to make a pull request to.
Prefix for the destination compiled filename.
Flag to determine if an artifact should be created (default value: false).
Selectively pick which workflow to run based on what has changed.
- Monitor your input requirement files using
paths
directive. - Do not trigger your main tests on changes in input requirements.
- Trigger your main tests if compiled requirements have changed.
To create a Personal access token (PAT), go to GitHub Settings -> Developer Settings -> Fine-grained tokens and create a new token on your repository with the following permissions:
Actions
: Read and write.Contents
: Read and write.Environments
: Read-only.Pull Requests
: Read and write.Secrets
: Read-only.
Additionally, it might be useful to allow the following too:
Commit statuses
: Read-only.Metadata
: Read-only.
Finally, create a New repository secret
from Secrets and variables
section of your repository Settings
, specify PAT_TOKEN
as Name
and
paste the content of newly created PAT as Secret
.
Makefile example
# Define the name of the virtual environment directory
VENV := venv
# Detect the operating system
ifeq ($(OS),Windows_NT)
detected_OS := Windows
PYTHON := python
VENV_BIN := $(VENV)/Scripts
else
detected_OS := $(shell uname)
PYTHON := python3
VENV_BIN := $(VENV)/bin
endif
# Define the requirement file based on the operating system
ifeq ($(detected_OS),Windows)
REQUIREMENTS_FILE := requirements/windows-latest.txt
else ifeq ($(detected_OS),Darwin)
REQUIREMENTS_FILE := requirements/macos-latest.txt
else ifeq ($(detected_OS),Linux)
REQUIREMENTS_FILE := requirements/ubuntu-latest.txt
endif
# Default target
all: install
# Create a virtual environment
venv: $(VENV_BIN)/activate
# Virtual environment creation
$(VENV_BIN)/activate:
$(PYTHON) -m venv $(VENV)
# Install requirements into the virtual environment
install: venv
$(VENV_BIN)/pip install -r $(REQUIREMENTS_FILE)
# Enter virtual environment shell
shell: venv
$(VENV_BIN)/python
pip-list: venv
$(VENV_BIN)/pip list
# Clean the virtual environment
clean:
rm -rf $(VENV)
.PHONY: install venv clean
.github/workflows/test-action.yml
name: Test Compile Requirements Action
on:
push:
paths:
- 'examples/requirements.in'
- 'examples/pyproject.toml'
- '.github/workflows/test-action.yml'
- 'action.yml'
permissions:
contents: write
pull-requests: write
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ # See this as an example
ubuntu-latest,
ubuntu-22.04,
ubuntu-20.04,
windows-latest,
windows-2022,
windows-2019,
macos-latest,
macos-13,
macos-12,
macos-11,
]
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Set up platform-specific variables
id: vars
shell: bash
run: |
OS_NAME=$(echo ${{ matrix.os }} | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-zA-Z0-9]+/-/g')
echo "PLATFORM_SLUG=${OS_NAME%}" >> $GITHUB_ENV
echo "TARGET_BRANCH=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_ENV
- name: Run Compile and PR Requirements Action
uses: barseghyanartur/compile-python-requirements-action@0.1
with:
input-file: 'examples/requirements.in'
os-name: ${{ env.PLATFORM_SLUG }}
github-token: ${{ secrets.PAT_SECRET }}
output-directory: 'examples/requirements' # Optional
prefix: '' # Optional
# Optional. Pass the target branch to the action
target-branch: ${{ env.TARGET_BRANCH }}
create-artifact: 'true' # Optional
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: requirements-${{ env.PLATFORM_SLUG }}
path: examples/requirements/requirements.tar.gz
if-no-files-found: 'warn'
MIT
For security issues contact me at the e-mail given in the Author section.
For overall issues, go to GitHub issues.
Artur Barseghyan