name: 'Speckle Automate Function - Build and Publish' description: 'Builds and publishes a new version of a Speckle Automate Function to the Speckle Automate platform.' author: 'specklesystems' branding: icon: 'upload-cloud' color: 'blue' inputs: speckle_automate_url: description: 'Speckle Automate URL. Should include the `https://` protocol and not end with a trailing slash.' required: false default: 'https://automate.speckle.dev' #TODO change to https://automate.speckle.systems speckle_token: description: 'Token for authentication to Speckle Automate Server, allowing publishing of Speckle Functions. **The token must be stored in GitHub as an encrypted secret**.' required: true speckle_function_id: description: 'The unique identifier of the function. Go to Speckle Automate to register your Function and get its Identifier.' required: true speckle_function_input_schema_file_path: description: 'File path containing JSON Schema of the parameters object required by the function. These will be used to create the User Interface displayed to users of your Function in Speckle Automate. Users will be able to provide their data to customise the Function.' required: false speckle_function_command: description: 'The command to run to execute the function in a runtime environment.' required: true speckle_function_recommended_cpu_m: description: 'The recommended maximum CPU in millicores for the function. 1000 millicores = 1 CPU core. Defaults to 1000 millicores (1 CPU core). If the Function exceeds this limit, it will be throttled to run within the limit.' required: false speckle_function_recommended_memory_mi: description: 'The recommended maximum memory in mebibytes for the function. 1024 mebibytes = 1 gibibyte. Defaults to 100 mebibytes. If the Function exceeds this limit, it will be terminated.' required: false dockerfile_path: description: 'Path to the Dockerfile to be used to build the Speckle Function.' required: false default: './Dockerfile' docker_context: description: 'Path to the directory containing the build context for the Docker image.' required: false default: '.' # root directory of the checked out source code runs: using: "composite" steps: - name: Validate inputs shell: bash run: | if [ -z "${{ inputs.speckle_token }}" ]; then echo "ERROR: speckle_token secret is required" exit 1 fi if [ -z "${{ inputs.speckle_automate_url }}" ]; then echo "ERROR: speckle_automate_url input value is required" exit 1 fi if [ -z "${{ inputs.speckle_function_id }}" ]; then echo "ERROR: speckle_function_id input value is required" exit 1 fi if [ -z "${{ inputs.speckle_function_input_schema_file_path }}" ]; then echo "ERROR: speckle_function_input_schema_file_path input value is required" exit 1 fi if [ -z "${{ inputs.speckle_function_command }}" ]; then echo "ERROR: speckle_function_command input value is required" exit 1 fi - name: Set Version tag shell: bash run: | echo "Determining Release tag value" if [[ ${GITHUB_REF_TYPE} == "tag" ]] then echo "Workflow triggered by a git tag" RELEASE_TAG=${GITHUB_REF_NAME} else echo "Workflow triggered on a git branch" RELEASE_TAG=$(git rev-parse --short ${GITHUB_SHA}) fi echo "Setting the function's releaseTag to: ${RELEASE_TAG}" echo "releaseTag=${RELEASE_TAG}" >> "$GITHUB_ENV" - name: Set up Docker Buildx # required to enable caching of docker build uses: docker/setup-buildx-action@v3 - name: Log in to Speckle Automate Docker registry uses: docker/login-action@v3.1.0 with: registry: ${{ inputs.speckle_automate_url }} username: ${{ inputs.speckle_token }} password: ${{ inputs.speckle_token }} - name: Parse automate host shell: bash run: | AUTOMATE_HOST=$(python -c 'from urllib.parse import urlparse; print(urlparse("${{ inputs.speckle_automate_url }}").netloc)') echo "Parsed automate host: ${AUTOMATE_HOST}" echo "automateHost=${AUTOMATE_HOST}" >>"$GITHUB_ENV" - name: Ensure image doesn't exist in registry shell: bash run: | set +e docker manifest inspect ${{ env.automateHost }}/${{ inputs.speckle_function_id }}:${{ env.releaseTag }} if [[ $? == 0 ]] then echo "Cannot override the existing release tag ${{ env.releaseTag }}. Please publish a new release!" exit 1 fi - name: Build and push Docker image uses: docker/build-push-action@v5.3.0 with: context: ${{ inputs.docker_context }} file: ${{ inputs.dockerfile_path }} tags: ${{ env.automateHost }}/${{ inputs.speckle_function_id }}:${{ env.releaseTag }} target: '' push: true cache-from: type=registry,ref=${{ env.automateHost }}/${{ inputs.speckle_function_id }}:buildcache cache-to: type=registry,ref=${{ env.automateHost }}/${{ inputs.speckle_function_id }}:buildcache,mode=max - name: Speckle Automate function version publisher uses: specklesystems/speckle-automate-github-action@0.11.0 id: register_speckle_function_version with: speckle_automate_url: ${{ inputs.speckle_automate_url }} speckle_token: ${{ inputs.speckle_token }} speckle_function_id: ${{ inputs.speckle_function_id }} speckle_function_input_schema_file_path: ${{ inputs.speckle_function_input_schema_file_path }} speckle_function_release_tag: ${{ env.releaseTag }} speckle_function_command: ${{ inputs.speckle_function_command }} speckle_function_recommended_cpu_m: ${{ inputs.speckle_function_recommended_cpu_m }} speckle_function_recommended_memory_mi: ${{ inputs.speckle_function_recommended_memory_mi }}