diff --git a/.github/actions/build_and_publish_image/action.yaml b/.github/actions/build_and_publish_image/action.yaml new file mode 100644 index 0000000..3878a6d --- /dev/null +++ b/.github/actions/build_and_publish_image/action.yaml @@ -0,0 +1,67 @@ +name: Build & publish an image + +description: Build an image from source, then publish it to GHCR + +inputs: + build_args: + description: '`ARG=value`s to pass to `docker build`' + required: false + dockerfile: + description: Image source file name + default: 'Dockerfile' + required: false + github_token: + description: A GitHub personal access token (PAT) that matches the username + required: true + github_username: + description: The GitHub user as whom to run this action + required: true + image_source_directory: + description: Image source directory path + required: true + image_name: + description: The basename for all image tags, such as "image" in "ghcr.io/user/repo/image:latest" + required: true + image_version_1: + description: A version for all image tags, such as "foo" in "ghcr.io/user/repo/image:foo" + required: true + image_version_2: + description: Another version for all image tags, such as "bar" in "ghcr.io/user/repo/image:bar" + required: false + image_version_suffix: + description: A suffix for all image tags, such as "-baz" in "ghcr.io/user/repo/image:foo-baz" + required: false + use_cache: + default: "true" + description: Use cached layers from pre-published image with tag 1 (true/false) + required: false + +runs: + using: composite + steps: + - shell: bash + run: | + set -x + + echo ${{ inputs.github_token }} | docker login ghcr.io -u ${{ inputs.github_username }} --password-stdin + export BUILD_ARGS="" + if [[ -n "${{ inputs.build_args }}" ]]; then + IFS=";" read -ra args <<< "${{ inputs.build_args }}" + for arg in ${args[@]}; do BUILD_ARGS+="--build-arg $arg "; done + fi + + export IMAGE_TAG_URL_PREFIX=ghcr.io/selkies-project/selkies-vdi/ + export IMAGE_TAG_1="${IMAGE_TAG_URL_PREFIX}${{ inputs.image_name }}:${{ inputs.image_version_1 }}${{ inputs.image_version_suffix }}" + if [[ "${{ inputs.use_cache }}" == "true" ]]; then + docker pull $IMAGE_TAG_1 || true + (cd ${{ inputs.image_source_directory }} && docker build $BUILD_ARGS -f ${{ inputs.dockerfile }} --cache-from $IMAGE_TAG_1 -t $IMAGE_TAG_1 .) + else + (cd ${{ inputs.image_source_directory }} && docker build $BUILD_ARGS -f ${{ inputs.dockerfile }} -t $IMAGE_TAG_1 .) + fi + docker push $IMAGE_TAG_1 + + if [ '${{ inputs.image_version_2 }}' != '' ]; then + export IMAGE_TAG_2="${IMAGE_TAG_URL_PREFIX}${{ inputs.image_name }}:${{ inputs.image_version_2 }}${{ inputs.image_version_suffix }}" + docker tag $IMAGE_TAG_1 $IMAGE_TAG_2 + docker push $IMAGE_TAG_2 + fi diff --git a/.github/workflows/build_and_publish_all_images.yaml b/.github/workflows/build_and_publish_all_images.yaml index fcf245c..5026a1b 100644 --- a/.github/workflows/build_and_publish_all_images.yaml +++ b/.github/workflows/build_and_publish_all_images.yaml @@ -1,10 +1,224 @@ -name: Stub +name: Build & publish all images -on: workflow_call +on: + workflow_call: + inputs: + image_version_1: + description: A version for all image tags, such as "foo" in "ghcr.io/user/repo/image:foo" + required: true + type: string + image_version_2: + description: Another version for all image tags, such as "bar" in "ghcr.io/user/repo/image:bar" + required: false + type: string + +env: + github_token: ${{ secrets.GITHUB_TOKEN }} + github_username: $GITHUB_ACTOR jobs: - stub: + app_proxy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-proxy + image_source_directory: images/app-proxy + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + app_streaming_bionic: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + dockerfile: Dockerfile.bionic + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + image_version_suffix: -bionic + + app_streaming_buster: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + image_version_suffix: -buster + + app_streaming_focal: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + dockerfile: Dockerfile.focal + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + image_version_suffix: -focal + + app_streaming_focal_cuda: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + dockerfile: Dockerfile.focal-cuda + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + image_version_suffix: -focal-cuda + + desktop: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: desktop + image_source_directory: images/desktop + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + pulseaudio: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: pulseaudio + image_source_directory: images/pulseaudio + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + squid_proxy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: squid-proxy + image_source_directory: images/squid-proxy + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + tinyfilemanager: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: tinyfilemanager + image_source_directory: images/tinyfilemanager + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + uinput_device_plugin: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: uinput-device-plugin + image_source_directory: images/uinput-device-plugin + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + watchdog: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: watchdog + image_source_directory: images/watchdog + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + webrtc: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: webrtc + image_source_directory: images/webrtc + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + xpra: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: xpra + image_source_directory: images/xpra + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} + + xserver: runs-on: ubuntu-latest steps: - - run: echo 'stub' + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: xserver + image_source_directory: images/xserver + image_version_1: ${{ inputs.image_version_1 }} + image_version_2: ${{ inputs.image_version_2 }} \ No newline at end of file diff --git a/.github/workflows/build_and_publish_changed_images.yaml b/.github/workflows/build_and_publish_changed_images.yaml index fcf245c..46004a2 100644 --- a/.github/workflows/build_and_publish_changed_images.yaml +++ b/.github/workflows/build_and_publish_changed_images.yaml @@ -1,10 +1,357 @@ -name: Stub +name: Build & publish changed images -on: workflow_call +on: + workflow_call: + inputs: + image_version_1: + description: A version for all image tags, such as "foo" in "ghcr.io/user/repo/image:foo" + required: true + type: string + image_version_2: + description: Another version for all image tags, such as "bar" in "ghcr.io/user/repo/image:bar" + required: false + type: string + +env: + github_token: ${{ secrets.GITHUB_TOKEN }} + github_username: $GITHUB_ACTOR jobs: - stub: + check_image_source_changes: + runs-on: ubuntu-latest + outputs: + app_proxy_changed: ${{ steps.check_app_proxy.outputs.any_changed == 'true' || steps.check_app_proxy.outputs.any_deleted == 'true' }} + app_streaming_bionic_changed: ${{ steps.check_app_streaming_bionic.outputs.any_changed == 'true' || steps.check_app_streaming_bionic.outputs.any_deleted == 'true' }} + app_streaming_buster_changed: ${{ steps.check_app_streaming_buster.outputs.any_changed == 'true' || steps.check_app_streaming_buster.outputs.any_deleted == 'true' }} + app_streaming_focal_changed: ${{ steps.check_app_streaming_focal.outputs.any_changed == 'true' || steps.check_app_streaming_focal.outputs.any_deleted == 'true' }} + app_streaming_focal_cuda_changed: ${{ steps.check_app_streaming_focal_cuda.outputs.any_changed == 'true' || steps.check_app_streaming_focal_cuda.outputs.any_deleted == 'true' }} + desktop_changed: ${{ steps.check_desktop.outputs.any_changed == 'true' || steps.check_desktop.outputs.any_deleted == 'true' }} + pulseaudio_changed: ${{ steps.check_pulseaudio.outputs.any_changed == 'true' || steps.check_pulseaudio.outputs.any_deleted == 'true' }} + squid_proxy_changed: ${{ steps.check_squid_proxy.outputs.any_changed == 'true' || steps.check_squid_proxy.outputs.any_deleted == 'true' }} + tinyfilemanager_changed: ${{ steps.check_tinyfilemanager.outputs.any_changed == 'true' || steps.check_tinyfilemanager.outputs.any_deleted == 'true' }} + uinput_device_plugin_changed: ${{ steps.check_uinput_device_plugin.outputs.any_changed == 'true' || steps.check_uinput_device_plugin.outputs.any_deleted == 'true' }} + watchdog_changed: ${{ steps.check_watchdog.outputs.any_changed == 'true' || steps.check_watchdog.outputs.any_deleted == 'true' }} + webrtc_changed: ${{ steps.check_webrtc.outputs.any_changed == 'true' || steps.check_webrtc.outputs.any_deleted == 'true' }} + xpra_changed: ${{ steps.check_xpra.outputs.any_changed == 'true' || steps.check_xpra.outputs.any_deleted == 'true' }} + xserver_changed: ${{ steps.check_xserver.outputs.any_changed == 'true' || steps.check_xserver.outputs.any_deleted == 'true' }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 2 # This is for changed-files. + + - id: check_app_proxy + name: Check for changes to the app proxy image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/app-proxy + + - id: check_app_streaming_bionic + name: Check for changes to the app streaming (bionic) image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: | + images/app-streaming/10_nvidia.json + images/app-streaming/Dockerfile.bionic + images/app-streaming/entrypoint.json + images/app-streaming/nvidia_icd.json + + - id: check_app_streaming_buster + name: Check for changes to the app streaming (buster) image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: | + images/app-streaming/10_nvidia.json + images/app-streaming/Dockerfile + images/app-streaming/entrypoint.json + images/app-streaming/nvidia_icd.json + + - id: check_app_streaming_focal + name: Check for changes to the app streaming (focal) image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: | + images/app-streaming/10_nvidia.json + images/app-streaming/Dockerfile.focal + images/app-streaming/entrypoint.json + images/app-streaming/nvidia_icd.json + + - id: check_app_streaming_focal_cuda + name: Check for changes to the app streaming (focal cuda) image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: | + images/app-streaming/10_nvidia.json + images/app-streaming/Dockerfile.focal-cuda + images/app-streaming/entrypoint.json + images/app-streaming/nvidia_icd.json + + - id: check_desktop + name: Check for changes to the desktop image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/desktop + + - id: check_pulseaudio + name: Check for changes to the pulseaudio image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/pulseaudio + + - id: check_squid_proxy + name: Check for changes to the squid proxy image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/squid-proxy + + - id: check_tinyfilemanager + name: Check for changes to the tinyfilemanager image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/tinyfilemanager + + - id: check_uinput_device_plugin + name: Check for changes to the uinput device plugin image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/uinput-device-plugin + + - id: check_watchdog + name: Check for changes to the watchdog image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/watchdog + + - id: check_webrtc + name: Check for changes to the webrtc image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/webrtc + + - id: check_xpra + name: Check for changes to the xpra image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/xpra + + - id: check_xserver + name: Check for changes to the xserver image source + uses: tj-actions/changed-files@v1.1.2 + with: + files: images/xserver + + app_proxy: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.app_proxy_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-proxy + image_source_directory: images/app-proxy + image_version_1: ${{ inputs.image_version_1 }} + + app_streaming_bionic: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.app_streaming_bionic_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_suffix: -bionic + + app_streaming_buster: + needs: detect_image_source_changes + if: needs.detect_image_source_changes.outputs.app_streaming_buster_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_suffix: -buster + + app_streaming_focal: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.app_streaming_focal_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_suffix: -focal + + app_streaming_focal_cuda: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.app_streaming_focal_cuda_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: app-streaming + image_source_directory: images/app-streaming + image_version_1: ${{ inputs.image_version_1 }} + image_version_suffix: -focal-cuda + + desktop: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.desktop_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: desktop + image_source_directory: images/desktop + image_version_1: ${{ inputs.image_version_1 }} + + pulseaudio: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.pulseaudio_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: pulseaudio + image_source_directory: images/pulseaudio + image_version_1: ${{ inputs.image_version_1 }} + + squid_proxy: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.squid_proxy_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: squid-proxy + image_source_directory: images/squid-proxy + image_version_1: ${{ inputs.image_version_1 }} + + tinyfilemanager: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.tinyfilemanager_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: tinyfilemanager + image_source_directory: images/tinyfilemanager + image_version_1: ${{ inputs.image_version_1 }} + + uinput_device_plugin: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.uinput_device_plugin_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: uinput-device-plugin + image_source_directory: images/uinput-device-plugin + image_version_1: ${{ inputs.image_version_1 }} + + watchdog: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.watchdog_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: watchdog + image_source_directory: images/watchdog + image_version_1: ${{ inputs.image_version_1 }} + + webrtc: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.webrtc_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: webrtc-app + image_source_directory: images/webrtc + image_version_1: ${{ inputs.image_version_1 }} + + xpra: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.xpra_changed == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: recursive + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: xpra + image_source_directory: images/xpra + image_version_1: ${{ inputs.image_version_1 }} + + xserver: + needs: check_image_source_changes + if: needs.check_image_source_changes.outputs.xserver_changed == 'true' runs-on: ubuntu-latest steps: - - run: echo 'stub' + - uses: actions/checkout@v2 + - name: Build & publish image + uses: ./.github/actions/build_and_publish_image + with: + github_token: $github_token + github_username: $github_username + image_name: xserver + image_source_directory: images/xserver + image_version_1: ${{ inputs.image_version_1 }} diff --git a/.github/workflows/create_release.yaml b/.github/workflows/create_release.yaml deleted file mode 100644 index fcf245c..0000000 --- a/.github/workflows/create_release.yaml +++ /dev/null @@ -1,10 +0,0 @@ -name: Stub - -on: workflow_call - -jobs: - - stub: - runs-on: ubuntu-latest - steps: - - run: echo 'stub' diff --git a/.github/workflows/on_manual_build_all.yaml b/.github/workflows/on_manual_build_all.yaml index 2139cc9..afdebf4 100644 --- a/.github/workflows/on_manual_build_all.yaml +++ b/.github/workflows/on_manual_build_all.yaml @@ -1,10 +1,10 @@ -name: Stub +name: "Trigger: Manual request to build & publish all images" on: workflow_dispatch jobs: - stub: - runs-on: ubuntu-latest - steps: - - run: echo 'stub' + all_images: + uses: selkies-project/selkies-vdi/.github/workflows/build_and_publish_all_images.yaml@master + with: + image_version_1: $GITHUB_REF_NAME diff --git a/.github/workflows/on_manual_build_changed.yaml b/.github/workflows/on_manual_build_changed.yaml index 2139cc9..6203baa 100644 --- a/.github/workflows/on_manual_build_changed.yaml +++ b/.github/workflows/on_manual_build_changed.yaml @@ -1,10 +1,10 @@ -name: Stub +name: "Trigger: Manual request to build & publish changed images" on: workflow_dispatch jobs: - stub: - runs-on: ubuntu-latest - steps: - - run: echo 'stub' + changed_images: + uses: selkies-project/selkies-vdi/.github/workflows/build_and_publish_changed_images.yaml@master + with: + image_version_1: $GITHUB_REF_NAME diff --git a/.github/workflows/on_release_tag.yaml b/.github/workflows/on_release_tag.yaml index 2139cc9..2663a7c 100644 --- a/.github/workflows/on_release_tag.yaml +++ b/.github/workflows/on_release_tag.yaml @@ -1,10 +1,27 @@ -name: Stub +name: "Trigger: A release tag was pushed to the repo" -on: workflow_dispatch +on: + push: + tags: + - 'v*' jobs: - stub: + build_and_publish_all_images: + uses: selkies-project/selkies-vdi/.github/workflows/build_and_publish_all_images.yaml@master + with: + image_version_1: $GITHUB_REF_NAME + image_version_2: latest + + create_release: + needs: build_and_publish_all_images runs-on: ubuntu-latest steps: - - run: echo 'stub' + - uses: actions/create-release@v1 + env: + github_token: ${{ secrets.GITHUB_TOKEN }} + with: + draft: true + prerelease: false + release_name: Release $GITHUB_REF_NAME + tag_name: $GITHUB_REF_NAME