Skip to main content

GameDevTools

License Python


Overview ✅

GameDevTools is a collection of Python tools and utilities used in the game development


Table of Contents 📚


Features ✨

  • Modules to copy a folder or files to a remote location or cloud drive (Amazon S3)

Requirements ⚙️

  • Python 3.10 or newer

Usage Examples 🔧

  • uepyscripts.tools.archives.rotate_archives : this module allows to archive the result of packaging your game, in a shared folder. The arguments are:

    • directory_path : The folder where to archive the packages. Note that this module will copy the archives in a sub-folder named after the current date with the format YYYYMMdd. If a folder already exists with the same date, it will suffix with an incrementing counter _XX
    • keep_count : How many versions of the packages you want to keep in directory_path. This will remove the extraneous sub-folders to only keep keep_count items.
    • folder_output_file_name : Path to a text file where to write the path to the folder where the archive was copied. This is useful if you plan to use this folder for other tasks, such as sending a message in slack, or uploading the archives to an amazon S3 bucket
  • uepyscripts.tools.archives.upload_archives : this module allows to upload to an amazon S3 bucket all the files inside a folder. The arguments are:

    • local_folder : The folder where to find the files to upload
    • bucket_name : The S3 bucket name
    • region : The region of the bucket
    • access_key and secret_key : The keys to access the bucket
    • destination_folder : The folder where to upload in the bucket. As with rotate_archives, a sub-folder with the date will be used, and if the folder exists, a suffix will be added.
    • keep_count : Same as with rotate_archives, this is used to control how many archives you want to keep.
    • output_file : Path to a text file where the uploaded files URLs will be stored. This can be used in your jenkinsfile to be sent to a slack channel for example.

Here's an example of how we use these 2 modules in our jenkinsfiles:

stage( 'Rotate Archives' ) {
    pwsh """
        . "Scripts/.venv/Scripts/gamedevtools-archives-rotate.exe" `
          --directory_path = "//nas/Versions/OurGame/Development/WIP" `
          --keep_count = "-1" `
          --folder_output_file_name = "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"
    """

    def folder_name = readFile "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"
    slackSend( channel: '#channel', message: "New Development build available : ${folder_name}" )
}

stage( 'Upload Archives' ) {
    def file = readFile "${env.WORKSPACE}/Saved/Temp/latest_archive_Development.txt"

    pwsh """
        . "Scripts/.venv/Scripts/gamedevtools-archives-upload.exe" `
            --local_folder = "${file}" `
            --bucket_name = "artifacts" `
            --region = "eu-west-3" `
            --access_key = "XXXXX" `
            --secret_key = "YYYYY" `
            --destination_folder = "Development/" `
            --keep_count = "-1" `
            --output_file = "${env.WORKSPACE}/Saved/Temp/uploaded_files_Development.txt" `
    """

    def uploaded_files = readFile "${env.WORKSPACE}/Saved/Temp/uploaded_files_Development.txt"
    def lines = uploaded_files.split('\n')

    if ( lines.size() > 0 ) {
        def message = 'Uploaded builds:\n'

        lines.each { String line ->
            def parts = line.split(' : ', 2)
            if (parts.size() == 2) {
                def url = parts[0].trim()
                def filename = parts[1].trim()
                message += "<${url}|${filename}>\n"
            }
        }

        slackSend( channel: '#channel', message: message )
    } else {
        slackSend( channel: '#channel', color: 'danger', message: 'No files were uploaded' )
    }
}

Development & Testing 🧪

  • Setup dev environment and install dependencies:

    .\setup_venv.ps1
    .\.venv\Scripts\Activate.ps1
    
  • Linting & formatting

    • Use ruff check ., ruff format . and mypy .

Contribution Guide 🤝

We welcome contributions — please follow these steps:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-change
  3. Run lint locally
  4. Submit a pull request describing the change

Support & Troubleshooting ❓

  • Check Config/ and uepyscripts/internal/config.py for project-specific settings.
  • If buildgraph fails, ensure Config/Project has a valid BuildgraphPath and the UAT tool is accessible.
  • When reporting issues, include:
    • Python version
    • Unreal Engine version
    • Exact command and full logs

License & Credits 📝

License: MIT — see the LICENSE file.

Maintainers: Michael Delva and contributors (see AUTHORS or repository metadata).

Changelog: See CHANGELOG.md


Made with ❤️ for Game Dev developers — contributions and feedback are welcome! If this helped you, consider starring the repository. ⭐

Metadata

Release files for GameDevTools 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for GameDevTools 1.2.0
File Interpreter ABI Platform
gamedevtools-1.2.0-py3-none-any.whl Python 3 none any Details

Release files / gamedevtools-1.2.0-py3-none-any.whl

Download URL gamedevtools-1.2.0-py3-none-any.whl
Size 13.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0317438a3dac62032edab06d69f5878835f04b7386331f25ca3fc4d8aa24d56a
BLAKE2b-256 checksum
How to use checksums
0c219bad56a03f5f61ceb6fb5dad2415071bf09b49e94e7be2782756320163a0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.0 This release

1 release file

1.1.0

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page