name: Build Release Suite on: push: branches: - stable tags: - v* # Global vars env: AWS_REGION: "us-east-1" jobs: build: name: Build Release env: SCCACHE_CACHE_SIZE: "1G" SCCACHE_IDLE_TIMEOUT: 0 AWS_S3_ARTIFACTS_BUCKET: "openethereum-releases" strategy: matrix: platform: - ubuntu-20.04 - macos-latest - windows-latest toolchain: - stable runs-on: ${{ matrix.platform }} steps: - name: Checkout sources uses: actions/checkout@master - name: Install toolchain uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.toolchain }} profile: minimal override: true - name: Cache cargo registry uses: actions/cache@v2 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-build-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v2 with: path: ~/.cargo/git key: ${{ runner.os }}-cargo-git-build-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v2 with: path: target key: ${{ runner.os }}-cargo-build-target-build-${{ hashFiles('**/Cargo.lock') }} - name: Cache sccache linux if: matrix.platform == 'ubuntu-20.04' uses: actions/cache@v2 with: path: "/home/runner/.cache/sccache" key: ${{ runner.os }}-sccache-build-${{ hashFiles('**/Cargo.lock') }} - name: Cache sccache MacOS if: matrix.platform == 'macos-latest' uses: actions/cache@v2 with: path: "/Users/runner/Library/Caches/Mozilla.sccache" key: ${{ runner.os }}-sccache-build-${{ hashFiles('**/Cargo.lock') }} - name: Cache sccache Windows if: matrix.platform == 'windows-latest' uses: actions/cache@v2 with: path: "C:\\Users\\runneradmin\\AppData\\Local\\Mozilla\\sccache\\cache" key: ${{ runner.os }}-sccache-build-${{ hashFiles('**/Cargo.lock') }} - name: Install sccache for ${{ matrix.platform }} shell: pwsh run: pwsh scripts/actions/install-sccache.ps1 ${{ runner.os}} # ============================== # Windows Build # ============================== - name: Install LLVM for Windows if: matrix.platform == 'windows-latest' run: choco install llvm - name: Sccache statistics run: sccache --show-stats - name: Build OpenEthereum for Windows if: matrix.platform == 'windows-latest' run: sh scripts/actions/build-windows.sh ${{matrix.platform}} - name: Upload Windows build uses: actions/upload-artifact@v2 if: matrix.platform == 'windows-latest' with: name: windows-artifacts path: artifacts # ============================== # Linux/Macos Build # ============================== - name: Build OpenEthereum for ${{matrix.platform}} if: matrix.platform != 'windows-latest' run: sh scripts/actions/build-linux.sh ${{matrix.platform}} - name: Upload Linux build uses: actions/upload-artifact@v2 if: matrix.platform == 'ubuntu-20.04' with: name: linux-artifacts path: artifacts - name: Upload MacOS build uses: actions/upload-artifact@v2 if: matrix.platform == 'macos-latest' with: name: macos-artifacts path: artifacts # ============================== # End builds # ============================== - name: Stop sccache if: always() run: sccache --stop-server - name: Prepare build directory for cache shell: bash run: bash scripts/actions/clean-target.sh zip-artifacts-creator: name: Create zip artifacts needs: build runs-on: ubuntu-20.04 steps: - name: Set env run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF#refs/*/} # ============================== # Create ZIP files # ============================== - name: Download Windows artifacts uses: actions/download-artifact@v2 with: name: windows-artifacts path: windows-artifacts - name: Download Linux artifacts uses: actions/download-artifact@v2 with: name: linux-artifacts path: linux-artifacts - name: Download MacOS artifacts uses: actions/download-artifact@v2 with: name: macos-artifacts path: macos-artifacts - name: Display structure of downloaded files run: ls - name: Create zip Linux id: create_zip_linux run: | cd linux-artifacts/ zip -rT openethereum-linux-${{ env.RELEASE_VERSION }}.zip * ls openethereum-linux-${{ env.RELEASE_VERSION }}.zip cd .. mv linux-artifacts/openethereum-linux-${{ env.RELEASE_VERSION }}.zip . echo "Setting outputs..." echo ::set-output name=LINUX_ARTIFACT::openethereum-linux-${{ env.RELEASE_VERSION }}.zip echo ::set-output name=LINUX_SHASUM::$(shasum -a 256 openethereum-linux-${{ env.RELEASE_VERSION }}.zip | awk '{print $1}') - name: Create zip MacOS id: create_zip_macos run: | cd macos-artifacts/ zip -rT openethereum-macos-${{ env.RELEASE_VERSION }}.zip * ls openethereum-macos-${{ env.RELEASE_VERSION }}.zip cd .. mv macos-artifacts/openethereum-macos-${{ env.RELEASE_VERSION }}.zip . echo "Setting outputs..." echo ::set-output name=MACOS_ARTIFACT::openethereum-macos-${{ env.RELEASE_VERSION }}.zip echo ::set-output name=MACOS_SHASUM::$(shasum -a 256 openethereum-macos-${{ env.RELEASE_VERSION }}.zip | awk '{print $1}') - name: Create zip Windows id: create_zip_windows run: | cd windows-artifacts/ zip -rT openethereum-windows-${{ env.RELEASE_VERSION }}.zip * ls openethereum-windows-${{ env.RELEASE_VERSION }}.zip cd .. mv windows-artifacts/openethereum-windows-${{ env.RELEASE_VERSION }}.zip . echo "Setting outputs..." echo ::set-output name=WINDOWS_ARTIFACT::openethereum-windows-${{ env.RELEASE_VERSION }}.zip echo ::set-output name=WINDOWS_SHASUM::$(shasum -a 256 openethereum-windows-${{ env.RELEASE_VERSION }}.zip | awk '{print $1}') # ======================================================================= # Upload artifacts # This is required to share artifacts between different jobs # ======================================================================= - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: openethereum-linux-${{ env.RELEASE_VERSION }}.zip path: openethereum-linux-${{ env.RELEASE_VERSION }}.zip - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: openethereum-macos-${{ env.RELEASE_VERSION }}.zip path: openethereum-macos-${{ env.RELEASE_VERSION }}.zip - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: openethereum-windows-${{ env.RELEASE_VERSION }}.zip path: openethereum-windows-${{ env.RELEASE_VERSION }}.zip # ======================================================================= # Upload artifacts to S3 # This is required by some software distribution systems which require # artifacts to be downloadable, like Brew on MacOS. # ======================================================================= - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ env.AWS_REGION }} - name: Copy files to S3 with the AWS CLI run: | # Deploy zip artifacts to S3 bucket to a directory whose name is the tagged release version. # Deploy macos binary artifact (if required, add more `aws s3 cp` commands to deploy specific OS versions) aws s3 cp macos-artifacts/openethereum s3://${{ env.AWS_S3_ARTIFACTS_BUCKET }}/${{ env.RELEASE_VERSION }}/macos/ --region ${{ env.AWS_REGION }} outputs: linux-artifact: ${{ steps.create_zip_linux.outputs.LINUX_ARTIFACT }} linux-shasum: ${{ steps.create_zip_linux.outputs.LINUX_SHASUM }} macos-artifact: ${{ steps.create_zip_macos.outputs.MACOS_ARTIFACT }} macos-shasum: ${{ steps.create_zip_macos.outputs.MACOS_SHASUM }} windows-artifact: ${{ steps.create_zip_windows.outputs.WINDOWS_ARTIFACT }} windows-shasum: ${{ steps.create_zip_windows.outputs.WINDOWS_SHASUM }} draft-release: name: Draft Release needs: zip-artifacts-creator runs-on: ubuntu-20.04 steps: - name: Set env run: echo ::set-env name=RELEASE_VERSION::${GITHUB_REF#refs/*/} # ============================== # Download artifacts # ============================== - name: Download artifacts uses: actions/download-artifact@v2 with: name: openethereum-linux-${{ env.RELEASE_VERSION }}.zip - name: Download artifacts uses: actions/download-artifact@v2 with: name: openethereum-macos-${{ env.RELEASE_VERSION }}.zip - name: Download artifacts uses: actions/download-artifact@v2 with: name: openethereum-windows-${{ env.RELEASE_VERSION }}.zip - name: Display structure of downloaded files run: ls # ============================== # Create release draft # ============================== - name: Create Release Draft id: create_release_draft uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: tag_name: ${{ github.ref }} release_name: OpenEthereum ${{ github.ref }} body: | This release contains | System | Architecture | Binary | Sha256 Checksum | |:---:|:---:|:---:|:---| | Apple Icon by Pixel Perfect from https://www.flaticon.com/authors/pixel-perfect | x64 | [${{ needs.zip-artifacts-creator.outputs.macos-artifact }}](https://github.com/openethereum/openethereum/releases/download/${{ env.RELEASE_VERSION }}/${{ needs.zip-artifacts-creator.outputs.macos-artifact }}) | `${{ needs.zip-artifacts-creator.outputs.macos-shasum }}` | | Linux Icon by Pixel Perfect from https://www.flaticon.com/authors/pixel-perfect | x64 | [${{ needs.zip-artifacts-creator.outputs.linux-artifact }}](https://github.com/openethereum/openethereum/releases/download/${{ env.RELEASE_VERSION }}/${{ needs.zip-artifacts-creator.outputs.linux-artifact }}) | `${{ needs.zip-artifacts-creator.outputs.linux-shasum }}` | | Windows Icon by Pixel Perfect from https://www.flaticon.com/authors/pixel-perfect | x64 | [${{ needs.zip-artifacts-creator.outputs.windows-artifact }}](https://github.com/openethereum/openethereum/releases/download/${{ env.RELEASE_VERSION }}/${{ needs.zip-artifacts-creator.outputs.windows-artifact }}) | `${{ needs.zip-artifacts-creator.outputs.windows-shasum }}` | | | | | | | **System** | **Option** | - | **Resource** | | Settings Icon by Pixel Perfect from https://www.flaticon.com/authors/pixel-perfect | Docker | - | [hub.docker.com/r/openethereum/openethereum](https://hub.docker.com/r/openethereum/openethereum) | draft: true prerelease: true - name: Upload Release Asset - Linux id: upload_release_asset_linux uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_draft.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./openethereum-linux-${{ env.RELEASE_VERSION }}.zip asset_name: openethereum-linux-${{ env.RELEASE_VERSION }}.zip asset_content_type: application/zip - name: Upload Release Asset - MacOS id: upload_release_asset_macos uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_draft.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./openethereum-macos-${{ env.RELEASE_VERSION }}.zip asset_name: openethereum-macos-${{ env.RELEASE_VERSION }}.zip asset_content_type: application/zip - name: Upload Release Asset - Windows id: upload_release_asset_windows uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release_draft.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps asset_path: ./openethereum-windows-${{ env.RELEASE_VERSION }}.zip asset_name: openethereum-windows-${{ env.RELEASE_VERSION }}.zip asset_content_type: application/zip