mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-07 06:48:58 +08:00
Merge branch 'main' into CURA-7647-play-simulation-time-dependent
This commit is contained in:
commit
75ff829b5f
156
.github/workflows/conan-package-create.yml
vendored
156
.github/workflows/conan-package-create.yml
vendored
@ -1,156 +0,0 @@
|
|||||||
name: Create and Upload Conan package
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
project_name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
recipe_id_full:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
build_id:
|
|
||||||
required: true
|
|
||||||
type: number
|
|
||||||
|
|
||||||
build_info:
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
recipe_id_latest:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
runs_on:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
python_version:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_config_branch:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_logging_level:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_clean_local_cache:
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
conan_upload_community:
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
env:
|
|
||||||
CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }}
|
|
||||||
CONAN_PASSWORD: ${{ secrets.CONAN_PASS }}
|
|
||||||
CONAN_LOG_RUN_TO_OUTPUT: 1
|
|
||||||
CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }}
|
|
||||||
CONAN_NON_INTERACTIVE: 1
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
conan-package-create:
|
|
||||||
runs-on: ${{ inputs.runs_on }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: ${{ inputs.python_version }}
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements for runner
|
|
||||||
run: pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt
|
|
||||||
# Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Bash)
|
|
||||||
if: ${{ runner.os != 'Windows' }}
|
|
||||||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Powershell)
|
|
||||||
if: ${{ runner.os == 'Windows' }}
|
|
||||||
run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache"
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Bash)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
if: ${{ runner.os != 'Windows' }}
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
$HOME/.conan/data
|
|
||||||
$HOME/.conan/conan_download_cache
|
|
||||||
key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Powershell)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
if: ${{ runner.os == 'Windows' }}
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
C:\Users\runneradmin\.conan\data
|
|
||||||
C:\.conan
|
|
||||||
C:\Users\runneradmin\.conan\conan_download_cache
|
|
||||||
key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache
|
|
||||||
|
|
||||||
- name: Install MacOS system requirements
|
|
||||||
if: ${{ runner.os == 'Macos' }}
|
|
||||||
run: brew install autoconf automake ninja
|
|
||||||
|
|
||||||
# NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest.
|
|
||||||
# This is maybe because grub caches the disk it uses last time, which is recreated each time.
|
|
||||||
- name: Install Linux system requirements
|
|
||||||
if: ${{ runner.os == 'Linux' }}
|
|
||||||
run: |
|
|
||||||
sudo rm /var/cache/debconf/config.dat
|
|
||||||
sudo dpkg --configure -a
|
|
||||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
|
||||||
sudo apt update
|
|
||||||
sudo apt upgrade
|
|
||||||
sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison -y
|
|
||||||
|
|
||||||
- name: Install GCC-13 on ubuntu
|
|
||||||
if: ${{ startsWith(inputs.runs_on, 'ubuntu') }}
|
|
||||||
run: |
|
|
||||||
sudo apt install g++-13 gcc-13 -y
|
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
|
|
||||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
|
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
|
||||||
run: conan profile new default --detect
|
|
||||||
|
|
||||||
- name: Get Conan configuration from branch
|
|
||||||
if: ${{ inputs.conan_config_branch != '' }}
|
|
||||||
run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}"
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Add Cura private Artifactory remote
|
|
||||||
run: conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
|
|
||||||
|
|
||||||
- name: Set GH service account for remote cura-conan-dev
|
|
||||||
run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
|
|
||||||
|
|
||||||
- name: Create the Packages
|
|
||||||
run: conan install ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
if: ${{ always() && inputs.conan_upload_community }}
|
|
||||||
run: conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
|
|
||||||
|
|
||||||
- name: Upload the Package(s) to the private Artifactory
|
|
||||||
if: ${{ always() && ! inputs.conan_upload_community }}
|
|
||||||
run: conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c
|
|
115
.github/workflows/conan-package.yml
vendored
115
.github/workflows/conan-package.yml
vendored
@ -1,27 +1,6 @@
|
|||||||
---
|
|
||||||
name: conan-package
|
name: conan-package
|
||||||
|
|
||||||
# Exports the recipe, sources and binaries for Mac, Windows and Linux and upload these to the server such that these can
|
|
||||||
# be used downstream.
|
|
||||||
#
|
|
||||||
# It should run on pushes against main or CURA-* branches, but it will only create the binaries for main and release branches
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
create_binaries_windows:
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
description: 'create binaries Windows'
|
|
||||||
create_binaries_linux:
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
description: 'create binaries Linux'
|
|
||||||
create_binaries_macos:
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
description: 'create binaries Macos'
|
|
||||||
|
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'plugins/**'
|
- 'plugins/**'
|
||||||
@ -32,15 +11,15 @@ on:
|
|||||||
- 'packaging/**'
|
- 'packaging/**'
|
||||||
- '.github/workflows/conan-*.yml'
|
- '.github/workflows/conan-*.yml'
|
||||||
- '.github/workflows/notify.yml'
|
- '.github/workflows/notify.yml'
|
||||||
- '.github/workflows/requirements-conan-package.txt'
|
- '.github/workflows/requirements-runner.txt'
|
||||||
- 'requirements*.txt'
|
- 'requirements*.txt'
|
||||||
- 'conanfile.py'
|
- 'conanfile.py'
|
||||||
- 'conandata.yml'
|
- 'conandata.yml'
|
||||||
- 'GitVersion.yml'
|
|
||||||
- '*.jinja'
|
- '*.jinja'
|
||||||
branches:
|
branches:
|
||||||
- main
|
- 'main'
|
||||||
- 'CURA-*'
|
- 'CURA-*'
|
||||||
|
- 'PP-*'
|
||||||
- '[0-9].[0-9]'
|
- '[0-9].[0-9]'
|
||||||
- '[0-9].[0-9][0-9]'
|
- '[0-9].[0-9][0-9]'
|
||||||
tags:
|
tags:
|
||||||
@ -51,95 +30,17 @@ on:
|
|||||||
env:
|
env:
|
||||||
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
||||||
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
||||||
CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }}
|
|
||||||
CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }}
|
|
||||||
CONAN_LOG_RUN_TO_OUTPUT: 1
|
|
||||||
CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }}
|
|
||||||
CONAN_NON_INTERACTIVE: 1
|
|
||||||
|
|
||||||
permissions: { }
|
|
||||||
jobs:
|
jobs:
|
||||||
conan-recipe-version:
|
conan-recipe-version:
|
||||||
permissions:
|
uses: ultimaker/cura-workflows/.github/workflows/conan-recipe-version.yml@main
|
||||||
contents: read
|
|
||||||
|
|
||||||
uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main
|
|
||||||
with:
|
with:
|
||||||
project_name: cura
|
project_name: cura
|
||||||
|
|
||||||
conan-package-create-linux:
|
conan-package-export:
|
||||||
needs: [ conan-recipe-version ]
|
needs: [ conan-recipe-version ]
|
||||||
runs-on: 'ubuntu-latest'
|
uses: ultimaker/cura-workflows/.github/workflows/conan-recipe-export.yml@main
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache Conan data
|
|
||||||
id: cache-conan
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/.conan
|
|
||||||
key: ${{ runner.os }}-conan
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.11.x'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements for runner
|
|
||||||
run: pip install -r .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
# NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest.
|
|
||||||
# This is maybe because grub caches the disk it uses last time, which is recreated each time.
|
|
||||||
- name: Install Linux system requirements
|
|
||||||
if: ${{ runner.os == 'Linux' }}
|
|
||||||
run: |
|
|
||||||
sudo rm /var/cache/debconf/config.dat
|
|
||||||
sudo dpkg --configure -a
|
|
||||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
|
||||||
sudo apt update
|
|
||||||
sudo apt upgrade
|
|
||||||
sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison libxcb-cursor-dev g++-12 gcc-12 -y
|
|
||||||
|
|
||||||
- name: Install GCC-13
|
|
||||||
run: |
|
|
||||||
sudo apt install g++-13 gcc-13 -y
|
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
|
|
||||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
|
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
|
||||||
run: conan profile new default --detect --force
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Create the Packages
|
|
||||||
run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True -o ${{ needs.conan-recipe-version.outputs.project_name }}:enable_i18n=True -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Create the latest alias
|
|
||||||
if: always()
|
|
||||||
run: conan alias ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_full }} -r cura --all -c
|
|
||||||
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} -r cura -c
|
|
||||||
|
|
||||||
notify-create:
|
|
||||||
if: ${{ always() && (github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || needs.conan-recipe-version.outputs.is_release_branch == 'true')) }}
|
|
||||||
needs: [ conan-recipe-version, conan-package-create-linux ]
|
|
||||||
|
|
||||||
uses: ultimaker/cura/.github/workflows/notify.yml@main
|
|
||||||
with:
|
with:
|
||||||
success: ${{ contains(join(needs.*.result, ','), 'success') }}
|
recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
|
||||||
success_title: "New binaries created in ${{ github.repository }}"
|
recipe_id_latest: ${{ needs.conan-recipe-version.outputs.recipe_id_latest }}
|
||||||
success_body: "Created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
|
|
||||||
failure_title: "Failed to create binaries in ${{ github.repository }}"
|
|
||||||
failure_body: "Failed to created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
|
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
110
.github/workflows/conan-recipe-export.yml
vendored
110
.github/workflows/conan-recipe-export.yml
vendored
@ -1,110 +0,0 @@
|
|||||||
name: Export Conan Recipe to server
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
recipe_id_full:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
recipe_id_latest:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
runs_on:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
python_version:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_config_branch:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_logging_level:
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
conan_export_binaries:
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
conan_upload_community:
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
env:
|
|
||||||
CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }}
|
|
||||||
CONAN_PASSWORD: ${{ secrets.CONAN_PASS }}
|
|
||||||
CONAN_LOG_RUN_TO_OUTPUT: 1
|
|
||||||
CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }}
|
|
||||||
CONAN_NON_INTERACTIVE: 1
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
package-export:
|
|
||||||
runs-on: ${{ inputs.runs_on }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout project
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: ${{ inputs.python_version }}
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements and Create default Conan profile
|
|
||||||
run: |
|
|
||||||
pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt
|
|
||||||
conan profile new default --detect
|
|
||||||
# Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: $HOME/.conan/data
|
|
||||||
key: ${{ runner.os }}-conan-export-cache
|
|
||||||
|
|
||||||
- name: Get Conan configuration from branch
|
|
||||||
if: ${{ inputs.conan_config_branch != '' }}
|
|
||||||
run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}"
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Add Cura private Artifactory remote
|
|
||||||
run: conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
|
|
||||||
|
|
||||||
- name: Set GH service account for remote cura-conan-dev
|
|
||||||
run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
|
|
||||||
|
|
||||||
- name: Export the Package (binaries)
|
|
||||||
if: ${{ inputs.conan_export_binaries }}
|
|
||||||
run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Export the Package
|
|
||||||
if: ${{ !inputs.conan_export_binaries }}
|
|
||||||
run: conan export . ${{ inputs.recipe_id_full }}
|
|
||||||
|
|
||||||
- name: Create the latest alias
|
|
||||||
if: always()
|
|
||||||
run: conan alias ${{ inputs.recipe_id_latest }} ${{ inputs.recipe_id_full }}
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
if: ${{ always() && inputs.conan_upload_community }}
|
|
||||||
run: |
|
|
||||||
conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
|
|
||||||
conan upload ${{ inputs.recipe_id_latest }} -r cura -c
|
|
||||||
|
|
||||||
- name: Upload the Package(s) to the private Artifactory
|
|
||||||
if: ${{ always() && ! inputs.conan_upload_community }}
|
|
||||||
run: |
|
|
||||||
conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c
|
|
||||||
conan upload ${{ inputs.recipe_id_latest }} -r cura-private-conan-dev -c
|
|
217
.github/workflows/conan-recipe-version.yml
vendored
217
.github/workflows/conan-recipe-version.yml
vendored
@ -1,217 +0,0 @@
|
|||||||
name: Get Conan Recipe Version
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
project_name:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
user:
|
|
||||||
required: false
|
|
||||||
default: ultimaker
|
|
||||||
type: string
|
|
||||||
|
|
||||||
additional_buildmetadata:
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
type: string
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
recipe_id_full:
|
|
||||||
description: "The full Conan recipe id: <name>/<version>@<user>/<channel>"
|
|
||||||
value: ${{ jobs.get-semver.outputs.recipe_id_full }}
|
|
||||||
|
|
||||||
recipe_id_latest:
|
|
||||||
description: "The full Conan recipe aliased (latest) id: <name>/(latest)@<user>/<channel>"
|
|
||||||
value: ${{ jobs.get-semver.outputs.recipe_id_latest }}
|
|
||||||
|
|
||||||
recipe_semver_full:
|
|
||||||
description: "The full semver <Major>.<Minor>.<Patch>-<PreReleaseTag>+<BuildMetaData>"
|
|
||||||
value: ${{ jobs.get-semver.outputs.semver_full }}
|
|
||||||
|
|
||||||
is_release_branch:
|
|
||||||
description: "is current branch a release branch?"
|
|
||||||
value: ${{ jobs.get-semver.outputs.release_branch }}
|
|
||||||
|
|
||||||
user:
|
|
||||||
description: "The conan user"
|
|
||||||
value: ${{ jobs.get-semver.outputs.user }}
|
|
||||||
|
|
||||||
channel:
|
|
||||||
description: "The conan channel"
|
|
||||||
value: ${{ jobs.get-semver.outputs.channel }}
|
|
||||||
|
|
||||||
project_name:
|
|
||||||
description: "The conan projectname"
|
|
||||||
value: ${{ inputs.project_name }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
get-semver:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
recipe_id_full: ${{ steps.get-conan-broadcast-data.outputs.recipe_id_full }}
|
|
||||||
recipe_id_latest: ${{ steps.get-conan-broadcast-data.outputs.recipe_id_latest }}
|
|
||||||
semver_full: ${{ steps.get-conan-broadcast-data.outputs.semver_full }}
|
|
||||||
is_release_branch: ${{ steps.get-conan-broadcast-data.outputs.is_release_branch }}
|
|
||||||
user: ${{ steps.get-conan-broadcast-data.outputs.user }}
|
|
||||||
channel: ${{ steps.get-conan-broadcast-data.outputs.channel }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
ref: ${{ github.head_ref }}
|
|
||||||
|
|
||||||
- name: Checkout repo PR
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
ref: ${{ github.base_ref }}
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: "3.11.x"
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements and Create default Conan profile
|
|
||||||
run: |
|
|
||||||
pip install -r .github/workflows/requirements-conan-package.txt
|
|
||||||
pip install gitpython
|
|
||||||
|
|
||||||
- id: get-conan-broadcast-data
|
|
||||||
name: Get Conan broadcast data
|
|
||||||
run: |
|
|
||||||
import subprocess
|
|
||||||
import os
|
|
||||||
from conan.tools.scm import Version
|
|
||||||
from conan.errors import ConanException
|
|
||||||
from git import Repo
|
|
||||||
|
|
||||||
repo = Repo('.')
|
|
||||||
user = "${{ inputs.user }}".lower()
|
|
||||||
project_name = "${{ inputs.project_name }}"
|
|
||||||
event_name = "${{ github.event_name }}"
|
|
||||||
issue_number = "${{ github.ref }}".split('/')[2]
|
|
||||||
is_tag = "${{ github.ref_type }}" == "tag"
|
|
||||||
is_release_branch = False
|
|
||||||
ref_name = "${{ github.base_ref }}" if event_name == "pull_request" else "${{ github.ref_name }}"
|
|
||||||
buildmetadata = "" if "${{ inputs.additional_buildmetadata }}" == "" else "${{ inputs.additional_buildmetadata }}_"
|
|
||||||
|
|
||||||
# FIXME: for when we push a tag (such as an release)
|
|
||||||
channel = "testing"
|
|
||||||
if is_tag:
|
|
||||||
branch_version = Version(ref_name)
|
|
||||||
is_release_branch = True
|
|
||||||
channel = "_"
|
|
||||||
user = "_"
|
|
||||||
actual_version = f"{branch_version}"
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
branch_version = Version(repo.active_branch.name)
|
|
||||||
except ConanException:
|
|
||||||
branch_version = Version('0.0.0')
|
|
||||||
if ref_name == f"{branch_version.major}.{branch_version.minor}":
|
|
||||||
channel = 'stable'
|
|
||||||
is_release_branch = True
|
|
||||||
elif ref_name in ("main", "master"):
|
|
||||||
channel = 'testing'
|
|
||||||
else:
|
|
||||||
channel = "_".join(repo.active_branch.name.replace("-", "_").split("_")[:2]).lower()
|
|
||||||
|
|
||||||
if "pull_request" in event_name:
|
|
||||||
channel = f"pr_{issue_number}"
|
|
||||||
|
|
||||||
# %% Get the actual version
|
|
||||||
latest_branch_version = Version("0.0.0")
|
|
||||||
latest_branch_tag = None
|
|
||||||
for tag in repo.active_branch.repo.tags:
|
|
||||||
if str(tag).startswith("firmware") or str(tag).startswith("master"):
|
|
||||||
continue # Quick-fix for the versioning scheme name of the embedded team in fdm_materials(_private) repo
|
|
||||||
try:
|
|
||||||
version = Version(tag)
|
|
||||||
except ConanException:
|
|
||||||
continue
|
|
||||||
if version > latest_branch_version and version < Version("6.0.0"):
|
|
||||||
# FIXME: stupid old Cura tags 13.04 etc. keep popping up, als the fdm_material tag for firmware are messing with this
|
|
||||||
latest_branch_version = version
|
|
||||||
latest_branch_tag = repo.tag(tag)
|
|
||||||
|
|
||||||
if latest_branch_tag:
|
|
||||||
# %% Get the actual version
|
|
||||||
sha_commit = repo.commit().hexsha[:6]
|
|
||||||
latest_branch_version_prerelease = latest_branch_version.pre
|
|
||||||
if latest_branch_version.pre and not "." in str(latest_branch_version.pre):
|
|
||||||
# The prerealese did not contain a version number, default it to 1
|
|
||||||
latest_branch_version_prerelease = f"{latest_branch_version.pre}.1"
|
|
||||||
if event_name == "pull_request":
|
|
||||||
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{str(latest_branch_version_prerelease).lower()}+{buildmetadata}pr_{issue_number}_{sha_commit}"
|
|
||||||
channel_metadata = f"{channel}_{sha_commit}"
|
|
||||||
else:
|
|
||||||
if channel in ("stable", "_", ""):
|
|
||||||
channel_metadata = f"{sha_commit}"
|
|
||||||
else:
|
|
||||||
channel_metadata = f"{channel}_{sha_commit}"
|
|
||||||
if is_release_branch:
|
|
||||||
if (latest_branch_version.pre == "" or latest_branch_version.pre is None) and branch_version > latest_branch_version:
|
|
||||||
actual_version = f"{branch_version.major}.{branch_version.minor}.0-beta.1+{buildmetadata}{channel_metadata}"
|
|
||||||
elif latest_branch_version.pre == "":
|
|
||||||
# An actual full release has been created, we are working on patch
|
|
||||||
bump_up_patch = int(str(latest_branch_version.patch)) + 1
|
|
||||||
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{bump_up_patch}-beta.1+{buildmetadata}{channel_metadata}"
|
|
||||||
elif latest_branch_version.pre is None:
|
|
||||||
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{int(latest_branch_version.patch.value) + 1}-beta.1+{buildmetadata}{channel_metadata}"
|
|
||||||
else:
|
|
||||||
# An beta release has been created we are working toward a next beta or full release
|
|
||||||
bump_up_release_tag = int(str(latest_branch_version.pre).split('.')[1]) + 1
|
|
||||||
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{str(latest_branch_version.pre).split('.')[0]}.{bump_up_release_tag}+{buildmetadata}{channel_metadata}"
|
|
||||||
else:
|
|
||||||
max_branches_version = Version("0.0.0")
|
|
||||||
for branch in repo.references:
|
|
||||||
try:
|
|
||||||
if "remotes/origin" in branch.abspath:
|
|
||||||
b_version = Version(branch.name.split("/")[-1])
|
|
||||||
if b_version < Version("6.0.0") and b_version > max_branches_version:
|
|
||||||
max_branches_version = b_version
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
if max_branches_version > latest_branch_version:
|
|
||||||
actual_version = f"{max_branches_version.major}.{int(str(max_branches_version.minor)) + 1}.0-alpha+{buildmetadata}{channel}_{sha_commit}"
|
|
||||||
else:
|
|
||||||
actual_version = f"{latest_branch_version.major}.{int(str(latest_branch_version.minor)) + 1}.0-alpha+{buildmetadata}{channel_metadata}"
|
|
||||||
|
|
||||||
# %% Set the environment output
|
|
||||||
output_env = os.environ["GITHUB_OUTPUT"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(output_env):
|
|
||||||
with open(output_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
with open(output_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"name={project_name}\n")
|
|
||||||
f.writelines(f"version={actual_version}\n")
|
|
||||||
f.writelines(f"channel={channel}\n")
|
|
||||||
f.writelines(f"recipe_id_full={project_name}/{actual_version}@{user}/{channel}\n")
|
|
||||||
f.writelines(f"recipe_id_latest={project_name}/latest@{user}/{channel}\n")
|
|
||||||
f.writelines(f"semver_full={actual_version}\n")
|
|
||||||
f.writelines(f"is_release_branch={str(is_release_branch).lower()}\n")
|
|
||||||
|
|
||||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
|
||||||
with open(summary_env, "w") as f:
|
|
||||||
f.writelines(f"# {project_name}\n")
|
|
||||||
f.writelines(f"name={project_name}\n")
|
|
||||||
f.writelines(f"version={actual_version}\n")
|
|
||||||
f.writelines(f"channel={channel}\n")
|
|
||||||
f.writelines(f"recipe_id_full={project_name}/{actual_version}@{user}/{channel}\n")
|
|
||||||
f.writelines(f"recipe_id_latest={project_name}/latest@{user}/{channel}\n")
|
|
||||||
f.writelines(f"semver_full={actual_version}\n")
|
|
||||||
f.writelines(f"is_release_branch={str(is_release_branch).lower()}\n")
|
|
||||||
shell: python
|
|
66
.github/workflows/installers.yml
vendored
66
.github/workflows/installers.yml
vendored
@ -39,56 +39,18 @@ env:
|
|||||||
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
||||||
ENTERPRISE: ${{ inputs.enterprise || false }}
|
ENTERPRISE: ${{ inputs.enterprise || false }}
|
||||||
STAGING: ${{ inputs.staging || false }}
|
STAGING: ${{ inputs.staging || false }}
|
||||||
LATEST_RELEASE: '5.6'
|
|
||||||
LATEST_RELEASE_SCHEDULE_HOUR: 4
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
default_values:
|
default_values:
|
||||||
runs-on: ubuntu-latest
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-default-value.yml@main
|
||||||
outputs:
|
with:
|
||||||
cura_conan_version: ${{ steps.default.outputs.cura_conan_version }}
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
release_tag: ${{ steps.default.outputs.release_tag }}
|
latest_release: '5.6'
|
||||||
|
latest_release_schedule_hour: 4
|
||||||
steps:
|
latest_release_tag: 'nightly'
|
||||||
- name: Output default values
|
|
||||||
id: default
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
if "${{ github.event_name }}" != "schedule":
|
|
||||||
cura_conan_version = "${{ github.event.inputs.cura_conan_version }}"
|
|
||||||
else:
|
|
||||||
now = datetime.datetime.now()
|
|
||||||
cura_conan_version = "cura/latest@ultimaker/stable" if now.hour == int(os.environ['LATEST_RELEASE_SCHEDULE_HOUR']) else "cura/latest@ultimaker/testing"
|
|
||||||
|
|
||||||
release_tag = f"nightly-{os.environ['LATEST_RELEASE']}" if "/stable" in cura_conan_version else "nightly"
|
|
||||||
|
|
||||||
# Set cura_conan_version environment variable
|
|
||||||
output_env = os.environ["GITHUB_OUTPUT"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(output_env):
|
|
||||||
with open(output_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
with open(output_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"cura_conan_version={cura_conan_version}\n")
|
|
||||||
f.writelines(f"release_tag={release_tag}\n")
|
|
||||||
|
|
||||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(summary_env):
|
|
||||||
with open(summary_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
with open(summary_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"# cura_conan_version = {cura_conan_version}\n")
|
|
||||||
f.writelines(f"# release_tag = {release_tag}\n")
|
|
||||||
|
|
||||||
windows-installer:
|
windows-installer:
|
||||||
uses: ./.github/workflows/windows.yml
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-windows.yml@main
|
||||||
needs: [ default_values ]
|
needs: [ default_values ]
|
||||||
with:
|
with:
|
||||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||||
@ -100,7 +62,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
linux-installer:
|
linux-installer:
|
||||||
uses: ./.github/workflows/linux.yml
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-linux.yml@main
|
||||||
needs: [ default_values ]
|
needs: [ default_values ]
|
||||||
with:
|
with:
|
||||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||||
@ -112,7 +74,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
macos-installer:
|
macos-installer:
|
||||||
uses: ./.github/workflows/macos.yml
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-macos.yml@main
|
||||||
needs: [ default_values ]
|
needs: [ default_values ]
|
||||||
with:
|
with:
|
||||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||||
@ -124,7 +86,7 @@ jobs:
|
|||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
macos-arm-installer:
|
macos-arm-installer:
|
||||||
uses: ./.github/workflows/macos.yml
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-macos.yml@main
|
||||||
needs: [ default_values ]
|
needs: [ default_values ]
|
||||||
with:
|
with:
|
||||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||||
@ -142,9 +104,9 @@ jobs:
|
|||||||
needs: [ default_values, windows-installer, linux-installer, macos-installer, macos-arm-installer ]
|
needs: [ default_values, windows-installer, linux-installer, macos-installer, macos-arm-installer ]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
# It's not necessary to download all three, but it does make sure we have at least one if an OS is skipped.
|
fetch-depth: 1
|
||||||
|
|
||||||
- name: Download the run info
|
- name: Download the run info
|
||||||
uses: actions/download-artifact@v2
|
uses: actions/download-artifact@v2
|
||||||
@ -193,7 +155,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: ${{ steps.filename.outputs.LINUX }}-AppImage
|
name: ${{ steps.filename.outputs.LINUX }}-AppImage
|
||||||
path: installers
|
path: installers
|
||||||
|
|
||||||
- name: Download linux installer jobs asc artifacts
|
- name: Download linux installer jobs asc artifacts
|
||||||
uses: actions/download-artifact@v2
|
uses: actions/download-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
226
.github/workflows/linux.yml
vendored
226
.github/workflows/linux.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: Linux Installer
|
name: Linux Installer
|
||||||
run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }}
|
run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }}
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -39,219 +39,19 @@ on:
|
|||||||
options:
|
options:
|
||||||
- ubuntu-22.04
|
- ubuntu-22.04
|
||||||
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
cura_conan_version:
|
|
||||||
description: 'Cura Conan Version'
|
|
||||||
default: 'cura/latest@ultimaker/testing'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
conan_args:
|
|
||||||
description: 'Conan args: eq.: --require-override'
|
|
||||||
default: ''
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
enterprise:
|
|
||||||
description: 'Build Cura as an Enterprise edition'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
staging:
|
|
||||||
description: 'Use staging API'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
architecture:
|
|
||||||
description: 'Architecture'
|
|
||||||
required: true
|
|
||||||
default: 'X64'
|
|
||||||
type: string
|
|
||||||
operating_system:
|
|
||||||
description: 'OS'
|
|
||||||
required: true
|
|
||||||
default: 'ubuntu-22.04'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
||||||
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
ENTERPRISE: ${{ inputs.enterprise || false }}
|
||||||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
STAGING: ${{ inputs.staging || false }}
|
||||||
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
|
||||||
ENTERPRISE: ${{ inputs.enterprise }}
|
|
||||||
STAGING: ${{ inputs.staging }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cura-installer-create:
|
windows-installer:
|
||||||
runs-on: ${{ inputs.operating_system }}
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-linux.yml@main
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.10.x'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements for runner
|
|
||||||
run: pip install -r .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Bash)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
$HOME/.conan/data
|
|
||||||
$HOME/.conan/conan_download_cache
|
|
||||||
key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache
|
|
||||||
|
|
||||||
- name: Install Linux system requirements
|
|
||||||
run: |
|
|
||||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
|
||||||
sudo apt update
|
|
||||||
sudo apt upgrade
|
|
||||||
sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config binutils coreutils desktop-file-utils fakeroot fuse libgdk-pixbuf2.0-dev patchelf squashfs-tools strace util-linux zsync libxcb-cursor-dev -y
|
|
||||||
|
|
||||||
# Get the AppImage tool
|
|
||||||
wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool
|
|
||||||
chmod +x $GITHUB_WORKSPACE/appimagetool
|
|
||||||
echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
# Get the AppImage builder
|
|
||||||
wget --no-check-certificate --quiet -O $GITHUB_WORKSPACE/appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage
|
|
||||||
chmod +x appimage-builder-x86_64.AppImage
|
|
||||||
echo "APPIMAGEBUILDER_LOCATION=$GITHUB_WORKSPACE/appimage-builder-x86_64.AppImage" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
# Make sure these tools can be found on the path
|
|
||||||
echo "$GITHUB_WORKSPACE" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Install GCC-13
|
|
||||||
run: |
|
|
||||||
sudo apt install g++-13 gcc-13 -y
|
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
|
|
||||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
|
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
|
||||||
run: conan profile new default --detect --force
|
|
||||||
|
|
||||||
- name: Configure GPG Key Linux (Bash)
|
|
||||||
run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Bash)
|
|
||||||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
|
||||||
|
|
||||||
- name: Create the Packages (Bash)
|
|
||||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Remove internal packages before uploading
|
|
||||||
run: |
|
|
||||||
conan remove "*@internal/*" -f || true
|
|
||||||
conan remove "cura_private_data*" -f || true
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
conan upload "*" -r cura --all -c
|
|
||||||
|
|
||||||
- name: Set Environment variables for Cura (bash)
|
|
||||||
run: |
|
|
||||||
. ./cura_inst/bin/activate_github_actions_env.sh
|
|
||||||
. ./cura_inst/bin/activate_github_actions_version_env.sh
|
|
||||||
|
|
||||||
- name: Create the Cura dist
|
|
||||||
run: pyinstaller ./cura_inst/UltiMaker-Cura.spec
|
|
||||||
|
|
||||||
- name: Output the name file name and extension
|
|
||||||
id: filename
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else ""
|
|
||||||
installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}"
|
|
||||||
output_env = os.environ["GITHUB_OUTPUT"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(output_env):
|
|
||||||
with open(output_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
with open(output_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
|
||||||
|
|
||||||
- name: Summarize the used dependencies
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
|
|
||||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
|
||||||
|
|
||||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(summary_env):
|
|
||||||
with open(summary_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
with open(summary_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
|
||||||
f.writelines("## Conan packages:\n")
|
|
||||||
for dep_name, dep_info in ConanInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
|
||||||
|
|
||||||
f.writelines("## Python modules:\n")
|
|
||||||
for dep_name, dep_info in PythonInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
|
||||||
|
|
||||||
- name: Create the Linux AppImage (Bash)
|
|
||||||
run: |
|
|
||||||
python ../cura_inst/packaging/AppImage-builder/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage"
|
|
||||||
chmod +x "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Upload the AppImage
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-AppImage
|
|
||||||
path: |
|
|
||||||
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
- name: Upload the asc
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-asc
|
|
||||||
path: |
|
|
||||||
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage.asc
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
- name: Write the run info
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
with open("run_info.sh", "w") as f:
|
|
||||||
f.writelines(f'echo "CURA_VERSION_FULL={os.environ["CURA_VERSION_FULL"]}" >> $GITHUB_ENV\n')
|
|
||||||
- name: Upload the run info
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: linux-run-info
|
|
||||||
path: |
|
|
||||||
run_info.sh
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
notify-export:
|
|
||||||
if: ${{ always() }}
|
|
||||||
needs: [ cura-installer-create ]
|
|
||||||
|
|
||||||
uses: ultimaker/cura/.github/workflows/notify.yml@main
|
|
||||||
with:
|
with:
|
||||||
success: ${{ contains(join(needs.*.result, ','), 'success') }}
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
success_title: "Create the Cura distributions"
|
conan_args: ${{ inputs.conan_args }}
|
||||||
success_body: "Installers for ${{ inputs.cura_conan_version }}"
|
enterprise: ${{ inputs.enterprise == 'true' }}
|
||||||
failure_title: "Failed to create the Cura distributions"
|
staging: ${{ inputs.staging == 'true' }}
|
||||||
failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
|
architecture: ${{ inputs.architecture }}
|
||||||
secrets: inherit
|
operating_system: ${{ inputs.operating_system }}
|
||||||
|
secrets: inherit
|
237
.github/workflows/macos.yml
vendored
237
.github/workflows/macos.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: Macos Installer
|
name: MacOS Installer
|
||||||
run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }}
|
run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }}
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -42,229 +42,20 @@ on:
|
|||||||
- self-hosted-ARM64
|
- self-hosted-ARM64
|
||||||
- macos-11
|
- macos-11
|
||||||
- macos-12
|
- macos-12
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
cura_conan_version:
|
|
||||||
description: 'Cura Conan Version'
|
|
||||||
default: 'cura/latest@ultimaker/testing'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
conan_args:
|
|
||||||
description: 'Conan args: eq.: --require-override'
|
|
||||||
default: ''
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
enterprise:
|
|
||||||
description: 'Build Cura as an Enterprise edition'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
staging:
|
|
||||||
description: 'Use staging API'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
architecture:
|
|
||||||
description: 'Architecture'
|
|
||||||
required: true
|
|
||||||
default: 'ARM64'
|
|
||||||
type: string
|
|
||||||
operating_system:
|
|
||||||
description: 'OS'
|
|
||||||
required: true
|
|
||||||
default: 'self-hosted-ARM64'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
||||||
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
ENTERPRISE: ${{ inputs.enterprise || false }}
|
||||||
CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }}
|
STAGING: ${{ inputs.staging || false }}
|
||||||
MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }}
|
|
||||||
MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }}
|
|
||||||
MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }}
|
|
||||||
MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }}
|
|
||||||
MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }}
|
|
||||||
MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
|
||||||
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
|
||||||
ENTERPRISE: ${{ inputs.enterprise }}
|
|
||||||
STAGING: ${{ inputs.staging }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cura-installer-create:
|
windows-installer:
|
||||||
runs-on: ${{ inputs.operating_system }}
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-macos.yml@main
|
||||||
|
|
||||||
outputs:
|
|
||||||
INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.11.x'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements for runner
|
|
||||||
run: pip install -r .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Bash)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
$HOME/.conan/data
|
|
||||||
$HOME/.conan/conan_download_cache
|
|
||||||
key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache
|
|
||||||
|
|
||||||
- name: Install MacOS system requirements
|
|
||||||
run: brew install cmake autoconf automake ninja create-dmg
|
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
|
||||||
run: conan profile new default --detect --force
|
|
||||||
|
|
||||||
- name: Remove Macos keychain (Bash)
|
|
||||||
run: security delete-keychain signing_temp.keychain || true
|
|
||||||
|
|
||||||
- name: Configure Macos keychain Developer Cert(Bash)
|
|
||||||
id: macos-keychain-developer-cert
|
|
||||||
uses: apple-actions/import-codesign-certs@v1
|
|
||||||
with:
|
|
||||||
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
|
||||||
p12-file-base64: ${{ secrets.MACOS_CERT_P12 }}
|
|
||||||
p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
|
||||||
|
|
||||||
- name: Configure Macos keychain Installer Cert (Bash)
|
|
||||||
id: macos-keychain-installer-cert
|
|
||||||
uses: apple-actions/import-codesign-certs@v1
|
|
||||||
with:
|
|
||||||
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
|
||||||
create-keychain: false # keychain is created in previous use of action.
|
|
||||||
p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }}
|
|
||||||
p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
|
||||||
|
|
||||||
- name: Remove private Artifactory
|
|
||||||
run: conan remote remove cura-private-conan-dev || true
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Bash)
|
|
||||||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
|
||||||
|
|
||||||
- name: Create the Packages (Bash)
|
|
||||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Remove internal packages before uploading
|
|
||||||
run: |
|
|
||||||
conan remove "*@internal/*" -f || true
|
|
||||||
conan remove "cura_private_data*" -f || true
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
run: |
|
|
||||||
conan upload "*" -r cura --all -c
|
|
||||||
|
|
||||||
- name: Set Environment variables for Cura (bash)
|
|
||||||
run: |
|
|
||||||
. ./cura_inst/bin/activate_github_actions_env.sh
|
|
||||||
. ./cura_inst/bin/activate_github_actions_version_env.sh
|
|
||||||
|
|
||||||
- name: Unlock Macos keychain (Bash)
|
|
||||||
run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain
|
|
||||||
env:
|
|
||||||
TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }}
|
|
||||||
|
|
||||||
- name: Create the Cura dist
|
|
||||||
run: pyinstaller ./cura_inst/UltiMaker-Cura.spec
|
|
||||||
|
|
||||||
- name: Output the name file name and extension
|
|
||||||
id: filename
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else ""
|
|
||||||
installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.architecture }}"
|
|
||||||
output_env = os.environ["GITHUB_OUTPUT"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(output_env):
|
|
||||||
with open(output_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
with open(output_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
|
||||||
|
|
||||||
- name: Summarize the used dependencies
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
|
|
||||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
|
||||||
|
|
||||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(summary_env):
|
|
||||||
with open(summary_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
with open(summary_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
|
||||||
f.writelines("## Conan packages:\n")
|
|
||||||
for dep_name, dep_info in ConanInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
|
||||||
|
|
||||||
f.writelines("## Python modules:\n")
|
|
||||||
for dep_name, dep_info in PythonInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
|
||||||
|
|
||||||
- name: Create the Macos dmg (Bash)
|
|
||||||
run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_dmg --build_pkg --app_name "$CURA_APP_NAME"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Upload the dmg
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg
|
|
||||||
path: |
|
|
||||||
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
- name: Upload the pkg
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg
|
|
||||||
path: |
|
|
||||||
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
- name: Write the run info
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
with open("run_info.sh", "w") as f:
|
|
||||||
f.writelines(f'echo "CURA_VERSION_FULL={os.environ["CURA_VERSION_FULL"]}" >> $GITHUB_ENV\n')
|
|
||||||
|
|
||||||
- name: Upload the run info
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: macos-run-info
|
|
||||||
path: |
|
|
||||||
run_info.sh
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
|
|
||||||
notify-export:
|
|
||||||
if: ${{ always() }}
|
|
||||||
needs: [ cura-installer-create ]
|
|
||||||
|
|
||||||
uses: ultimaker/cura/.github/workflows/notify.yml@main
|
|
||||||
with:
|
with:
|
||||||
success: ${{ contains(join(needs.*.result, ','), 'success') }}
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
success_title: "Create the Cura distributions"
|
conan_args: ${{ inputs.conan_args }}
|
||||||
success_body: "Installers for ${{ inputs.cura_conan_version }}"
|
enterprise: ${{ inputs.enterprise == 'true' }}
|
||||||
failure_title: "Failed to create the Cura distributions"
|
staging: ${{ inputs.staging == 'true' }}
|
||||||
failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
|
architecture: ${{ inputs.architecture }}
|
||||||
secrets: inherit
|
operating_system: ${{ inputs.operating_system }}
|
||||||
|
secrets: inherit
|
54
.github/workflows/notify.yml
vendored
54
.github/workflows/notify.yml
vendored
@ -1,54 +0,0 @@
|
|||||||
name: Get Conan Recipe Version
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
success:
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
success_title:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
success_body:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
failure_title:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
failure_body:
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
slackNotification:
|
|
||||||
name: Slack Notification
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Slack notify on-success
|
|
||||||
if: ${{ inputs.success }}
|
|
||||||
uses: rtCamp/action-slack-notify@v2
|
|
||||||
env:
|
|
||||||
SLACK_USERNAME: ${{ github.repository }}
|
|
||||||
SLACK_COLOR: green
|
|
||||||
SLACK_ICON: https://github.com/Ultimaker/Cura/blob/main/icons/cura-128.png?raw=true
|
|
||||||
SLACK_TITLE: ${{ inputs.success_title }}
|
|
||||||
SLACK_MESSAGE: ${{ inputs.success_body }}
|
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
|
||||||
|
|
||||||
- name: Slack notify on-failure
|
|
||||||
if: ${{ !inputs.success }}
|
|
||||||
uses: rtCamp/action-slack-notify@v2
|
|
||||||
env:
|
|
||||||
SLACK_USERNAME: ${{ github.repository }}
|
|
||||||
SLACK_COLOR: red
|
|
||||||
SLACK_ICON: https://github.com/Ultimaker/Cura/blob/main/icons/cura-128.png?raw=true
|
|
||||||
SLACK_TITLE: ${{ inputs.failure_title }}
|
|
||||||
SLACK_MESSAGE: ${{ inputs.failure_body }}
|
|
||||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
|
15
.github/workflows/process-pull-request.yml
vendored
15
.github/workflows/process-pull-request.yml
vendored
@ -1,15 +1,10 @@
|
|||||||
name: process-pull-request
|
name: process-pull-request
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened, reopened, edited, synchronize, review_requested, ready_for_review, assigned]
|
types: [ opened, reopened, edited, review_requested, ready_for_review, assigned ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
add_label:
|
add_label:
|
||||||
runs-on: ubuntu-latest
|
uses: ultimaker/cura-workflows/.github/workflows/process-pull-request.yml@main
|
||||||
steps:
|
secrets: inherit
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions-ecosystem/action-add-labels@v1
|
|
||||||
if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
|
|
||||||
with:
|
|
||||||
labels: 'PR: Community Contribution :crown:'
|
|
0
.github/workflows/requirements-runner.txt
vendored
Normal file
0
.github/workflows/requirements-runner.txt
vendored
Normal file
85
.github/workflows/unit-test-post.yml
vendored
85
.github/workflows/unit-test-post.yml
vendored
@ -1,82 +1,13 @@
|
|||||||
name: unit-test-post
|
name: unit-test-post
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
workflows: [ "unit-test" ]
|
workflows: [ "unit-test" ]
|
||||||
types: [ completed ]
|
types: [ completed ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-test-results:
|
publish-test-results:
|
||||||
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
|
uses: ultimaker/cura-workflows/.github/workflows/unit-test-post.yml@main
|
||||||
runs-on: ubuntu-latest
|
with:
|
||||||
|
event: ${{ github.event.workflow_run.event }}
|
||||||
steps:
|
conclusion: ${{ github.event.workflow_run.conclusion }}
|
||||||
- name: Download analysis results
|
|
||||||
uses: actions/github-script@v3.1.0
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
let artifacts = await github.actions.listWorkflowRunArtifacts({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
run_id: ${{github.event.workflow_run.id }},
|
|
||||||
});
|
|
||||||
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
|
||||||
return artifact.name == "test-result"
|
|
||||||
})[0];
|
|
||||||
let download = await github.actions.downloadArtifact({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
artifact_id: matchArtifact.id,
|
|
||||||
archive_format: "zip",
|
|
||||||
});
|
|
||||||
let fs = require("fs");
|
|
||||||
fs.writeFileSync("${{github.workspace}}/test-result.zip", Buffer.from(download.data));
|
|
||||||
|
|
||||||
- name: Set environment variables
|
|
||||||
run: |
|
|
||||||
mkdir pr_env
|
|
||||||
unzip test-result.zip -d pr_env
|
|
||||||
echo "pr_id=$(cat pr_env/pr-id.txt)" >> $GITHUB_ENV
|
|
||||||
echo "pr_head_repo=$(cat pr_env/pr-head-repo.txt)" >> $GITHUB_ENV
|
|
||||||
echo "pr_head_ref=$(cat pr_env/pr-head-ref.txt)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
repository: ${{ env.pr_head_repo }}
|
|
||||||
ref: ${{ env.pr_head_ref }}
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: Redownload analysis results
|
|
||||||
uses: actions/github-script@v3.1.0
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
let artifacts = await github.actions.listWorkflowRunArtifacts({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
run_id: ${{github.event.workflow_run.id }},
|
|
||||||
});
|
|
||||||
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
|
||||||
return artifact.name == "test-result"
|
|
||||||
})[0];
|
|
||||||
let download = await github.actions.downloadArtifact({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
artifact_id: matchArtifact.id,
|
|
||||||
archive_format: "zip",
|
|
||||||
});
|
|
||||||
let fs = require("fs");
|
|
||||||
fs.writeFileSync("${{github.workspace}}/test-result.zip", Buffer.from(download.data));
|
|
||||||
|
|
||||||
- name: Extract analysis results
|
|
||||||
run: |
|
|
||||||
mkdir -p tests
|
|
||||||
unzip test-result.zip -d tests
|
|
||||||
|
|
||||||
- name: Publish Unit Test Results
|
|
||||||
id: test-results
|
|
||||||
uses: EnricoMi/publish-unit-test-result-action@v1
|
|
||||||
with:
|
|
||||||
files: "tests/**/*.xml"
|
|
||||||
|
|
||||||
- name: Conclusion
|
|
||||||
run: echo "Conclusion is ${{ steps.test-results.outputs.json && fromJSON( steps.test-results.outputs.json ).conclusion }}"
|
|
||||||
|
141
.github/workflows/unit-test.yml
vendored
141
.github/workflows/unit-test.yml
vendored
@ -1,4 +1,3 @@
|
|||||||
---
|
|
||||||
name: unit-test
|
name: unit-test
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@ -9,23 +8,18 @@ on:
|
|||||||
- 'cura/**'
|
- 'cura/**'
|
||||||
- 'icons/**'
|
- 'icons/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
- 'packaging/**'
|
|
||||||
- '.github/workflows/conan-*.yml'
|
|
||||||
- '.github/workflows/unit-test.yml'
|
- '.github/workflows/unit-test.yml'
|
||||||
- '.github/workflows/notify.yml'
|
- '.github/workflows/requirements-runner.txt'
|
||||||
- '.github/workflows/requirements-conan-package.txt'
|
|
||||||
- 'requirements*.txt'
|
- 'requirements*.txt'
|
||||||
- 'conanfile.py'
|
- 'conanfile.py'
|
||||||
- 'conandata.yml'
|
- 'conandata.yml'
|
||||||
- 'GitVersion.yml'
|
|
||||||
- '*.jinja'
|
- '*.jinja'
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- 'CURA-*'
|
- 'CURA-*'
|
||||||
- '[1-9]+.[0-9]+'
|
- 'PP-*'
|
||||||
tags:
|
- '[0-9]+.[0-9]+'
|
||||||
- '[0-9]+.[0-9]+.[0-9]+'
|
|
||||||
- '[0-9]+.[0-9]+-beta'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'plugins/**'
|
- 'plugins/**'
|
||||||
@ -33,134 +27,35 @@ on:
|
|||||||
- 'cura/**'
|
- 'cura/**'
|
||||||
- 'icons/**'
|
- 'icons/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
- 'packaging/**'
|
|
||||||
- '.github/workflows/conan-*.yml'
|
|
||||||
- '.github/workflows/unit-test.yml'
|
- '.github/workflows/unit-test.yml'
|
||||||
- '.github/workflows/notify.yml'
|
- '.github/workflows/requirements-runner.txt'
|
||||||
- '.github/workflows/requirements-conan-package.txt'
|
|
||||||
- 'requirements*.txt'
|
- 'requirements*.txt'
|
||||||
- 'conanfile.py'
|
- 'conanfile.py'
|
||||||
- 'conandata.yml'
|
- 'conandata.yml'
|
||||||
- 'GitVersion.yml'
|
|
||||||
- '*.jinja'
|
- '*.jinja'
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- '[1-9]+.[0-9]+'
|
- '[0-9]+.[0-9]+'
|
||||||
tags:
|
|
||||||
- '[0-9]+.[0-9]+.[0-9]+'
|
|
||||||
- '[0-9]+.[0-9]+-beta'
|
|
||||||
|
|
||||||
env:
|
|
||||||
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
|
||||||
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
|
||||||
CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }}
|
|
||||||
CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }}
|
|
||||||
CONAN_LOG_RUN_TO_OUTPUT: 1
|
|
||||||
CONAN_LOGGING_LEVEL: info
|
|
||||||
CONAN_NON_INTERACTIVE: 1
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }}
|
||||||
|
CONAN_PASSWORD: ${{ secrets.CONAN_PASS }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
conan-recipe-version:
|
conan-recipe-version:
|
||||||
uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main
|
uses: ultimaker/cura-workflows/.github/workflows/conan-recipe-version.yml@main
|
||||||
with:
|
with:
|
||||||
project_name: cura
|
project_name: cura
|
||||||
|
|
||||||
testing:
|
testing:
|
||||||
runs-on: ubuntu-22.04
|
uses: ultimaker/cura-workflows/.github/workflows/unit-test.yml@main
|
||||||
needs: [ conan-recipe-version ]
|
needs: [ conan-recipe-version ]
|
||||||
|
with:
|
||||||
steps:
|
recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
|
||||||
- name: Checkout
|
conan_extra_args: '-g VirtualPythonEnv -o cura:devtools=True -c tools.build:skip_test=False'
|
||||||
uses: actions/checkout@v3
|
unit_test_cmd: 'pytest --junitxml=junit_cura.xml'
|
||||||
with:
|
unit_test_dir: 'tests'
|
||||||
fetch-depth: 2
|
conan_generator_dir: './venv/bin'
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.11.x'
|
|
||||||
architecture: 'x64'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements and Create default Conan profile
|
|
||||||
run: pip install -r requirements-conan-package.txt
|
|
||||||
working-directory: .github/workflows/
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Bash)
|
|
||||||
if: ${{ runner.os != 'Windows' }}
|
|
||||||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Bash)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
if: ${{ runner.os != 'Windows' }}
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
$HOME/.conan/data
|
|
||||||
$HOME/.conan/conan_download_cache
|
|
||||||
key: conan-${{ runner.os }}-${{ runner.arch }}-unit-cache
|
|
||||||
|
|
||||||
# NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest.
|
|
||||||
# This is maybe because grub caches the disk it uses last time, which is recreated each time.
|
|
||||||
- name: Install Linux system requirements
|
|
||||||
if: ${{ runner.os == 'Linux' }}
|
|
||||||
run: |
|
|
||||||
sudo rm /var/cache/debconf/config.dat
|
|
||||||
sudo dpkg --configure -a
|
|
||||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
|
||||||
sudo apt update
|
|
||||||
sudo apt upgrade
|
|
||||||
sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y
|
|
||||||
|
|
||||||
- name: Install GCC-13
|
|
||||||
run: |
|
|
||||||
sudo apt install g++-13 gcc-13 -y
|
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
|
|
||||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Get Conan profile
|
|
||||||
run: conan profile new default --detect --force
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: conan install . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o cura:devtools=True -g VirtualPythonEnv -if venv
|
|
||||||
|
|
||||||
- name: Upload the Dependency package(s)
|
|
||||||
run: conan upload "*" -r cura --all -c
|
|
||||||
|
|
||||||
- name: Set Environment variables for Cura (bash)
|
|
||||||
if: ${{ runner.os != 'Windows' }}
|
|
||||||
run: |
|
|
||||||
. ./venv/bin/activate_github_actions_env.sh
|
|
||||||
|
|
||||||
- name: Run Unit Test
|
|
||||||
id: run-test
|
|
||||||
run: |
|
|
||||||
pytest --junitxml=junit_cura.xml
|
|
||||||
working-directory: tests
|
|
||||||
|
|
||||||
- name: Save PR metadata
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
echo ${{ github.event.number }} > pr-id.txt
|
|
||||||
echo ${{ github.event.pull_request.head.repo.full_name }} > pr-head-repo.txt
|
|
||||||
echo ${{ github.event.pull_request.head.ref }} > pr-head-ref.txt
|
|
||||||
working-directory: tests
|
|
||||||
|
|
||||||
- name: Upload Test Results
|
|
||||||
if: always()
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: test-result
|
|
||||||
path: |
|
|
||||||
tests/**/*.xml
|
|
||||||
tests/pr-id.txt
|
|
||||||
tests/pr-head-repo.txt
|
|
||||||
tests/pr-head-ref.txt
|
|
233
.github/workflows/windows.yml
vendored
233
.github/workflows/windows.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
name: Windows Installer
|
name: Windows Installer
|
||||||
run-name: ${{ inputs.cura_conan_version }} for Windows-${{ inputs.architecture }} by @${{ github.actor }}
|
run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }}
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -38,227 +38,20 @@ on:
|
|||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- windows-2022
|
- windows-2022
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
cura_conan_version:
|
|
||||||
description: 'Cura Conan Version'
|
|
||||||
default: 'cura/latest@ultimaker/testing'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
conan_args:
|
|
||||||
description: 'Conan args: eq.: --require-override'
|
|
||||||
default: ''
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
enterprise:
|
|
||||||
description: 'Build Cura as an Enterprise edition'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
staging:
|
|
||||||
description: 'Use staging API'
|
|
||||||
default: false
|
|
||||||
required: true
|
|
||||||
type: boolean
|
|
||||||
architecture:
|
|
||||||
description: 'Architecture'
|
|
||||||
required: true
|
|
||||||
default: 'X64'
|
|
||||||
type: string
|
|
||||||
operating_system:
|
|
||||||
description: 'OS'
|
|
||||||
required: true
|
|
||||||
default: 'windows-2022'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
||||||
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
ENTERPRISE: ${{ inputs.enterprise || false }}
|
||||||
WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }}
|
STAGING: ${{ inputs.staging || false }}
|
||||||
WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }}
|
|
||||||
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
|
||||||
ENTERPRISE: ${{ inputs.enterprise }}
|
|
||||||
STAGING: ${{ inputs.staging }}
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cura-installer-create:
|
windows-installer:
|
||||||
runs-on: ${{ inputs.operating_system }}
|
uses: ultimaker/cura-workflows/.github/workflows/cura-installer-windows.yml@main
|
||||||
|
|
||||||
outputs:
|
|
||||||
INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Python and pip
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.10.x'
|
|
||||||
cache: 'pip'
|
|
||||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Install Python requirements for runner
|
|
||||||
run: pip install -r .github/workflows/requirements-conan-package.txt
|
|
||||||
|
|
||||||
- name: Cache Conan local repository packages (Powershell)
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
C:\Users\runneradmin\.conan\data
|
|
||||||
C:\.conan
|
|
||||||
C:\Users\runneradmin\.conan\conan_download_cache
|
|
||||||
key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache
|
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
|
||||||
run: conan profile new default --detect --force
|
|
||||||
|
|
||||||
- name: Get Conan configuration
|
|
||||||
run: |
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git
|
|
||||||
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
|
|
||||||
|
|
||||||
- name: Use Conan download cache (Powershell)
|
|
||||||
run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache"
|
|
||||||
|
|
||||||
- name: Create the Packages (Powershell)
|
|
||||||
run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING -c tools.build:skip_test=True
|
|
||||||
|
|
||||||
- name: Remove internal packages before uploading
|
|
||||||
run: |
|
|
||||||
conan remove "*@internal/*" -f || true
|
|
||||||
conan remove "cura_private_data*" -f || true
|
|
||||||
|
|
||||||
- name: Upload the Package(s)
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
conan upload "*" -r cura --all -c
|
|
||||||
|
|
||||||
- name: Set Environment variables for Cura (Powershell)
|
|
||||||
run: |
|
|
||||||
echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
||||||
.\cura_inst\Scripts\activate_github_actions_env.ps1
|
|
||||||
.\cura_inst\Scripts\activate_github_actions_version_env.ps1
|
|
||||||
|
|
||||||
- name: Create the Cura dist
|
|
||||||
run: pyinstaller ./cura_inst/UltiMaker-Cura.spec
|
|
||||||
|
|
||||||
- name: Output the name file name and extension
|
|
||||||
id: filename
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else ""
|
|
||||||
installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-win64-${{ inputs.architecture }}"
|
|
||||||
output_env = os.environ["GITHUB_OUTPUT"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(output_env):
|
|
||||||
with open(output_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
with open(output_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
|
||||||
|
|
||||||
- name: Summarize the used dependencies
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
|
|
||||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
|
||||||
|
|
||||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
|
||||||
content = ""
|
|
||||||
if os.path.exists(summary_env):
|
|
||||||
with open(summary_env, "r") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
with open(summary_env, "w") as f:
|
|
||||||
f.write(content)
|
|
||||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
|
||||||
f.writelines("## Conan packages:\n")
|
|
||||||
for dep_name, dep_info in ConanInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
|
||||||
|
|
||||||
f.writelines("## Python modules:\n")
|
|
||||||
for dep_name, dep_info in PythonInstalls.items():
|
|
||||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
|
||||||
|
|
||||||
- name: Create PFX certificate from BASE64_PFX_CONTENT secret
|
|
||||||
id: create-pfx
|
|
||||||
env:
|
|
||||||
PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }}
|
|
||||||
run: |
|
|
||||||
$pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx";
|
|
||||||
$encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT);
|
|
||||||
Set-Content $pfxPath -Value $encodedBytes -AsByteStream;
|
|
||||||
echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT;
|
|
||||||
|
|
||||||
- name: Create the Windows msi installer (Powershell)
|
|
||||||
run: |
|
|
||||||
python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Sign the Windows msi installer (Powershell)
|
|
||||||
env:
|
|
||||||
PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }}
|
|
||||||
run: |
|
|
||||||
& "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Create the Windows exe installer (Powershell)
|
|
||||||
run: |
|
|
||||||
python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Sign the Windows exe installer (Powershell)
|
|
||||||
env:
|
|
||||||
PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }}
|
|
||||||
run: |
|
|
||||||
& "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe"
|
|
||||||
working-directory: dist
|
|
||||||
|
|
||||||
- name: Upload the msi
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-msi
|
|
||||||
path: |
|
|
||||||
dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.msi
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
- name: Upload the exe
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-exe
|
|
||||||
path: |
|
|
||||||
dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.exe
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
# NOTE: The extension is .sh, since this isn't going to build-environment, so not on the Win build image.
|
|
||||||
- name: Write the run info
|
|
||||||
shell: python
|
|
||||||
run: |
|
|
||||||
import os
|
|
||||||
with open("run_info.sh", "w") as f:
|
|
||||||
f.writelines(f'echo "CURA_VERSION_FULL={os.environ["CURA_VERSION_FULL"]}" >> $GITHUB_ENV\n')
|
|
||||||
|
|
||||||
# NOTE: The extension is .sh, since this isn't going to build-environment, so not on the Win build image.
|
|
||||||
- name: Upload the run info
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: windows-run-info
|
|
||||||
path: |
|
|
||||||
run_info.sh
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
notify-export:
|
|
||||||
if: ${{ always() }}
|
|
||||||
needs: [ cura-installer-create ]
|
|
||||||
|
|
||||||
uses: ultimaker/cura/.github/workflows/notify.yml@main
|
|
||||||
with:
|
with:
|
||||||
success: ${{ contains(join(needs.*.result, ','), 'success') }}
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
success_title: "Create the Cura distributions"
|
conan_args: ${{ inputs.conan_args }}
|
||||||
success_body: "Installers for ${{ inputs.cura_conan_version }}"
|
enterprise: ${{ inputs.enterprise == 'true' }}
|
||||||
failure_title: "Failed to create the Cura distributions"
|
staging: ${{ inputs.staging == 'true' }}
|
||||||
failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
|
architecture: ${{ inputs.architecture }}
|
||||||
secrets: inherit
|
operating_system: ${{ inputs.operating_system }}
|
||||||
|
secrets: inherit
|
@ -1,3 +1,18 @@
|
|||||||
|
version: "5.7.0-alpha.0"
|
||||||
|
requirements:
|
||||||
|
- "uranium/(latest)@ultimaker/testing"
|
||||||
|
- "curaengine/(latest)@ultimaker/testing"
|
||||||
|
- "cura_binary_data/(latest)@ultimaker/testing"
|
||||||
|
- "fdm_materials/(latest)@ultimaker/testing"
|
||||||
|
- "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable"
|
||||||
|
- "dulcificum/(latest)@ultimaker/testing"
|
||||||
|
- "pyarcus/5.3.0"
|
||||||
|
- "pysavitar/5.3.0"
|
||||||
|
- "pynest2d/5.3.0"
|
||||||
|
- "curaengine_grpc_definitions/(latest)@ultimaker/testing"
|
||||||
|
requirements_internal:
|
||||||
|
- "fdm_materials/(latest)@internal/testing"
|
||||||
|
- "cura_private_data/(latest)@internal/testing"
|
||||||
urls:
|
urls:
|
||||||
default:
|
default:
|
||||||
cloud_api_root: "https://api.ultimaker.com"
|
cloud_api_root: "https://api.ultimaker.com"
|
||||||
|
47
conanfile.py
47
conanfile.py
@ -4,7 +4,7 @@ from pathlib import Path
|
|||||||
from jinja2 import Template
|
from jinja2 import Template
|
||||||
|
|
||||||
from conan import ConanFile
|
from conan import ConanFile
|
||||||
from conan.tools.files import copy, rmdir, save, mkdir, rm
|
from conan.tools.files import copy, rmdir, save, mkdir, rm, update_conandata
|
||||||
from conan.tools.microsoft import unix_path
|
from conan.tools.microsoft import unix_path
|
||||||
from conan.tools.env import VirtualRunEnv, Environment, VirtualBuildEnv
|
from conan.tools.env import VirtualRunEnv, Environment, VirtualBuildEnv
|
||||||
from conan.tools.scm import Version
|
from conan.tools.scm import Version
|
||||||
@ -34,7 +34,7 @@ class CuraConan(ConanFile):
|
|||||||
"cloud_api_version": "ANY",
|
"cloud_api_version": "ANY",
|
||||||
"display_name": "ANY", # TODO: should this be an option??
|
"display_name": "ANY", # TODO: should this be an option??
|
||||||
"cura_debug_mode": [True, False], # FIXME: Use profiles
|
"cura_debug_mode": [True, False], # FIXME: Use profiles
|
||||||
"internal": [True, False],
|
"internal": ["True", "False", "true", "false"], # Workaround for GH Action passing boolean as lowercase string
|
||||||
"enable_i18n": [True, False],
|
"enable_i18n": [True, False],
|
||||||
}
|
}
|
||||||
default_options = {
|
default_options = {
|
||||||
@ -44,13 +44,13 @@ class CuraConan(ConanFile):
|
|||||||
"cloud_api_version": "1",
|
"cloud_api_version": "1",
|
||||||
"display_name": "UltiMaker Cura",
|
"display_name": "UltiMaker Cura",
|
||||||
"cura_debug_mode": False, # Not yet implemented
|
"cura_debug_mode": False, # Not yet implemented
|
||||||
"internal": False,
|
"internal": "False",
|
||||||
"enable_i18n": False,
|
"enable_i18n": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
def set_version(self):
|
def set_version(self):
|
||||||
if not self.version:
|
if not self.version:
|
||||||
self.version = "5.7.0-alpha"
|
self.version = self.conan_data["version"]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _i18n_options(self):
|
def _i18n_options(self):
|
||||||
@ -84,6 +84,10 @@ class CuraConan(ConanFile):
|
|||||||
def _enterprise(self):
|
def _enterprise(self):
|
||||||
return self.options.enterprise in ["True", 'true']
|
return self.options.enterprise in ["True", 'true']
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _internal(self):
|
||||||
|
return self.options.internal in ["True", 'true']
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _app_name(self):
|
def _app_name(self):
|
||||||
if self._enterprise:
|
if self._enterprise:
|
||||||
@ -182,7 +186,7 @@ class CuraConan(ConanFile):
|
|||||||
cura_version = Version(self.conf.get("user.cura:version", default = self.version, check_type = str))
|
cura_version = Version(self.conf.get("user.cura:version", default = self.version, check_type = str))
|
||||||
pre_tag = f"-{cura_version.pre}" if cura_version.pre else ""
|
pre_tag = f"-{cura_version.pre}" if cura_version.pre else ""
|
||||||
build_tag = f"+{cura_version.build}" if cura_version.build else ""
|
build_tag = f"+{cura_version.build}" if cura_version.build else ""
|
||||||
internal_tag = f"+internal" if self.options.internal else ""
|
internal_tag = f"+internal" if self._internal else ""
|
||||||
cura_version = f"{cura_version.major}.{cura_version.minor}.{cura_version.patch}{pre_tag}{build_tag}{internal_tag}"
|
cura_version = f"{cura_version.major}.{cura_version.minor}.{cura_version.patch}{pre_tag}{build_tag}{internal_tag}"
|
||||||
|
|
||||||
with open(os.path.join(location, "CuraVersion.py"), "w") as f:
|
with open(os.path.join(location, "CuraVersion.py"), "w") as f:
|
||||||
@ -206,7 +210,7 @@ class CuraConan(ConanFile):
|
|||||||
pyinstaller_metadata = self.conan_data["pyinstaller"]
|
pyinstaller_metadata = self.conan_data["pyinstaller"]
|
||||||
datas = []
|
datas = []
|
||||||
for data in pyinstaller_metadata["datas"].values():
|
for data in pyinstaller_metadata["datas"].values():
|
||||||
if not self.options.internal and data.get("internal", False):
|
if not self._internal and data.get("internal", False):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if "package" in data: # get the paths from conan package
|
if "package" in data: # get the paths from conan package
|
||||||
@ -285,6 +289,9 @@ class CuraConan(ConanFile):
|
|||||||
short_version = f"'{cura_version.major}.{cura_version.minor}.{cura_version.patch}'",
|
short_version = f"'{cura_version.major}.{cura_version.minor}.{cura_version.patch}'",
|
||||||
))
|
))
|
||||||
|
|
||||||
|
def export(self):
|
||||||
|
update_conandata(self, {"version": self.version})
|
||||||
|
|
||||||
def export_sources(self):
|
def export_sources(self):
|
||||||
copy(self, "*", os.path.join(self.recipe_folder, "plugins"), os.path.join(self.export_sources_folder, "plugins"))
|
copy(self, "*", os.path.join(self.recipe_folder, "plugins"), os.path.join(self.export_sources_folder, "plugins"))
|
||||||
copy(self, "*", os.path.join(self.recipe_folder, "resources"), os.path.join(self.export_sources_folder, "resources"), excludes = "*.mo")
|
copy(self, "*", os.path.join(self.recipe_folder, "resources"), os.path.join(self.export_sources_folder, "resources"), excludes = "*.mo")
|
||||||
@ -320,26 +327,19 @@ class CuraConan(ConanFile):
|
|||||||
raise ConanInvalidConfiguration("Only versions 5+ are support")
|
raise ConanInvalidConfiguration("Only versions 5+ are support")
|
||||||
|
|
||||||
def requirements(self):
|
def requirements(self):
|
||||||
|
for req in self.conan_data["requirements"]:
|
||||||
|
if self._internal and "fdm_materials" in req:
|
||||||
|
continue
|
||||||
|
self.requires(req)
|
||||||
|
if self._internal:
|
||||||
|
for req in self.conan_data["requirements_internal"]:
|
||||||
|
self.requires(req)
|
||||||
|
self.requires("cpython/3.10.4@ultimaker/stable")
|
||||||
|
self.requires("openssl/3.2.0")
|
||||||
self.requires("boost/1.82.0")
|
self.requires("boost/1.82.0")
|
||||||
self.requires("spdlog/1.12.0")
|
self.requires("spdlog/1.12.0")
|
||||||
self.requires("fmt/10.1.1")
|
self.requires("fmt/10.1.1")
|
||||||
self.requires("curaengine_grpc_definitions/0.1.0")
|
|
||||||
self.requires("zlib/1.2.13")
|
self.requires("zlib/1.2.13")
|
||||||
self.requires("pyarcus/5.3.0")
|
|
||||||
self.requires("dulcificum/(latest)@ultimaker/stable")
|
|
||||||
self.requires("curaengine/(latest)@ultimaker/testing")
|
|
||||||
self.requires("pysavitar/5.3.0")
|
|
||||||
self.requires("pynest2d/5.3.0")
|
|
||||||
self.requires("curaengine_plugin_gradual_flow/0.1.0")
|
|
||||||
self.requires("uranium/(latest)@ultimaker/testing")
|
|
||||||
self.requires("cura_binary_data/(latest)@ultimaker/testing")
|
|
||||||
self.requires("cpython/3.10.4@ultimaker/stable")
|
|
||||||
self.requires("openssl/3.2.0")
|
|
||||||
if self.options.internal:
|
|
||||||
self.requires("cura_private_data/(latest)@internal/testing")
|
|
||||||
self.requires("fdm_materials/(latest)@internal/testing")
|
|
||||||
else:
|
|
||||||
self.requires("fdm_materials/(latest)@ultimaker/testing")
|
|
||||||
|
|
||||||
def build_requirements(self):
|
def build_requirements(self):
|
||||||
if self.options.get_safe("enable_i18n", False):
|
if self.options.get_safe("enable_i18n", False):
|
||||||
@ -399,7 +399,7 @@ class CuraConan(ConanFile):
|
|||||||
copy(self, "*", fdm_materials.resdirs[0], self.source_folder)
|
copy(self, "*", fdm_materials.resdirs[0], self.source_folder)
|
||||||
|
|
||||||
# Copy internal resources
|
# Copy internal resources
|
||||||
if self.options.internal:
|
if self._internal:
|
||||||
cura_private_data = self.dependencies["cura_private_data"].cpp_info
|
cura_private_data = self.dependencies["cura_private_data"].cpp_info
|
||||||
copy(self, "*", cura_private_data.resdirs[0], str(self._share_dir.joinpath("cura")))
|
copy(self, "*", cura_private_data.resdirs[0], str(self._share_dir.joinpath("cura")))
|
||||||
|
|
||||||
@ -518,6 +518,7 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
|
|||||||
del self.info.options.cloud_api_version
|
del self.info.options.cloud_api_version
|
||||||
del self.info.options.display_name
|
del self.info.options.display_name
|
||||||
del self.info.options.cura_debug_mode
|
del self.info.options.cura_debug_mode
|
||||||
|
self.options.rm_safe("enable_i18n")
|
||||||
|
|
||||||
# TODO: Use the hash of requirements.txt and requirements-ultimaker.txt, Because changing these will actually result in a different
|
# TODO: Use the hash of requirements.txt and requirements-ultimaker.txt, Because changing these will actually result in a different
|
||||||
# Cura. This is needed because the requirements.txt aren't managed by Conan and therefor not resolved in the package_id. This isn't
|
# Cura. This is needed because the requirements.txt aren't managed by Conan and therefor not resolved in the package_id. This isn't
|
||||||
|
@ -43,7 +43,7 @@ class MaterialOutputModel(QObject):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if guid is None and brand is not "empty" and type in _MATERIAL_MAP:
|
if guid is None and brand != "empty" and type in _MATERIAL_MAP:
|
||||||
name = _MATERIAL_MAP[type]["name"]
|
name = _MATERIAL_MAP[type]["name"]
|
||||||
guid = _MATERIAL_MAP[type]["guid"]
|
guid = _MATERIAL_MAP[type]["guid"]
|
||||||
return name, guid
|
return name, guid
|
||||||
|
Loading…
x
Reference in New Issue
Block a user