Skip to content

Commit

Permalink
Merge pull request #144 from duttonw/chore_updates
Browse files Browse the repository at this point in the history
chore: update requirements to latest versions, update Docker, and include CI/CD publish
  • Loading branch information
duttonw authored Jan 5, 2025
2 parents 567ea49 + f346609 commit 4b4dc62
Show file tree
Hide file tree
Showing 20 changed files with 734 additions and 497 deletions.
27 changes: 27 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[flake8]
# @see https://flake8.pycqa.org/en/latest/user/configuration.html?highlight=.flake8


# Extended output format.
format = pylint

# Show the source of errors.
show_source = True
statistics = True
count = True

max-complexity = 10
max-line-length = 88

# List ignore rules one per line.
ignore =
C901
E501
W503
# Ignore [F401, 403] unused imports - for now
F401
F403
# Ignore [E731] do not assign a lambda expression, use a def - for now
E731
# Ignore: [E721] do not compare types, for exact checks use `is` / `is not`, for instance checks use `isinstance()` - for now
E721
37 changes: 31 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,46 @@
name: Docker Compose Actions Workflow
on: push
on:
push:
workflow_call:

jobs:
test:
runs-on: ubuntu-latest
steps:
# need checkout before using compose-action
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Install requirements
run: pip install flake8 pycodestyle

- name: Check syntax
run: flake8 .

- name: Create folders
run: |
mkdir -p var/{log,screenshots,mail,sms,gcm,downloads,reports}
mkdir -p var/{log,screenshots,mail,sms,gcm,downloads}
mkdir -p reports
chmod -R a+rwX var
- uses: isbang/compose-action@v1.2.0
chmod -R a+rwX reports
- uses: isbang/compose-action@v2.0.1

- name: Test
run: |
docker-compose exec -T behaving behave --junit tests/features
docker compose exec -T behaving behave --junit tests/features
- name: Test Summary
uses: test-summary/action@v2
with:
paths: "reports/TESTS-*.xml"
if: always()

- name: Publish Test Report
uses: mikepenz/action-junit-report@v3
uses: mikepenz/action-junit-report@v5
if: always() # always run even if the previous step fails
with:
report_paths: "**/TESTS-*.xml"
136 changes: 136 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
name: Publish to pypi
on:
push:
#On versioned releases
tags:
- '*.*.*'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
inputs:
force:
type: choice
description: Retry Publish Version
options:
- No
- Yes
environment:
description: 'Deployment environment'
required: true
default: 'pypi'
type: choice
options:
- pypi
- testpypi
dryRun:
description: 'Dry Run deployment (set to false to deploy)'
required: true
type: boolean
default: true



jobs:

validateVersion:
runs-on: ubuntu-latest
if: github.repository == 'ggozad/behaving'
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
with:
python-version: '3.10'

- name: Validate tag version
if: ${{ startsWith(github.ref, 'refs/tags') }}
run: |
TAG_VALUE=${GITHUB_REF/refs\/tags\//}
PYTHON_VERSION=$(grep -E '\b^version\s?=\s?"[^"]+"' pyproject.toml | awk -F '"' '{print $2}')
echo "Tag version is [$TAG_VALUE], Python version is [$PYTHON_VERSION]"
if [ "$TAG_VALUE" != "$PYTHON_VERSION" ]; then
echo "Version mismatch; tag version is [$TAG_VALUE] but Python version is [$PYTHON_VERSION]" >> $GITHUB_STEP_SUMMARY
exit 1
fi
test:
needs: validateVersion
name: Test
uses: ./.github/workflows/ci.yml # Call the reusable workflow

publishSkipped:
if: github.repository != 'ggozad/behaving'
runs-on: ubuntu-latest
steps:
- run: |
echo "## Skipping PyPI publish on downstream repository" >> $GITHUB_STEP_SUMMARY
publish:
needs: test
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
name: Publish Package
runs-on: ubuntu-latest
environment:
name: ${{ github.event.inputs.environment || 'pypi' }}
url: ${{ steps.version.outputs.url }}
concurrency:
group: ${{ github.event.inputs.environment }}-deployment
cancel-in-progress: false
env:
ENVIRONMENT: ${{ github.event.inputs.environment || 'pypi' }}
steps:
- name: Get Git Tag and set url from environment
id: version
run: |
#!/bin/bash
TAG_VALUE=${GITHUB_REF/refs\/tags\//}
echo "version=${TAG_VALUE}" >> $GITHUB_OUTPUT
# Extract the repository name (minus the owner/org)
reponame=$(basename $GITHUB_REPOSITORY)
echo "reponame=${reponame}" >> $GITHUB_OUTPUT
if [ "$env.ENVIRONMENT" == "testpypi" ]; then
url="https://test.pypi.org/project/$reponame/$TAG_VALUE/"
echo "environment=${env.ENVIRONMENT}" >> $GITHUB_OUTPUT
else
url="https://pypi.org/project/$reponame/$TAG_VALUE/"
echo "environment=pypi" >> $GITHUB_OUTPUT
fi
echo "url=${url}" >> $GITHUB_OUTPUT
- name: Checkout repository
uses: actions/checkout@v4

- name: Build package ${{ steps.version.outputs.reponame }} @ ${{ steps.version.outputs.version }}
run: |
pip install build
pip install twine
python -m build
- name: Publish package distributions to PyPI
if: ${{ startsWith(github.ref, 'refs/tags') && steps.version.outputs.environment == 'pypi' && github.event.inputs.dryRun != 'true' }}
uses: pypa/gh-action-pypi-publish@release/v1
# with:
# skip-existing: true
# verbose: true
# print-hash: true
- name: Test Publish package distributions to PyPI
if: ${{ startsWith(github.ref, 'refs/tags') && steps.version.outputs.environment == 'testpypi' && github.event.inputs.dryRun == 'true' }}
uses: pypa/gh-action-pypi-publish@release/v1
with:
repository-url: https://test.pypi.org/legacy/
# skip-existing: true
# verbose: true
# print-hash: true
- name: Summary output
if: ${{ startsWith(github.ref, 'refs/tags') && github.event.inputs.dryRun != 'true' }}
run:
echo "Published ${{ steps.version.outputs.repo_name }} @ ${{ steps.version.outputs.version }} to ${{ steps.version.outputs.url }}" >> $GITHUB_STEP_SUMMARY

- name: (TEST RUN) Test Publish package distributions to PyPI
if: ${{ github.event.inputs.dryRun == 'true' }}
run:
echo "Dry run deployment, did not publish" >> $GITHUB_STEP_SUMMARY
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ __pycache__/
/var/
/dist/
/venv/
/poetry.toml
/poetry.toml
/.idea
/reports
24 changes: 24 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
Changelog
=========

3.2.0 - 2024-01-03
------------------


- Moved from patch-level locks to minimum version checks (ensuring compatibility until major changes break things)
[duttonw]

- Removed Splinters overrides of browsers
- light touch behaving, so it should work with newer versions of splinter
[duttonw]

- Added automatic PyPI version publishing via GitHub (once PyPI OIDC trust to repo is established)
[duttonw]

- Introduced flake8 for code linting
[duttonw]

- Updated GitHub Action `ci.yml` to use the latest versions
[duttonw]

- Added GitHub Action `publish.yml` to allow version push auto publish
[duttonw]


3.1.5 - 2023-04-03
------------------

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ Please refer to _behave_'s excellent
how to use it, how to write your custom steps and make it possible to
extend _behaving_.

### Contributing

See [CONTRIBUTING.rst](./src/behaving/CONTRIBUTING.rst)

## Hello world

Starting to use _behaving_ is pretty easy. Inside some python module,
Expand Down
3 changes: 1 addition & 2 deletions config/selenoid/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,4 @@ ARG DOWNLOAD_VOLUME
RUN apk add gettext

COPY browsers.json.template /etc/selenoid/browsers.json.template
RUN export CHROME_IMAGE=$([ "${BUILDPLATFORM}" = "linux/arm64" ] && echo "sskorol/selenoid_chromium_vnc:100.0" || echo "selenoid/chrome") && \
envsubst < /etc/selenoid/browsers.json.template > /etc/selenoid/browsers.json
RUN envsubst < /etc/selenoid/browsers.json.template > /etc/selenoid/browsers.json
4 changes: 2 additions & 2 deletions config/selenoid/browsers.json.template
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"default": "latest",
"versions": {
"latest": {
"image": "selenoid/firefox:110.0",
"image": "selenoid/firefox:125.0",
"port": "4444",
"path": "/wd/hub",
"tmpfs": { "/tmp": "size=512m" },
Expand All @@ -17,7 +17,7 @@
"default": "latest",
"versions": {
"latest": {
"image": "$CHROME_IMAGE",
"image": "selenoid/chrome:latest",
"port": "4444",
"tmpfs": { "/tmp": "size=512m" },
"volumes": [
Expand Down
11 changes: 7 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
version: "3"
networks:
behaving:
name: behaving

services:
web:
image: nginx
image: nginx:latest
container_name: web
networks:
- behaving
Expand All @@ -28,17 +27,21 @@ services:
user: behaving
container_name: behaving
stdin_open: true
tty: true
depends_on:
- selenoid
volumes:
- ./src:/app/src
- ./tests:/app/tests
- ./var:/app/var
- ./reports:/app/reports

#keep .config/selenoid/browers.json.template in sync
firefox:
image: selenoid/firefox:110.0
image: selenoid/firefox:latest
entrypoint: echo "Only here to make sure the image is available to selenoid"

#keep .config/selenoid/browers.json.template in sync
chrome:
image: selenoid/chrome:latest
entrypoint: echo "Only here to make sure the image is available to selenoid"
Expand Down Expand Up @@ -73,7 +76,7 @@ services:
- "4444:4444"

selenoid-ui:
image: "aerokube/selenoid-ui"
image: "aerokube/selenoid-ui:latest"
networks:
- behaving
ports:
Expand Down
4 changes: 2 additions & 2 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM python:3.9-slim-bullseye
FROM python:3.10-slim-bullseye

ENV DEBIAN_FRONTEND=noninteractive
ENV LC_ALL=C.UTF-8 LANG=C.UTF-8
Expand All @@ -8,7 +8,7 @@ ENV PYTHONDONTWRITEBYTECODE 1
# Do not ever buffer console output
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip poetry pip install supervisor
RUN pip install --upgrade pip && pip install --upgrade poetry && pip install --upgrade supervisor

COPY poetry.lock pyproject.toml README.md config/supervisord.conf .gherkin-lintrc /app/
COPY src /app/src/
Expand Down
2 changes: 1 addition & 1 deletion docker/Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ ENV PYTHONDONTWRITEBYTECODE 1
# Do not ever buffer console output
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip poetry pip install supervisor
RUN pip install --upgrade pip && pip install --upgrade poetry && pip install --upgrade supervisor

COPY poetry.lock pyproject.toml README.md config/supervisord.conf .gherkin-lintrc /app/
COPY src /app/src/
Expand Down
Loading

0 comments on commit 4b4dc62

Please sign in to comment.