Skip to content
Snippets Groups Projects
Commit 0f671ac6 authored by Cédric Moreau's avatar Cédric Moreau Committed by Hugo Trentesaux
Browse files

Resolve "Create a release from master" (!297)

* fix: review

* #139: fix: re-enable Docker ARM build

* #239: feat: release du runtime from `runtime/*` branches

* #239: fix: clippy

* #269: fix: remove workaround from !239

* #239: feat: release du runtime from master

* #239: fix: create_client_release must not depend on runtime milestone

* #239: refact: rename `release_runtime` module to `gitlab`
parent fc1fe8f8
No related branches found
No related tags found
1 merge request!297Resolve "Create a release from master"
Pipeline #39377 passed
......@@ -26,6 +26,9 @@ workflow:
.is_network_branch: &is_network_branch
if: $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_BRANCH =~ /^(network\/).+/
.is_runtime_branch: &is_runtime_branch
if: $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_BRANCH =~ /^(runtime\/).+/
sanity_tests:
extends: .env
rules:
......@@ -181,15 +184,19 @@ tests:
- echo "NETWORK = $NETWORK"
- export RUNTIME=$(echo $NETWORK | grep -Po "gdev|gtest|g1")
- echo "RUNTIME = $RUNTIME"
# srtool specific
- export RUNTIME_DIR=runtime/$RUNTIME
- echo "RUNTIME_DIR = $RUNTIME_DIR"
# srtool specific
- export PACKAGE=$RUNTIME-runtime
- echo "PACKAGE = $PACKAGE"
# GitLab milestone : used for both GitLab and Docker releases. Milestone must match source code's runtime version to fetch the git changes for release notes.
- export CLIENT_VERSION=$(cat node/Cargo.toml | grep version | sed "s/version = \"//g" | sed "s/\"//")
- echo $CLIENT_VERSION
- export RUNTIME_VERSION=$(cat runtime/gdev/src/lib.rs | grep "spec_version:" | sed "s/ *spec_version. //g" | sed "s/,//g")
- export RUNTIME_VERSION=$(cat runtime/$RUNTIME/src/lib.rs | grep "spec_version:" | sed "s/ *spec_version. //g" | sed "s/,//g")
- echo $RUNTIME_VERSION
- export RUNTIME_MILESTONE="runtime-$RUNTIME_VERSION"
- echo $RUNTIME_MILESTONE
- export CLIENT_MILESTONE="client-$CLIENT_VERSION"
- echo $CLIENT_MILESTONE
- export NETWORK_RELEASE="$NETWORK"
- echo $NETWORK_RELEASE
- export DOCKER_TAG="$RUNTIME_VERSION-$CLIENT_VERSION"
......@@ -214,6 +221,36 @@ tests:
- export CLIENT_RELEASE_NAME=$RUNTIME-$RUNTIME_VERSION-$CLIENT_VERSION
- echo $CLIENT_RELEASE_NAME
.release_runtime_vars: &define_release_runtime_vars
- echo "RUNTIME = $RUNTIME"
- export RUNTIME_VERSION=$(cat runtime/$RUNTIME/src/lib.rs | grep "spec_version:" | sed "s/ *spec_version. //g" | sed "s/,//g")
- echo $RUNTIME_VERSION
- export RUNTIME_MILESTONE="runtime-$RUNTIME_VERSION"
- echo $RUNTIME_MILESTONE
- export SRTOOL_OUTPUT=$CI_PROJECT_DIR/release/srtool_output_$RUNTIME.json
- echo "SRTOOL_OUTPUT = $SRTOOL_OUTPUT"
- export RELEASE_FILE_WASM=release/${RUNTIME}_runtime.compact.compressed.wasm
- echo $RELEASE_FILE_WASM
# srtool specific
- export RUNTIME_DIR=runtime/$RUNTIME
- echo "RUNTIME_DIR = $RUNTIME_DIR"
# srtool specific
- export PACKAGE=$RUNTIME-runtime
- echo "PACKAGE = $PACKAGE"
trigger_runtime_release:
stage: build
rules:
- <<: *is_runtime_branch
when: manual
variables:
RUNTIME: gdev
script:
- *define_release_runtime_vars
- echo "Vérification de l'absence de la release $RUNTIME_MILESTONE"
- echo "Contrôle de l'URL https://git.duniter.org/api/v4/projects/$CI_PROJECT_ID/releases/$RUNTIME_MILESTONE"
- curl -s https://git.duniter.org/api/v4/projects/$CI_PROJECT_ID/releases/$RUNTIME_MILESTONE --fail 1>/dev/null && (echo "Release déjà présente" && exit 1) || echo "Release absente"
trigger_network_release:
stage: build
rules:
......@@ -221,7 +258,7 @@ trigger_network_release:
when: manual
script:
- *define_network_branch_vars
- echo "Vérification de la présence de la release $NETWORK"
- echo "Vérification de l'absence de la release $NETWORK"
- echo "Contrôle de l'URL https://git.duniter.org/api/v4/projects/$CI_PROJECT_ID/releases/$NETWORK"
- curl -s https://git.duniter.org/api/v4/projects/$CI_PROJECT_ID/releases/$NETWORK --fail 1>/dev/null && (echo "Release déjà présente" && exit 1) || echo "Release absente"
......@@ -248,7 +285,7 @@ docker_deploy:
script:
- *define_network_branch_vars
- podman manifest rm "$MANIFEST" 2>/dev/null || true
- podman build --layers --platform linux/amd64 --manifest "$MANIFEST" -f docker/Dockerfile --build-arg chain=$RUNTIME .
- podman build --layers --platform linux/amd64,linux/arm64 --manifest "$MANIFEST" -f docker/Dockerfile --build-arg chain=$RUNTIME .
- podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:$DOCKER_TAG"
- podman manifest push --all "$MANIFEST" "docker://docker.io/$IMAGE_NAME:latest"
after_script:
......@@ -260,23 +297,43 @@ docker_deploy:
############## SRTOOL ##############
# We always build the runtime on a network/ branch, either it is for:
# - creating a network release (i.e.: genesis)
# - creating a client release (i.e.: which also includes the runtime)
build_runtime:
# The Network Runtime is only built when creating a network release (i.e.: genesis)
build_network_runtime:
stage: build
needs: ["trigger_network_release"]
rules:
- <<: *is_network_branch
image: paritytech/srtool:1.77.0-0.15.0
variables:
SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/srtool_output.json
SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/network_srtool_output.json
script:
- *define_network_branch_vars
- export RUNTIME_DIR=runtime/$RUNTIME
- echo "RUNTIME_DIR = $RUNTIME_DIR"
- echo "SRTOOL_OUTPUT = $SRTOOL_OUTPUT"
- mkdir -p $CI_PROJECT_DIR/release
- echo -e "[toolchain]\nchannel = \"`curl -s https://raw.githubusercontent.com/paritytech/srtool/master/RUSTC_VERSION`\"\ncomponents = [ \"rust-std\", \"rust-src\" ]" > $RUNTIME_DIR/rust-toolchain.toml # Workaround see !239
# Copy sources to the expected directory of srtool
- cp -R * /build/
# Build the runtime
- /srtool/build --app --json -cM | tee -a $SRTOOL_OUTPUT
- mv /build/runtime/$RUNTIME/target/srtool/release/wbuild/$RUNTIME-runtime/${RUNTIME}_runtime.compact.compressed.wasm $CI_PROJECT_DIR/release/
artifacts:
expire_in: never
name: "runtime"
paths:
- $CI_PROJECT_DIR/release
tags:
- kepler
build_gdev_runtime:
stage: build
needs: ["trigger_runtime_release"]
rules:
- <<: *is_runtime_branch
image: paritytech/srtool:1.77.0-0.15.0
variables:
RUNTIME: gdev
script:
- *define_release_runtime_vars
- mkdir -p $CI_PROJECT_DIR/release
# Copy sources to the expected directory of srtool
- cp -R * /build/
# Build the runtime
......@@ -340,7 +397,7 @@ g1_data:
build_specs:
stage: build
needs: ["build_runtime", "g1_data"]
needs: ["build_network_runtime", "g1_data"]
rules:
- <<: *is_network_branch
extends: .env
......@@ -403,7 +460,7 @@ create_network_release:
image: rust:1-bullseye
variables:
# Used by `release-network` command
SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/srtool_output.json
SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/network_srtool_output.json
script:
- *define_network_branch_vars
# Release creation
......@@ -425,17 +482,15 @@ create_network_release:
create_client_release:
stage: release
needs: ["build_runtime", "build_raw_specs"]
needs: ["build_raw_specs"]
rules:
- <<: *is_network_branch
image: rust:1-bullseye
variables:
# Used by `release-runtime` command
SRTOOL_OUTPUT: $CI_PROJECT_DIR/release/srtool_output.json
script:
- *define_network_branch_vars
- cargo xtask release-runtime $CLIENT_RELEASE_NAME $NETWORK_RELEASE $CI_COMMIT_BRANCH $RUNTIME_MILESTONE
- cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}_runtime.compact.compressed.wasm https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_WASM
# Create the GitLab release page + tag and associate the milestone
- cargo xtask release-client $CLIENT_RELEASE_NAME $CI_COMMIT_BRANCH $CLIENT_MILESTONE
# Add the client assets
- cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}_client-specs.yaml https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_CLIENT_SPEC
- cargo xtask create-asset-link $CLIENT_RELEASE_NAME ${RUNTIME}-raw.json https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_RAW_SPEC
artifacts:
......@@ -444,3 +499,25 @@ create_client_release:
- $CI_PROJECT_DIR/release/
tags:
- kepler
create_runtime_release:
stage: release
needs: ["build_gdev_runtime"]
rules:
- <<: *is_runtime_branch
image: rust:1-bullseye
variables:
RUNTIME: gdev
script:
- *define_release_runtime_vars
# Create the GitLab release page + tag and associate the milestone.
# Note: the release name = the release tag = runtime milesone ($RUNTIME_MILESTONE)
- cargo xtask release-runtime $RUNTIME_MILESTONE $RUNTIME $CI_COMMIT_BRANCH $RUNTIME_MILESTONE
- cargo xtask create-asset-link $RUNTIME_MILESTONE ${RUNTIME}_runtime.compact.compressed.wasm https://nodes.pages.duniter.org/-/rust/duniter-v2s/-/jobs/$CI_JOB_ID/artifacts/$RELEASE_FILE_WASM
# In the future: also build gtest and g1 runtimes and atach them
artifacts:
expire_in: never
paths:
- $CI_PROJECT_DIR/release/
tags:
- kepler
......@@ -91,14 +91,37 @@ pub(super) async fn release_runtime(
branch: String,
milestone: String,
) -> Result<()> {
let mut release_notes = String::from(
release(
"Runtime".to_string(),
name,
Some(network),
branch,
milestone,
)
.await
}
pub(super) async fn release_client(name: String, branch: String, milestone: String) -> Result<()> {
release("Client".to_string(), name, None, branch, milestone).await
}
async fn release(
title: String,
name: String,
network: Option<String>,
branch: String,
milestone: String,
) -> Result<()> {
let mut release_notes = format!(
"
# Runtime
# {title}
",
"
);
add_srtool_notes(network, &mut release_notes)?;
if let Some(network) = network {
add_srtool_notes(network.clone(), &mut release_notes)?;
}
// Get changes (list of MRs) from gitlab API
let changes = get_changes::get_changes(milestone.clone()).await?;
......
......@@ -17,7 +17,7 @@
#![feature(let_chains)]
mod gen_doc;
mod release_runtime;
mod gitlab;
use anyhow::{Context, Result};
use clap::Parser;
......@@ -57,9 +57,22 @@ enum DuniterXTaskCommand {
ReleaseNetwork { network: String, branch: String },
/// Release a new runtime
ReleaseRuntime {
/// Name of the release + tag to be applied
name: String,
/// Name of the network to be put in the release notes title of the srtool part
network: String,
/// Branch on which the tag `name` will be created during the release
branch: String,
/// Name of the milestone to add this release to
milestone: String,
},
/// Release a new client for a network
ReleaseClient {
/// Name of the release + tag to be applied
name: String,
/// Branch on which the tag `name` will be created during the release
branch: String,
/// Name of the milestone to add this release to
milestone: String,
},
/// Print the chainSpec published on given Network Release
......@@ -104,20 +117,25 @@ async fn main() -> Result<()> {
inject_runtime_code(&raw_spec, &runtime)
}
DuniterXTaskCommand::ReleaseNetwork { network, branch } => {
release_runtime::release_network(network, branch).await
gitlab::release_network(network, branch).await
}
DuniterXTaskCommand::ReleaseRuntime {
name,
network,
branch,
milestone,
} => release_runtime::release_runtime(name, network, branch, milestone).await,
DuniterXTaskCommand::PrintSpec { network } => release_runtime::print_spec(network).await,
} => gitlab::release_runtime(name, network, branch, milestone).await,
DuniterXTaskCommand::ReleaseClient {
name,
branch,
milestone,
} => gitlab::release_client(name, branch, milestone).await,
DuniterXTaskCommand::PrintSpec { network } => gitlab::print_spec(network).await,
DuniterXTaskCommand::CreateAssetLink {
tag,
asset_name,
asset_url,
} => release_runtime::create_asset_link(tag, asset_name, asset_url).await,
} => gitlab::create_asset_link(tag, asset_name, asset_url).await,
DuniterXTaskCommand::Test => test(),
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment