diff --git a/.github/api/createCommitOnBranch.gql b/.github/api/createCommitOnBranch.gql new file mode 100644 index 000000000..42dac31fb --- /dev/null +++ b/.github/api/createCommitOnBranch.gql @@ -0,0 +1,26 @@ +mutation ( + $githubRepository: String!, + $branchName: String!, + $expectedHeadOid: GitObjectID! + $commitMessage: String! + $files: [FileAddition!]! +) { + createCommitOnBranch( + input: { + branch: + { + repositoryNameWithOwner: $githubRepository, + branchName: $branchName + }, + message: {headline: $commitMessage}, + fileChanges: { + additions: $files + } + expectedHeadOid: $expectedHeadOid + } + ){ + commit { + url + } + } +} \ No newline at end of file diff --git a/.github/scripts/package_version_up.sh b/.github/scripts/package_version_up.sh new file mode 100755 index 000000000..edc544a7b --- /dev/null +++ b/.github/scripts/package_version_up.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +# define the version number we want to set +newVersion=$1 + +# Find all Cargo.toml files in the current directory and its subdirectories +for file in $(find . -name "Cargo.toml") +do + # Use awk to change the version number of the package + awk -v newVersion="$newVersion" -F'=' '/\[package\]/,/version =/ { if($0 ~ /version =/ && $0 !~ /#/) {print $1 "= ""\""newVersion"\""; next} }1' $file > temp && mv temp $file +done \ No newline at end of file diff --git a/.github/scripts/runtime_version_up.sh b/.github/scripts/runtime_version_up.sh new file mode 100755 index 000000000..a0735b5d5 --- /dev/null +++ b/.github/scripts/runtime_version_up.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +runtime=$1 +versionName=$2 + +if [ $runtime == "amplitude" ]; then + file="runtime/amplitude/src/lib.rs" +elif [ $runtime == "pendulum" ]; then + file="runtime/pendulum/src/lib.rs" +fi + +echo "increment: $versionName" +# Use awk to increment the version of the lib +awk -v pat="$versionName" -F':' '$0~pat { {print $1": " $2+1","; next} }1' $file > temp && mv temp $file + + + diff --git a/.github/workflows/release-node.yml b/.github/workflows/release-node.yml new file mode 100644 index 000000000..a62eb4ac4 --- /dev/null +++ b/.github/workflows/release-node.yml @@ -0,0 +1,39 @@ +# This action triggers a GitLab CI job that generates the release notes +name: Node Release + +on: + pull_request: + types: + - closed + branches: + - 'main' + +jobs: + release_check: +# This job will only run if: +# * the pull request is closed and merged to main branch; +# * the pull request has the label "release-node" + if: ${{ github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release-node') }} + name: Need new release + strategy: + fail-fast: true + runs-on: ubuntu-latest + + steps: + - name: Check out repository code + uses: actions/checkout@v4 + + - name: Get Node Version + id: get-version + run: | + vers=$( cargo metadata --format-version=1 --no-deps | jq '.packages[] | select(.name == "pendulum-node") | .version' | tr -d '"' ) + echo "version=${vers}" >> "$GITHUB_OUTPUT" + + - name: trigger gitlab + run: | + ls ${{ github.workspace }} + curl -X POST -F token=${{ secrets.GITLAB_TRIGGER }} -F "ref=development" -F "variables[PREPCOMPILE]=Y" \ + -F "variables[COMPILE]=Y" -F "variables[COMPILEMOONBEAM]=N" -F "variables[DOCKER]=Y" \ + -F "variables[DOCKERAMP]=Y" -F "variables[DEBIAN]=Y" -F "variables[TEMPUPLOAD]=Y" \ + -F "variables[DOWNUPLOAD]=Y" -F "variables[PRODUPLOAD]=Y" -F "variables[VERSION]=${{ steps.get-version.outputs.version }}" \ + https://gitlab.com/api/v4/projects/${{ secrets.PROJECT_ID }}/trigger/pipeline diff --git a/.github/workflows/version-up.yml b/.github/workflows/version-up.yml new file mode 100644 index 000000000..41a956471 --- /dev/null +++ b/.github/workflows/version-up.yml @@ -0,0 +1,174 @@ +name: Version Up + +on: + workflow_dispatch: + inputs: + versioning: + type: choice + description: "choose versioning:" + options: + - major + - minor + - patch + - release + - rc + - beta + - alpha + specific_version: + type: string + description: "Specific version to bump to. If specified, the versioning input will be ignored" + packages-all: + description: "Check if ALL packages will be updated. Else, only pendulum-node" + required: false + type: boolean + default: true + +jobs: + bump-version: + runs-on: ubuntu-latest + name: bump version + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup User + run: | + git config user.name github-actions + git config user.email github-actions@github.com + + # Install cargo-edit if specific version is NOT provided + - name: install cargo-edit + if: github.event.inputs.specific_version == '' + run: | + cargo install cargo-edit + + - name: Check For Specific Version + if: github.event.inputs.specific_version != '' + run: | + bash .github/scripts/package_version_up ${{ github.event.inputs.specific_version }} + if ${{ github.event.inputs.packages-all }} == 'true'; then + echo "Upgrading crates to ${{ github.event.inputs.specific_version }}" &> changes.txt + else + echo "Upgrading node to ${{ github.event.inputs.specific_version }}" &> changes.txt + fi + + - name: ${{ github.event.inputs.versioning }} Version Up for all + if: github.event.inputs.specific_version == '' && github.event.inputs.packages-all == 'true' + continue-on-error: false + run: | + cargo set-version --bump ${{ github.event.inputs.versioning }} &> changes.txt + cat changes.txt + + - name: ${{ github.event.inputs.versioning }} Version Up for node + if: github.event.inputs.specific_version == '' && github.event.inputs.packages-all == 'false' + continue-on-error: false + run: | + cargo set-version --bump ${{ github.event.inputs.versioning }} --package pendulum-node &> changes.txt + cat changes.txt + + - name: "Read file contents" + id: read-file + uses: juliangruber/read-file-action@v1 + with: + path: ./changes.txt + + - name: Set Chosen Package + id: set-pkg + run: | + if [ ${{ github.event.inputs.packages-all }} == 'true' ]; then + echo "name=all" >> "$GITHUB_OUTPUT" + else + echo "name=node" >> "$GITHUB_OUTPUT" + fi + + - name: Put current date into a variable + id: date-now + uses: Kaven-Universe/github-action-current-date-time@v1 + with: + format: "yyyy-MM-dd" + + - name: Create Release Branch + id: new-branch + run: | + name=${{ steps.set-pkg.outputs.name }} + now="${{ steps.date-now.outputs.day }}-${{ steps.date-now.outputs.month }}-${{ steps.date-now.outputs.year }}" + + if [ '${{ github.event.inputs.specific_version }}' != '' ]; then + echo "specific version: ${{ github.event.inputs.specific_version }}" + branch_name="release/version-up-to-${{ github.event.inputs.specific_version }}-$name-$now" + else + vers=${{ github.event.inputs.versioning }} + echo "versioning: ${{ github.event.inputs.versioning }}" + branch_name="release/$vers-version-up-$name-$now" + fi + + echo "name=${branch_name}" >> "$GITHUB_OUTPUT" + + git checkout -b ${branch_name} + git push --set-upstream origin ${branch_name} + + # todo: make this simpler. + - name: Commit New Changes to New Branch (all) + if: github.event.inputs.packages-all == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: ${{ steps.new-branch.outputs.name }} + run: | + gh api graphql \ + -F githubRepository=${{ github.repository }} \ + -F branchName=${{ env.BRANCH }} \ + -F expectedHeadOid=$(git rev-parse HEAD) \ + -F commitMessage="$(cat changes.txt)" \ + -F files[][path]="chain-extensions/common/Cargo.toml" -F files[][contents]=$(base64 -w0 chain-extensions/common/Cargo.toml) \ + -F files[][path]="chain-extensions/price/Cargo.toml" -F files[][contents]=$(base64 -w0 chain-extensions/price/Cargo.toml) \ + -F files[][path]="chain-extensions/token/Cargo.toml" -F files[][contents]=$(base64 -w0 chain-extensions/token/Cargo.toml) \ + -F files[][path]="node/Cargo.toml" -F files[][contents]=$(base64 -w0 node/Cargo.toml) \ + -F files[][path]="pallets/orml-currencies-allowance-extension/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/orml-currencies-allowance-extension/Cargo.toml) \ + -F files[][path]="pallets/orml-tokens-management-extension/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/orml-tokens-management-extension/Cargo.toml) \ + -F files[][path]="pallets/parachain-staking/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/parachain-staking/Cargo.toml) \ + -F files[][path]="pallets/parachain-staking/rpc/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/parachain-staking/rpc/Cargo.toml) \ + -F files[][path]="pallets/parachain-staking/rpc/runtime-api/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/parachain-staking/rpc/runtime-api/Cargo.toml) \ + -F files[][path]="pallets/treasury-buyout-extension/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/treasury-buyout-extension/Cargo.toml) \ + -F files[][path]="pallets/vesting-manager/Cargo.toml" -F files[][contents]=$(base64 -w0 pallets/vesting-manager/Cargo.toml) \ + -F files[][path]="runtime/amplitude/Cargo.toml" -F files[][contents]=$(base64 -w0 runtime/amplitude/Cargo.toml) \ + -F files[][path]="runtime/common/Cargo.toml" -F files[][contents]=$(base64 -w0 runtime/common/Cargo.toml) \ + -F files[][path]="runtime/foucoco/Cargo.toml" -F files[][contents]=$(base64 -w0 runtime/foucoco/Cargo.toml) \ + -F files[][path]="runtime/integration-tests/Cargo.toml" -F files[][contents]=$(base64 -w0 runtime/integration-tests/Cargo.toml) \ + -F files[][path]="runtime/pendulum/Cargo.toml" -F files[][contents]=$(base64 -w0 runtime/pendulum/Cargo.toml) \ + -F 'query=@.github/api/createCommitOnBranch.gql' + + - name: Commit New Changes to New Branch (node) + if: github.event.inputs.packages-all == 'false' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: ${{ steps.new-branch.outputs.name }} + run: | + gh api graphql \ + -F githubRepository=${{ github.repository }} \ + -F branchName=${{ env.BRANCH }} \ + -F expectedHeadOid=$(git rev-parse HEAD) \ + -F commitMessage="$(cat changes.txt)" \ + -F files[][path]="node/Cargo.toml" -F files[][contents]=$(base64 -w0 node/Cargo.toml) \ + -F 'query=@.github/api/createCommitOnBranch.gql' + + - name: Prepare Pull Request title + id: pr-title + run: | + if ${{ github.event.inputs.specific_version }} == ''; then + echo "title=release: ${{ github.event.inputs.versioning }} version up ${{ steps.set-pkg.outputs.name }}" >> "$GITHUB_OUTPUT" + else + echo "title=release: Force version up ${{ steps.set-pkg.outputs.name }}" >> "$GITHUB_OUTPUT" + fi + + - name: Create Pull Request + uses: thomaseizinger/create-pull-request@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + title: ${{ steps.pr-title.outputs.title }} + body: ${{ steps.read-file.outputs.content }} + head: ${{ steps.new-branch.outputs.name }} + base: main + reviewers: "pendulum-chain/devs" + labels: release-node \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index dc0ab9f75..e72ef1471 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ panic = "unwind" inherits = "release" [workspace] +resolver = "2" members = [ "node", "pallets/parachain-staking", diff --git a/script/get_commit.sh b/script/get_commit.sh new file mode 100644 index 000000000..862c07366 --- /dev/null +++ b/script/get_commit.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -e + +versionNumber=$1 + +tagNamePrefix="node-release" +## get the latest tag of this node +lastVersionName=$(git describe --abbrev=0 --tags --always `git rev-list --tags` | grep -i "$tagNamePrefix" -m 1) + +## get the commits since the last tag +latestCommitOfLastVersion=$(git log $lastVersionName --oneline --max-count=1 | cut -c1-7) + + +logs=( $(git log $latestCommitOfLastVersion..origin/main --oneline -- node/ | cut -c1-7) ) + if (( ${#logs[@]} == 0 )); then + echo "Error: Repo is up to date. No new release required". + exit 1 + fi + +echo -e "## What's Changed\n" >> Commits.txt +## output the relevant commits, and save to file +echo "relevant commits:" +for commit in "${logs[@]}"; do + link="$(git log --format="[%h](https://github.com/pendulum-chain/pendulum/commit/%h) %s" -n 1 $commit)" + echo $link + echo -e "* "$link"\n" >> Commits.txt +done + +$newVersionName +echo "new version: "$tagNamePrefix"-"$versionNumber