Browse Source

Merge branch 'main' into PP-350_cleanup_print_temperature

saumya.jain 1 year ago
parent
commit
66318d63dc

+ 30 - 33
.github/ISSUE_TEMPLATE/bugreport.yaml

@@ -5,17 +5,17 @@ body:
 - type: markdown
 - type: markdown
   attributes:
   attributes:
     value: |
     value: |
-      **Thank you for using Cura and wanting to report a bug.**
+      **Thank you for using Cura and wanting to report a bug. 🙏**
       
       
-      Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. 
+      Before filing, [please check if the issue already exists](https://github.com/Ultimaker/Cura/issues?q=is%3Aissue) by using the search bar on the issues page. 
       If it does, comment there. Even if it's closed, we can reopen it based on your comment. 
       If it does, comment there. Even if it's closed, we can reopen it based on your comment. 
       
       
-      Also, please note the application version in the title of the issue "For example (5.3.1) Cannot connect to 3rd-party printer". Please do not write things like **Request** or **BUG** in the title, this is what labels are for.
+      Please include the cura version in the title of the issue. For example, *"[5.4.0] Support Brim is missing in this model"*. 
 - type: input
 - type: input
   attributes:
   attributes:
-    label: Application Version
+    label: Cura Version
     description: The version of Cura this issue occurs with.
     description: The version of Cura this issue occurs with.
-    placeholder: 5.3.0
+    placeholder: 5.4.0
   validations:
   validations:
     required: true
     required: true
 - type: input
 - type: input
@@ -28,14 +28,14 @@ body:
 - type: input
 - type: input
   attributes:
   attributes:
     label: Printer
     label: Printer
-    description: Which printer was selected in Cura?
-    placeholder: Ultimaker S7    
+    description: Which printer was selected in Cura? It also helps to mention if you made any firmware modifications to your printer. 
+    placeholder: Ultimaker S7 / Creality CR-10 with Klipper     
   validations:
   validations:
     required: true
     required: true
 - type: textarea
 - type: textarea
   attributes:
   attributes:
     label: Reproduction steps
     label: Reproduction steps
-    description: Tell us what you did!
+    description: Share what you did, so we can reproduce it
     placeholder: |
     placeholder: |
       1. Something you did
       1. Something you did
       2. Something you did next
       2. Something you did next
@@ -44,42 +44,39 @@ body:
 - type: textarea
 - type: textarea
   attributes:
   attributes:
     label: Actual results
     label: Actual results
-    description: What happens after the above steps have been followed.
+    description: What happens after the above steps have been followed?
   validations:
   validations:
     required: true
     required: true
 - type: textarea
 - type: textarea
   attributes:
   attributes:
     label: Expected results
     label: Expected results
-    description: What should happen after the above steps have been followed.
+    description: What should happen after the above steps have been followed?
   validations:
   validations:
     required: true
     required: true
 - type: markdown
 - type: markdown
   attributes:
   attributes:
     value: |
     value: |
-      Please be sure to add the following files:
-        * To save a project file go to File -> Save project. 
-          Please make sure to .zip your project file. 
-          For big files, you may need to use [WeTransfer](https://wetransfer.com/) or similar file-sharing sites. 
-          G-code files are not project files!
-          Before you share, please think to yourself. Is this a model that can be shared?
-        * **Screenshots** of showing the problem, perhaps before/after images.
-        * A **log file** for crashes and similar issues.
-          You can find your log file here:
-          Windows: `%APPDATA%\cura\<Cura version>\cura.log` or usually `C:\Users\\<your username>\AppData\Roaming\cura\<Cura version>\cura.log`
-          MacOS: `$USER/Library/Application Support/cura/<Cura version>/cura.log`
-          Ubuntu/Linux: `$USER/.local/share/cura/<Cura version>/cura.log` 
-          
-          If the Cura user interface still starts, you can also reach this directory from the application menu in Help -> Show settings folder 
-- type: checkboxes
-  attributes:
-    label: Checklist of files to include
-    options:
-      - label: Log file
-      - label: Project file
+      ### Please add the following files when they are related to...
+        * 🔵 **The quality of your print**   
+          Please add **a Project File**. It contains the printer and settings we need for troubleshooting.    
+          To save a project file go to File -> Save project. 
+          Please make sure to .zip your project file. For big files, you may need to use [WeTransfer](https://wetransfer.com/) or similar file-sharing sites. 
+          G-code files are not project files! Before you share, please think to yourself. Is this a model that can be shared?
+          ![Alt Text](https://user-images.githubusercontent.com/40423138/240616958-5a9751f2-bd34-4808-9752-6fde2e27516e.gif)
+       * 🔵 **Using and interacting with Cura** 
+           Please add **screenshots** showing the issue. 
+           Before and after, and arrows can help here. 
+       * 🔵 **Unexpected crashes and behavior**
+           Please add **a log file** with information on what your Cura is doing.  
+           You can find your log file here:
+           Windows: `%APPDATA%\cura\<Cura version>\cura.log`
+           MacOS: `$USER/Library/Application Support/cura/<Cura version>/cura.log`
+           Ubuntu/Linux: `$USER/.local/share/cura/<Cura version>/cura.log` 
+           If the Cura user interface still starts, you can also reach this directory from the application menu in Help -> Show settings folder 
+
 - type: textarea
 - type: textarea
   attributes:
   attributes:
-    label: Additional information & file uploads  
-    description: You can add these files and additional information that is relevant to the issue in the comments below.
+    label: Add your .zip and screenshots here ⬇️ 
+    description: You can add the zip file and additional information that is relevant to the issue in the comments below.
   validations:
   validations:
     required: true
     required: true
-

+ 2 - 2
.github/PULL_REQUEST_TEMPLATE.md

@@ -28,6 +28,6 @@ This fixes... OR This improves... -->
 <!-- Check if relevant -->
 <!-- Check if relevant -->
 
 
 - [ ] My code follows the style guidelines of this project as described in [UltiMaker Meta](https://github.com/Ultimaker/Meta) and [Cura QML best practices](https://github.com/Ultimaker/Cura/wiki/QML-Best-Practices)
 - [ ] My code follows the style guidelines of this project as described in [UltiMaker Meta](https://github.com/Ultimaker/Meta) and [Cura QML best practices](https://github.com/Ultimaker/Cura/wiki/QML-Best-Practices)
-- [ ] I have read the [Contribution guide](https://github.com/Ultimaker/Cura/blob/main/contributing.md) 
+- [ ] I have read the [Contribution guide](https://github.com/Ultimaker/Cura/blob/main/CONTRIBUTING.md) 
 - [ ] I have commented my code, particularly in hard-to-understand areas
 - [ ] I have commented my code, particularly in hard-to-understand areas
-- [ ] I have uploaded any files required to test this change
+- [ ] I have uploaded any files required to test this change

+ 146 - 151
.github/workflows/conan-package-create.yml

@@ -1,158 +1,153 @@
 name: Create and Upload Conan package
 name: Create and Upload Conan package
 
 
 on:
 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
+  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:
 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
+  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:
 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-12 on ubuntu-22.04
-                if: ${{ startsWith(inputs.runs_on, 'ubuntu-22.04') }}
-                run: |
-                    sudo apt install g++-12 gcc-12 -y
-                    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
-                    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
-
-            -   name: Use GCC-10 on ubuntu-20.04
-                if: ${{ startsWith(inputs.runs_on, 'ubuntu-20.04') }}
-                run: |
-                    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
-                    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
-
-            -   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
-                if: ${{ inputs.conan_config_branch == '' }}
-                run: conan config install https://github.com/Ultimaker/conan-config.git
-
-            -   name: Add Cura private Artifactory remote
-                run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
-
-            -   name: Create the Packages
-                run: conan install ${{ inputs.recipe_id_full }} --build=missing --update
-
-            -   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 --all -c
+  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 https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
+
+      - 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 --all -c

+ 19 - 14
.github/workflows/conan-package.yml

@@ -49,15 +49,15 @@ on:
       - '[1-9].[0-9][0-9].[0-9]*'
       - '[1-9].[0-9][0-9].[0-9]*'
 
 
 env:
 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: ${{ inputs.conan_logging_level }}
-    CONAN_NON_INTERACTIVE: 1
-
-permissions: {}
+  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: ${{ inputs.conan_logging_level }}
+  CONAN_NON_INTERACTIVE: 1
+
+permissions: { }
 jobs:
 jobs:
   conan-recipe-version:
   conan-recipe-version:
     permissions:
     permissions:
@@ -103,18 +103,23 @@ jobs:
           sudo apt update
           sudo apt update
           sudo apt upgrade
           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 g++-12 gcc-12 -y
           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 g++-12 gcc-12 -y
-          sudo apt install g++-12 gcc-12 -y
-          sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
-          sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
+
+      - 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
       - name: Create the default Conan profile
         run: conan profile new default --detect --force
         run: conan profile new default --detect --force
 
 
       - name: Get Conan configuration
       - name: Get Conan configuration
-        run: conan config install https://github.com/Ultimaker/conan-config.git
+        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
       - 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
+        run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True -c tools.build:skip_test=True
 
 
       - name: Create the latest alias
       - name: Create the latest alias
         if: always()
         if: always()

+ 93 - 92
.github/workflows/conan-recipe-export.yml

@@ -1,106 +1,107 @@
 name: Export Conan Recipe to server
 name: Export Conan Recipe to server
 
 
 on:
 on:
-    workflow_call:
-        inputs:
-            recipe_id_full:
-                required: true
-                type: string
+  workflow_call:
+    inputs:
+      recipe_id_full:
+        required: true
+        type: string
 
 
-            recipe_id_latest:
-                required: false
-                type: string
+      recipe_id_latest:
+        required: false
+        type: string
 
 
-            runs_on:
-                required: true
-                type: string
+      runs_on:
+        required: true
+        type: string
 
 
-            python_version:
-                required: true
-                type: string
+      python_version:
+        required: true
+        type: string
 
 
-            conan_config_branch:
-                required: false
-                type: string
+      conan_config_branch:
+        required: false
+        type: string
 
 
-            conan_logging_level:
-                required: false
-                type: string
+      conan_logging_level:
+        required: false
+        type: string
 
 
-            conan_export_binaries:
-                required: false
-                type: boolean
+      conan_export_binaries:
+        required: false
+        type: boolean
 
 
-            conan_upload_community:
-                required: false
-                default: true
-                type: boolean
+      conan_upload_community:
+        required: false
+        default: true
+        type: boolean
 
 
 env:
 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
+  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:
 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
-                if: ${{ inputs.conan_config_branch == '' }}
-                run: conan config install https://github.com/Ultimaker/conan-config.git
-
-            -   name: Add Cura private Artifactory remote
-                run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
-
-            -   name: Export the Package (binaries)
-                if: ${{ inputs.conan_export_binaries }}
-                run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update
-
-            -   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 --all -c
-                    conan upload ${{ inputs.recipe_id_latest }} -r cura-private -c
+  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 https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
+
+      - 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 --all -c
+          conan upload ${{ inputs.recipe_id_latest }} -r cura-private -c

+ 0 - 151
.github/workflows/cura-all-installers.yml

@@ -1,151 +0,0 @@
-name: Cura All Installers
-run-name: ${{ inputs.cura_conan_version }} for exe ${{ inputs.build_windows_exe }}, msi ${{ inputs.build_windows_msi }}, dmg ${{ inputs.build_macos }}, pkg ${{ inputs.build_macos_installer }}, appimage ${{ inputs.build_linux }} - enterprise ${{ inputs.enterprise }}
-
-on:
-    workflow_dispatch:
-        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
-            conan_config:
-                description: 'Conan config branch to use'
-                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
-            installer:
-                description: 'Create the installer'
-                default: true
-                required: true
-                type: boolean
-            build_windows_exe:
-                description: 'Build for Windows exe'
-                default: false
-                required: true
-                type: boolean
-            build_windows_msi:
-                description: 'Build for msi+pkg'
-                default: true
-                required: true
-                type: boolean
-            build_linux:
-                description: 'Build for Linux'
-                default: true
-                required: true
-                type: boolean
-            build_macos:
-                description: 'Build dmg for MacOS'
-                default: true
-                required: true
-                type: boolean
-
-    # Run the nightly at 3:25 UTC on working days
-    schedule:
-    - cron: '25 3 * * 1-5'
-
-jobs:
-    windows-installer-create-exe:
-        if: ${{ inputs.build_windows_exe }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'windows-2022'
-            os_name: 'win64'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: false
-        secrets: inherit
-
-    windows-installer-create-msi:
-        if: ${{ inputs.build_windows_msi }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'windows-2022'
-            os_name: 'win64'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: true
-        secrets: inherit
-
-    linux-installer-create:
-        if: ${{ inputs.build_linux }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'ubuntu-20.04'
-            os_name: 'linux'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: false
-        secrets: inherit
-
-    linux-modern-installer-create:
-        if: ${{ inputs.build_linux }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'ubuntu-22.04'
-            os_name: 'linux-modern'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: false
-        secrets: inherit
-
-    macos-dmg-create:
-        if: ${{ inputs.build_macos }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'macos-11'
-            os_name: 'mac'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: false
-        secrets: inherit
-
-    macos-installer-create:
-        if: ${{ inputs.build_macos }}
-        uses: ./.github/workflows/cura-installer.yml
-        with:
-            platform: 'macos-11'
-            os_name: 'mac'
-            cura_conan_version: ${{ inputs.cura_conan_version }}
-            conan_args: ${{ inputs.conan_args }}
-            conan_config: ${{ inputs.conan_config }}
-            enterprise: ${{ inputs.enterprise }}
-            staging: ${{ inputs.staging }}
-            installer: ${{ inputs.installer }}
-            msi_installer: true
-        secrets: inherit

+ 0 - 372
.github/workflows/cura-installer.yml

@@ -1,372 +0,0 @@
-name: Cura Installer
-run-name: ${{ inputs.cura_conan_version }} for ${{ inputs.platform }} by @${{ github.actor }}
-
-on:
-    workflow_call:
-        inputs:
-            platform:
-                description: 'Selected Installer OS'
-                default: 'ubuntu-20.04'
-                required: true
-                type: string
-            os_name:
-                description: 'OS Friendly Name'
-                default: 'linux'
-                required: true
-                type: string
-            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
-            conan_config:
-                description: 'Conan config branch to use'
-                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
-            installer:
-                description: 'Create the installer'
-                default: true
-                required: true
-                type: boolean
-            msi_installer:
-                description: 'Create the msi'
-                default: false
-                required: true
-                type: boolean
-
-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: ${{ inputs.conan_logging_level }}
-    CONAN_NON_INTERACTIVE: 1
-    CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }}
-    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 }}
-    GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
-    MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }}
-    WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }}
-    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:
-    cura-installer-create:
-        runs-on: ${{ inputs.platform }}
-
-        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 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-${{ runner.os }}-${{ runner.arch }}-installer-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-${{ runner.os }}-${{ runner.arch }}-installer-cache
-
-            -   name: Install MacOS system requirements
-                if:  ${{ runner.os == 'Macos' }}
-                run: brew install autoconf automake ninja create-dmg # Delete create-dmg when deprecating dmg
-
-            -   name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards
-                if: ${{ runner.os == 'Linux' && startsWith(inputs.platform, 'ubuntu-22.04') }}
-                run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y
-
-            # 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
-                    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
-
-            -   name: Install GCC-12 on ubuntu-22.04
-                if: ${{ startsWith(inputs.platform, 'ubuntu-22.04') }}
-                run: |
-                    sudo apt install g++-12 gcc-12 -y
-                    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
-                    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
-
-            -   name: Use GCC-10 on ubuntu-20.04
-                if: ${{ startsWith(inputs.platform, 'ubuntu-20.04') }}
-                run: |
-                    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
-                    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
-
-            -   name: Create the default Conan profile
-                run:  conan profile new default --detect
-
-            -   name: Configure GPG Key Linux (Bash)
-                if: ${{ runner.os == 'Linux' }}
-                run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import
-
-            -   name: Configure Macos keychain Developer Cert(Bash)
-                id: macos-keychain-developer-cert
-                if: ${{ runner.os == 'Macos' }}
-                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
-                if: ${{ runner.os == 'Macos' }}
-                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: Create PFX certificate from BASE64_PFX_CONTENT secret
-                if: ${{ runner.os == 'Windows' }}
-                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: Get Conan configuration from branch
-                if: ${{ inputs.conan_config != '' }}
-                run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config }}"
-
-            -   name: Get Conan configuration
-                if: ${{ inputs.conan_config == '' }}
-                run: conan config install https://github.com/Ultimaker/conan-config.git
-
-            -   name: Create the Packages (Bash)
-                if: ${{ runner.os != 'Windows' }}
-                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 --json "cura_inst/conan_install_info.json"
-
-            -   name: Create the Packages (Powershell)
-                if: ${{ runner.os == 'Windows' }}
-                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 --json "cura_inst/conan_install_info.json"
-
-            -   name: Set Environment variables for Cura (bash)
-                if: ${{ runner.os != 'Windows' }}
-                run: |
-                    . ./cura_inst/bin/activate_github_actions_env.sh
-                    . ./cura_inst/bin/activate_github_actions_version_env.sh
-
-            -   name: Set Environment variables for Cura (Powershell)
-                if: ${{ runner.os == 'Windows' }}
-                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: Unlock Macos keychain (Bash)
-                if: ${{ runner.os == 'Macos' }}
-                run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain
-                env:
-                    TEMP_KEYCHAIN_PASSWORD: ${{  steps.macos-keychain-developer-cert.outputs.keychain-password }}
-
-                # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile
-                #  OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library.
-                #  Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly
-                #  and do a manual copy to the VirtualEnv, such that Pyinstaller can find it.
-
-            -   name: Install OpenSSL shared
-                run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
-
-            -   name: Copy OpenSSL shared (Bash)
-                if: ${{ runner.os != 'Windows' }}
-                run: |
-                    cp ./openssl/lib/*.so* ./cura_inst/bin/ || true
-                    cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true                    
-
-            -   name: Copy OpenSSL shared (Powershell)
-                if: ${{ runner.os == 'Windows' }}
-                run: |
-                    cp openssl/bin/*.dll ./cura_inst/Scripts/
-                    cp openssl/lib/*.lib ./cura_inst/Lib/
-
-            -   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}-${{ inputs.os_name }}"
-                    if "${{ runner.os }}" == "Windows":
-                        installer_ext = "msi" if "${{ inputs.msi_installer }}" == "true" else "exe"
-                    elif "${{ runner.os }}" == "macOS":
-                        installer_ext = "pkg" if "${{ inputs.msi_installer }}" == "true" else "dmg"
-                    else:
-                        installer_ext = "AppImage"
-                    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")
-                        f.writelines(f"INSTALLER_EXT={installer_ext}\n")
-                        f.writelines(f"FULL_INSTALLER_FILENAME={installer_filename}.{installer_ext}\n")
-
-            -   name: Summarize the used Conan dependencies
-                shell: python
-                run: |
-                    import os
-                    import json
-                    from pathlib import Path
-                                        
-                    conan_install_info_path = Path("cura_inst/conan_install_info.json")
-                    conan_info = {"installed": []}
-                    if os.path.exists(conan_install_info_path):
-                        with open(conan_install_info_path, "r") as f:
-                            conan_info = json.load(f)
-                    sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]])
-                    
-                    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.FULL_INSTALLER_FILENAME }} uses:\n")
-                        for dep in sorted_deps:
-                            f.writelines(f"`{dep}`\n")
-
-            -   name: Archive the artifacts (bash)
-                if: ${{ !inputs.installer && runner.os != 'Windows' }}
-                run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/"
-                working-directory: dist
-
-            -   name: Archive the artifacts (Powershell)
-                if: ${{ !inputs.installer && runner.os == 'Windows' }}
-                run: Compress-Archive -Path ".\UltiMaker-Cura" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip"
-                working-directory: dist
-
-            -   name: Create the Windows exe installer (Powershell)
-                if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }}
-                run: |
-                    python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}"
-                working-directory: dist
-
-            -   name: Create the Windows msi installer (Powershell)
-                if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }}
-                run: |
-                    python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$Env:CURA_APP_NAME"
-                working-directory: dist
-
-            -   name: Sign the Windows exe installer (Powershell)
-                if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }}
-                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.FULL_INSTALLER_FILENAME }}"
-                working-directory: dist
-
-            -   name: Sign the Windows msi installer (Powershell)
-                if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }}
-                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.FULL_INSTALLER_FILENAME }}"
-                working-directory: dist
-
-            -   name: Create the Linux AppImage (Bash)
-                if: ${{ inputs.installer && runner.os == 'Linux' }}
-                run: python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}"
-                working-directory: dist
-
-            -   name: Create the MacOS dmg and/or pkg (Bash)
-                if: ${{ github.event.inputs.installer == 'true' && runner.os == 'Macos' }}
-                run: python ../cura_inst/packaging/MacOS/build_macos.py ../cura_inst . $CURA_CONAN_VERSION "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$CURA_APP_NAME"
-                working-directory: dist
-
-            -   name: Upload the artifacts
-                uses: actions/upload-artifact@v3
-                with:
-                    name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-${{ steps.filename.outputs.INSTALLER_EXT }}
-                    path: |
-                        dist/*.tar.gz
-                        dist/*.zip
-                        dist/${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}
-                        dist/*.asc
-                    retention-days: 5
-
-    notify-export:
-        if: ${{ always() }}
-        needs: [ cura-installer-create ]
-
-        uses: ultimaker/cura/.github/workflows/notify.yml@main
-        with:
-            success: ${{ contains(join(needs.*.result, ','), 'success') }}
-            success_title: "Create the Cura distributions"
-            success_body: "Installers for ${{ inputs.cura_conan_version }}"
-            failure_title: "Failed to create the Cura distributions"
-            failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
-        secrets: inherit

+ 235 - 0
.github/workflows/installers.yml

@@ -0,0 +1,235 @@
+name: All installers
+run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }}
+
+on:
+  workflow_dispatch:
+    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
+      nightly:
+        description: 'Upload to nightly release'
+        default: false
+        required: true
+        type: boolean
+
+  schedule:
+    # Daily at 8:10 CET
+    - cron: '10 7 * * *'
+
+env:
+  CURA_CONAN_VERSION: ${{ inputs.cura_conan_version || 'cura/latest@ultimaker/testing' }}
+  CONAN_ARGS: ${{ inputs.conan_args || '' }}
+  ENTERPRISE: ${{ inputs.enterprise || false }}
+  STAGING: ${{ inputs.staging || false }}
+
+jobs:
+  windows-installer:
+    uses: ./.github/workflows/windows.yml
+    with:
+      cura_conan_version: ${{ github.event.inputs.cura_conan_version }}
+      conan_args: ${{ github.event.inputs.conan_args }}
+      enterprise: ${{ github.event.inputs.enterprise == 'true' }}
+      staging: ${{ github.event.inputs.staging == 'true' }}
+      architecture: X64
+      operating_system: windows-2022
+    secrets: inherit
+
+  linux-installer:
+    uses: ./.github/workflows/linux.yml
+    with:
+      cura_conan_version: ${{ github.event.inputs.cura_conan_version }}
+      conan_args: ${{ github.event.inputs.conan_args }}
+      enterprise: ${{ github.event.inputs.enterprise == 'true' }}
+      staging: ${{ github.event.inputs.staging == 'true' }}
+      architecture: X64
+      operating_system: ubuntu-22.04
+    secrets: inherit
+
+  macos-installer:
+    uses: ./.github/workflows/macos.yml
+    with:
+      cura_conan_version: ${{ github.event.inputs.cura_conan_version }}
+      conan_args: ${{ github.event.inputs.conan_args }}
+      enterprise: ${{ github.event.inputs.enterprise == 'true' }}
+      staging: ${{ github.event.inputs.staging == 'true' }}
+      architecture: X64
+      operating_system: macos-11.0
+    secrets: inherit
+
+#  macos-arm-installer:
+#    uses: ./.github/workflows/macos.yml
+#    with:
+#      cura_conan_version: ${{ github.event.inputs.cura_conan_version }}
+#      conan_args: ${{ github.event.inputs.conan_args }}
+#      enterprise: ${{ github.event.inputs.enterprise == 'true' }}
+#      staging: ${{ github.event.inputs.staging == 'true' }}
+#      architecture: ARM64
+#      operating_system: self-hosted
+#    secrets: inherit
+
+  # Run and update nightly release when the nightly input is set to true or if the schedule is triggered
+  update-nightly-release:
+    if: ${{ always() && (! cancelled()) && contains(needs.*.result, 'success') && (! contains(needs.*.result, 'failure')) && (inputs.nightly || github.event_name == 'schedule') }}
+    runs-on: ubuntu-latest
+    needs: [ windows-installer, linux-installer, macos-installer ]
+#    needs: [ windows-installer, linux-installer, macos-installer, macos-arm-installer ]
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      # It's not necessary to download all three, but it does make sure we have at least one if an OS is skipped.
+
+      - name: Download the run info
+        uses: actions/download-artifact@v2
+        with:
+          name: linux-run-info
+
+      - name: Set the run info as environment variables
+        run: |
+          . run_info.sh 
+
+      - name: Output the name file name and extension
+        id: filename
+        shell: python
+        run: |
+          import os
+          import datetime
+          enterprise = "-Enterprise" if "${{ github.event.inputs.enterprise }}" == "true" else ""
+          linux = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-X64"
+          mac_x64_dmg = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-X64"
+          mac_x64_pkg = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-X64"
+          mac_arm_dmg = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-ARM64"
+          mac_arm_pkg = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-ARM64"
+          win_msi = installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-win64-X64"
+          win_exe = installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-win64-X64"
+          nightly_name = "UltiMaker-Cura-" + os.getenv('CURA_VERSION_FULL').split("+")[0]
+          nightly_creation_time = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
+          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"LINUX={linux}\n")
+              f.writelines(f"MAC_X64_DMG={mac_x64_dmg}\n")
+              f.writelines(f"MAC_X64_PKG={mac_x64_pkg}\n")
+              f.writelines(f"MAC_ARM_DMG={mac_arm_dmg}\n")
+              f.writelines(f"MAC_ARM_PKG={mac_arm_pkg}\n")
+              f.writelines(f"WIN_MSI={win_msi}\n")
+              f.writelines(f"WIN_EXE={win_exe}\n")
+              f.writelines(f"NIGHTLY_NAME={nightly_name}\n")
+              f.writelines(f"NIGHTLY_TIME={nightly_creation_time}\n")
+
+      - name: Download linux installer jobs artifacts
+        uses: actions/download-artifact@v2
+        with:
+          name: ${{ steps.filename.outputs.LINUX }}-AppImage
+          path: installers
+
+      - name: Rename Linux installer to nightlies
+        run: |
+          mv installers/${{ steps.filename.outputs.LINUX }}.AppImage installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage
+
+      - name: Update nightly release for Linux
+        run: |
+          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage --clobber
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Download win msi installer jobs artifacts
+        uses: actions/download-artifact@v2
+        with:
+          name: ${{ steps.filename.outputs.WIN_MSI }}-msi
+          path: installers
+
+      - name: Download win exe installer jobs artifacts
+        uses: actions/download-artifact@v2
+        with:
+          name: ${{ steps.filename.outputs.WIN_EXE }}-exe
+          path: installers
+
+      - name: Rename Windows installers to nightlies
+        run: |
+          mv installers/${{ steps.filename.outputs.WIN_MSI }}.msi installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.msi
+          mv installers/${{ steps.filename.outputs.WIN_EXE }}.exe installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.exe
+
+      - name: Update nightly release for Windows
+        run: |
+          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.msi --clobber
+          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.exe --clobber
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Download MacOS (X64) dmg installer jobs artifacts
+        uses: actions/download-artifact@v2
+        with:
+          name: ${{ steps.filename.outputs.MAC_X64_DMG }}-dmg
+          path: installers
+
+      - name: Download MacOS (X64) pkg installer jobs artifacts
+        uses: actions/download-artifact@v2
+        with:
+          name: ${{ steps.filename.outputs.MAC_X64_PKG }}-pkg
+          path: installers
+
+      - name: Rename MacOS (X64) installers to nightlies
+        run: |
+          mv installers/${{ steps.filename.outputs.MAC_X64_DMG }}.dmg installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.dmg
+          mv installers/${{ steps.filename.outputs.MAC_X64_PKG }}.pkg installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.pkg
+
+      - name: Update nightly release for MacOS (X64)
+        run: |
+          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.dmg --clobber
+          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.pkg --clobber
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+#      - name: Download MacOS (ARM-64) dmg installer jobs artifacts
+#        uses: actions/download-artifact@v2
+#        with:
+#          name: ${{ steps.filename.outputs.MAC_ARM_DMG }}-dmg
+#          path: installers
+#
+#      - name: Download MacOS (ARM-64) pkg installer jobs artifacts
+#        uses: actions/download-artifact@v2
+#        with:
+#          name: ${{ steps.filename.outputs.MAC_ARM_PKG }}-pkg
+#          path: installers
+#
+#      - name: Rename MacOS (ARM-64) installers to nightlies
+#        run: |
+#          mv installers/${{ steps.filename.outputs.MAC_ARM_DMG }}.dmg installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.dmg
+#          mv installers/${{ steps.filename.outputs.MAC_ARM_PKG }}.pkg installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.pkg
+#
+#      - name: Update nightly release for MacOS (ARM-64)
+#        run: |
+#          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.dmg --clobber
+#          gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.pkg --clobber
+#        env:
+#          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+      - name: Update nightly release description (with date)
+        if: always()
+        run: |
+          gh release edit nightly --title "${{ steps.filename.outputs.NIGHTLY_NAME }}" --notes "Nightly release created on: ${{ steps.filename.outputs.NIGHTLY_TIME }}"
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

+ 285 - 0
.github/workflows/linux.yml

@@ -0,0 +1,285 @@
+name: Linux Installer
+run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }}
+
+on:
+  workflow_dispatch:
+    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: choice
+        options:
+          - X64
+      operating_system:
+        description: 'OS'
+        required: true
+        default: 'ubuntu-22.04'
+        type: choice
+        options:
+          - 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:
+  CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
+  CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
+  GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
+  CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
+  ENTERPRISE: ${{ inputs.enterprise }}
+  STAGING: ${{ inputs.staging }}
+
+jobs:
+  cura-installer-create:
+    runs-on: ${{ inputs.operating_system }}
+
+    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: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards
+        if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }}
+        run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y
+
+      # 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
+        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 binutils coreutils desktop-file-utils fakeroot fuse libgdk-pixbuf2.0-dev patchelf squashfs-tools strace util-linux zsync -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 --json "cura_inst/conan_install_info.json"
+
+      - 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
+
+        # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile
+        #  OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library.
+        #  Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly
+        #  and do a manual copy to the VirtualEnv, such that Pyinstaller can find it.
+
+      - name: Install OpenSSL shared
+        run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
+
+      - name: Copy OpenSSL shared (Bash)
+        run: |
+          cp ./openssl/lib/*.so* ./cura_inst/bin/ || true
+          cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true                    
+
+      - 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 Conan dependencies
+        shell: python
+        run: |
+          import os
+          import json
+          from pathlib import Path
+          
+          conan_install_info_path = Path("cura_inst/conan_install_info.json")
+          conan_info = {"installed": []}
+          if os.path.exists(conan_install_info_path):
+              with open(conan_install_info_path, "r") as f:
+                  conan_info = json.load(f)
+          sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]])
+          
+          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 in sorted_deps:
+                  f.writelines(f"`{dep}`\n")
+
+      - name: Summarize the used Python modules
+        shell: python
+        run: |
+          import os
+          import pkg_resources
+          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("## Python modules:\n")
+              for package in pkg_resources.working_set:
+                  f.writelines(f"`{package.key}/{package.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: 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:
+      success: ${{ contains(join(needs.*.result, ','), 'success') }}
+      success_title: "Create the Cura distributions"
+      success_body: "Installers for ${{ inputs.cura_conan_version }}"
+      failure_title: "Failed to create the Cura distributions"
+      failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
+    secrets: inherit

+ 294 - 0
.github/workflows/macos.yml

@@ -0,0 +1,294 @@
+name: Macos Installer
+run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }}
+
+on:
+  workflow_dispatch:
+    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: choice
+        options:
+          - X64
+          - ARM64
+      operating_system:
+        description: 'OS'
+        required: true
+        default: 'macos-11'
+        type: choice
+        options:
+          - self-hosted
+          - macos-11
+          - 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: 'X64'
+        type: string
+      operating_system:
+        description: 'OS'
+        required: true
+        default: 'macos-11'
+        type: string
+
+env:
+  CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
+  CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
+  CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }}
+  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:
+  cura-installer-create:
+    runs-on: ${{ inputs.operating_system }}
+
+    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 (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: 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 --json "cura_inst/conan_install_info.json"
+
+      - 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: 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 }}
+
+        # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile
+        #  OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library.
+        #  Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly
+        #  and do a manual copy to the VirtualEnv, such that Pyinstaller can find it.
+      - name: Install OpenSSL shared
+        run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
+
+      - name: Copy OpenSSL shared (Bash)
+        run: |
+          cp ./openssl/lib/*.so* ./cura_inst/bin/ || true
+          cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true                    
+
+      - 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 Conan dependencies
+        shell: python
+        run: |
+          import os
+          import json
+          from pathlib import Path
+          
+          conan_install_info_path = Path("cura_inst/conan_install_info.json")
+          conan_info = {"installed": []}
+          if os.path.exists(conan_install_info_path):
+              with open(conan_install_info_path, "r") as f:
+                  conan_info = json.load(f)
+          sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]])
+          
+          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 in sorted_deps:
+                  f.writelines(f"`{dep}`\n")
+
+      - name: Summarize the used Python modules
+        shell: python
+        run: |
+          import os
+          import pkg_resources
+          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("## Python modules:\n")
+              for package in pkg_resources.working_set:
+                  f.writelines(f"`{package.key}/{package.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:
+      success: ${{ contains(join(needs.*.result, ','), 'success') }}
+      success_title: "Create the Cura distributions"
+      success_body: "Installers for ${{ inputs.cura_conan_version }}"
+      failure_title: "Failed to create the Cura distributions"
+      failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
+    secrets: inherit

Some files were not shown because too many files changed in this diff