forked from paradigmxyz/reth
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: release workflow (paradigmxyz#2677)
- Loading branch information
Showing
15 changed files
with
460 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,4 +2,5 @@ | |
/book | ||
/assets | ||
/.github | ||
Dockerfile | ||
/data | ||
*.tar.gz |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,244 @@ | ||
# This workflow is borrowed from Lighthouse: https://github.com/sigp/lighthouse/blob/693886b94176faa4cb450f024696cb69cda2fe58/.github/workflows/release.yml | ||
|
||
name: release | ||
|
||
on: | ||
push: | ||
tags: | ||
- v* | ||
|
||
env: | ||
REPO_NAME: ${{ github.repository_owner }}/reth | ||
IMAGE_NAME: ${{ github.repository_owner }}/reth | ||
|
||
jobs: | ||
extract-version: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Extract version | ||
run: echo "VERSION=$(echo ${GITHUB_REF#refs/tags/})" >> $GITHUB_OUTPUT | ||
id: extract_version | ||
outputs: | ||
VERSION: ${{ steps.extract_version.outputs.VERSION }} | ||
build: | ||
name: build release | ||
strategy: | ||
matrix: | ||
arch: [aarch64-unknown-linux-gnu, | ||
x86_64-unknown-linux-gnu, | ||
x86_64-apple-darwin, | ||
x86_64-windows] | ||
include: | ||
- arch: aarch64-unknown-linux-gnu | ||
platform: ubuntu-latest | ||
profile: maxperf | ||
- arch: x86_64-unknown-linux-gnu | ||
platform: ubuntu-latest | ||
profile: maxperf | ||
- arch: x86_64-apple-darwin | ||
platform: macos-latest | ||
profile: maxperf | ||
- arch: x86_64-windows | ||
platform: windows-2019 | ||
profile: maxperf | ||
|
||
runs-on: ${{ matrix.platform }} | ||
needs: extract-version | ||
steps: | ||
- name: Checkout sources | ||
uses: actions/checkout@v3 | ||
- name: Get latest version of stable Rust | ||
run: rustup update stable | ||
|
||
# ============================== | ||
# Windows dependencies | ||
# ============================== | ||
|
||
- uses: KyleMayes/install-llvm-action@v1 | ||
if: startsWith(matrix.arch, 'x86_64-windows') | ||
with: | ||
version: "13.0" | ||
directory: ${{ runner.temp }}/llvm | ||
- name: Set LIBCLANG_PATH | ||
if: startsWith(matrix.arch, 'x86_64-windows') | ||
run: echo "LIBCLANG_PATH=$((gcm clang).source -replace "clang.exe")" >> $env:GITHUB_ENV | ||
|
||
# ============================== | ||
# Builds | ||
# ============================== | ||
|
||
- name: Build reth for aarch64-unknown-linux-gnu | ||
if: matrix.arch == 'aarch64-unknown-linux-gnu' | ||
run: | | ||
cargo install cross | ||
env CROSS_PROFILE=${{ matrix.profile }} make build-aarch64 | ||
- name: Build reth for x86_64-unknown-linux-gnu | ||
if: matrix.arch == 'x86_64-unknown-linux-gnu' | ||
run: | | ||
cargo install cross | ||
env CROSS_PROFILE=${{ matrix.profile }} make build-x86_64 | ||
- name: Move cross-compiled binary | ||
if: startsWith(matrix.arch, 'aarch64') | ||
run: mv target/aarch64-unknown-linux-gnu/${{ matrix.profile }}/reth ~/.cargo/bin/reth | ||
|
||
- name: Move cross-compiled binary | ||
if: startsWith(matrix.arch, 'x86_64-unknown-linux-gnu') | ||
run: mv target/x86_64-unknown-linux-gnu/${{ matrix.profile }}/reth ~/.cargo/bin/reth | ||
|
||
- name: Build reth for x86_64-apple-darwin modern | ||
if: matrix.arch == 'x86_64-apple-darwin' | ||
run: cargo install --path reth --force --locked --profile ${{ matrix.profile }} | ||
|
||
- name: Build reth for Windows modern | ||
if: matrix.arch == 'x86_64-windows' | ||
# NOTE: profile set to release (see above) | ||
run: cargo install --path reth --force --locked --profile release | ||
|
||
- name: Configure GPG and create artifacts | ||
if: startsWith(matrix.arch, 'x86_64-windows') != true | ||
env: | ||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | ||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | ||
run: | | ||
export GPG_TTY=$(tty) | ||
echo -n "$GPG_SIGNING_KEY" | base64 --decode | gpg --import | ||
mkdir artifacts | ||
mv ~/.cargo/bin/reth ./artifacts | ||
cd artifacts | ||
tar -czf reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz reth | ||
echo "$GPG_PASSPHRASE" | gpg --passphrase-fd 0 --pinentry-mode loopback --batch -ab reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
mv *tar.gz* .. | ||
- name: Configure GPG and create artifacts Windows | ||
if: startsWith(matrix.arch, 'x86_64-windows') | ||
env: | ||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | ||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} | ||
run: | | ||
echo $env:GPG_SIGNING_KEY | base64 --decode | gpg --batch --import | ||
mkdir artifacts | ||
move $env:USERPROFILE/.cargo/bin/reth.exe ./artifacts | ||
cd artifacts | ||
tar -czf reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz reth.exe | ||
gpg --passphrase "$env:GPG_PASSPHRASE" --batch --pinentry-mode loopback -ab reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
move *tar.gz* .. | ||
# ======================================================================= | ||
# Upload artifacts | ||
# This is required to share artifacts between different jobs | ||
# ======================================================================= | ||
- name: Upload artifact | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
path: reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz | ||
|
||
- name: Upload signature | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz.asc | ||
path: reth-${{ needs.extract-version.outputs.VERSION }}-${{ matrix.arch }}.tar.gz.asc | ||
|
||
draft-release: | ||
name: Draft Release | ||
needs: [build, extract-version] | ||
runs-on: ubuntu-latest | ||
env: | ||
VERSION: ${{ needs.extract-version.outputs.VERSION }} | ||
steps: | ||
# This is necessary for generating the changelog. It has to come before "Download Artifacts" or else it deletes the artifacts. | ||
- name: Checkout sources | ||
uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 0 | ||
|
||
# ============================== | ||
# Download artifacts | ||
# ============================== | ||
- name: Download artifacts | ||
uses: actions/download-artifact@v3 | ||
|
||
# ============================== | ||
# Create release draft | ||
# ============================== | ||
- name: Generate Full Changelog | ||
id: changelog | ||
run: | | ||
echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT | ||
echo "$(git log --pretty=format:"- %s" $(git describe --tags --abbrev=0 ${{ env.VERSION }}^)..${{ env.VERSION }})" >> $GITHUB_OUTPUT | ||
echo "EOF" >> $GITHUB_OUTPUT | ||
- name: Create Release Draft | ||
env: | ||
GITHUB_USER: ${{ github.repository_owner }} | ||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
|
||
# The formatting here is borrowed from Lighthouse (which is borrowed from OpenEthereum): https://github.com/openethereum/openethereum/blob/main/.github/workflows/build.yml | ||
run: | | ||
body=$(cat <<- "ENDBODY" | ||
<Release Name> | ||
## Testing Checklist (DELETE ME) | ||
- [ ] Run on testnet for 1-3 days. | ||
- [ ] Resync a mainnet node. | ||
- [ ] Ensure all CI checks pass. | ||
## Release Checklist (DELETE ME) | ||
- [ ] Ensure all crates have had their versions bumped. | ||
- [ ] Write the summary. | ||
- [ ] Fill out the update priority. | ||
- [ ] Ensure all binaries have been added. | ||
- [ ] Prepare release posts (Twitter, ...). | ||
## Summary | ||
Add a summary, including: | ||
- Critical bug fixes | ||
- New features | ||
- Any breaking changes (and what to expect) | ||
## Update Priority | ||
This table provides priorities for which classes of users should update particular components. | ||
| User Class | Priority | | ||
|----------------------|-----------------| | ||
| Payload Builders | <TODO> | | ||
| Non-Payload Builders | <TODO> | | ||
|
||
*See [Update | ||
Priorities](https://paradigmxyz.github.io/reth/installation-priorities.html) | ||
more information about this table.* | ||
|
||
## All Changes | ||
|
||
${{ steps.changelog.outputs.CHANGELOG }} | ||
|
||
## Binaries | ||
|
||
[See pre-built binaries documentation.](https://https://paradigmxyz.github.io/reth/installation/binaries.html) | ||
|
||
The binaries are signed with the PGP key: `A3AE 097C 8909 3A12 4049 DF1F 5391 A3C4 1005 30B4` | ||
|
||
| System | Architecture | Binary | PGP Signature | | ||
|:---:|:---:|:---:|:---| | ||
| <img src="https://simpleicons.org/icons/apple.svg" style="width: 32px;"/> | x86_64 | [reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-apple-darwin.tar.gz.asc) | | ||
| <img src="https://simpleicons.org/icons/linux.svg" style="width: 32px;"/> | x86_64 | [reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-unknown-linux-gnu.tar.gz.asc) | | ||
| <img src="https://simpleicons.org/icons/raspberrypi.svg" style="width: 32px;"/> | aarch64 | [reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-aarch64-unknown-linux-gnu.tar.gz.asc) | | ||
| <img src="https://simpleicons.org/icons/windows.svg" style="width: 32px;"/> | x86_64 | [reth-${{ env.VERSION }}-x86_64-windows.tar.gz](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-windows.tar.gz) | [PGP Signature](https://github.com/${{ env.REPO_NAME }}/releases/download/${{ env.VERSION }}/reth-${{ env.VERSION }}-x86_64-windows.tar.gz.asc) | | ||
| | | | | | ||
| **System** | **Option** | - | **Resource** | | ||
| <img src="https://simpleicons.org/icons/docker.svg" style="width: 32px;"/> | Docker | [${{ env.VERSION }}](https://hub.docker.com/r/${{ env.IMAGE_NAME }}/tags?page=1&ordering=last_updated&name=${{ env.VERSION }}) | [${{ env.IMAGE_NAME }}](https://hub.docker.com/r/${{ env.IMAGE_NAME }}) | | ||
ENDBODY | ||
) | ||
assets=() | ||
for asset in ./reth-*.tar.gz*; do | ||
assets+=("-a" "$asset/$asset") | ||
done | ||
tag_name="${{ env.VERSION }}" | ||
echo "$body" | hub release create --draft "${assets[@]}" -F "-" "$tag_name" |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
[build] | ||
pre-build = [ | ||
# rust-bindgen dependencies: llvm-dev libclang-dev (>= 5.0) clang (>= 5.0) | ||
"apt-get update && apt-get install --assume-yes --no-install-recommends llvm-dev libclang-6.0-dev clang-6.0" | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
# Heavily inspired by Lighthouse: https://github.com/sigp/lighthouse/blob/693886b94176faa4cb450f024696cb69cda2fe58/Makefile | ||
|
||
GIT_TAG := $(shell git describe --tags --candidates 1) | ||
BIN_DIR = "bin" | ||
|
||
X86_64_TAG = "x86_64-unknown-linux-gnu" | ||
BUILD_PATH_X86_64 = "target/$(X86_64_TAG)/release" | ||
AARCH64_TAG = "aarch64-unknown-linux-gnu" | ||
BUILD_PATH_AARCH64 = "target/$(AARCH64_TAG)/release" | ||
|
||
# List of features to use when building natively. Can be overriden via the environment. | ||
# No jemalloc on Windows | ||
ifeq ($(OS),Windows_NT) | ||
FEATURES?= | ||
else | ||
FEATURES?=jemalloc | ||
endif | ||
|
||
# List of features to use when cross-compiling. Can be overridden via the environment. | ||
CROSS_FEATURES ?= jemalloc | ||
|
||
# Cargo profile for Cross builds. Default is for local builds, CI uses an override. | ||
CROSS_PROFILE ?= release | ||
|
||
# Cargo profile for regular builds. | ||
PROFILE ?= release | ||
|
||
# Extra flags for Cargo | ||
CARGO_INSTALL_EXTRA_FLAGS ?= | ||
|
||
# Builds the reth binary in release (optimized). | ||
# | ||
# Binaries will most likely be found in `./target/release` | ||
install: | ||
cargo install --path reth --force --locked \ | ||
--features "$(FEATURES)" \ | ||
--profile "$(PROFILE)" \ | ||
$(CARGO_INSTALL_EXTRA_FLAGS) | ||
|
||
# The following commands use `cross` to build a cross-compile. | ||
# | ||
# These commands require that: | ||
# | ||
# - `cross` is installed (`cargo install cross`). | ||
# - Docker is running. | ||
# - The current user is in the `docker` group. | ||
# | ||
# The resulting binaries will be created in the `target/` directory. | ||
# | ||
# Note: The additional rustc compiler flags are for intrinsics needed by MDBX. | ||
# See: https://github.com/cross-rs/cross/wiki/FAQ#undefined-reference-with-build-std | ||
build-x86_64 build-aarch64: export RUSTFLAGS=-C link-arg=-lgcc -Clink-arg=-static-libgcc | ||
|
||
build-x86_64: | ||
cross build --bin reth --target x86_64-unknown-linux-gnu --features "$(CROSS_FEATURES)" --profile "$(CROSS_PROFILE)" | ||
build-aarch64: | ||
cross build --bin reth --target aarch64-unknown-linux-gnu --features "$(CROSS_FEATURES)" --profile "$(CROSS_PROFILE)" | ||
|
||
# Create a `.tar.gz` containing a binary for a specific target. | ||
define tarball_release_binary | ||
cp $(1)/reth $(BIN_DIR)/reth | ||
cd $(BIN_DIR) && \ | ||
tar -czf reth-$(GIT_TAG)-$(2)$(3).tar.gz reth && \ | ||
rm reth | ||
endef | ||
|
||
# Create a series of `.tar.gz` files in the BIN_DIR directory, each containing | ||
# a `reth` binary for a different target. | ||
# | ||
# The current git tag will be used as the version in the output file names. You | ||
# will likely need to use `git tag` and create a semver tag (e.g., `v0.2.3`). | ||
build-release-tarballs: | ||
[ -d $(BIN_DIR) ] || mkdir -p $(BIN_DIR) | ||
$(MAKE) build-x86_64 | ||
$(call tarball_release_binary,$(BUILD_PATH_X86_64),$(X86_64_TAG),"") | ||
$(MAKE) build-aarch64 | ||
$(call tarball_release_binary,$(BUILD_PATH_AARCH64),$(AARCH64_TAG),"") | ||
|
||
# Performs a `cargo` clean | ||
clean: | ||
cargo clean |
Oops, something went wrong.