From 29d2c0fdac255c5fa9ce5064327779a9159be17d Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo.trentesaux@lilo.org> Date: Mon, 13 Mar 2023 18:46:17 +0100 Subject: [PATCH] document bootstrap process (nodes/rust/duniter-v2s!114) * wip smooth * wip tmp * wip review * wip document bootstrap process --- docs/dev/img/pipeline_screenshot.png | Bin 0 -> 27237 bytes docs/dev/launch-a-live-network.md | 75 +++++++++++++++++++++------ docs/dev/release-new-runtime.md | 41 +++++++++++++++ 3 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 docs/dev/img/pipeline_screenshot.png create mode 100644 docs/dev/release-new-runtime.md diff --git a/docs/dev/img/pipeline_screenshot.png b/docs/dev/img/pipeline_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2870de4baa32f9f9f0a5a18bb280c7be926366 GIT binary patch literal 27237 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 literal 0 HcmV?d00001 diff --git a/docs/dev/launch-a-live-network.md b/docs/dev/launch-a-live-network.md index 833edeb3d..cc87050d8 100644 --- a/docs/dev/launch-a-live-network.md +++ b/docs/dev/launch-a-live-network.md @@ -1,22 +1,43 @@ # How to launch a live network -## 1. Choose the currency type +Launching a new live network is more difficult than spawning a local blockchain. Follow this process if you know what you are doing and you already experimented a bit with local blockchains. Part of this process is automated with Rust scripts, including interaction with GitLab's GraphQL API. Do not hesitate to improve and complete it (see TODOs inside `xtask/**/*.rs` files). -Ensure that the currency type you want has the requirements. +## Requirements + +In order to build in a standardized environment, you need Docker. + +- see docker docs to [install docker](https://docs.docker.com/engine/install/) +- make sure you can run docker as non-root user with `docker info` or so + +## Preparation + +When launching a new network, you're likely to use a new runtime. See how to [release a new runtime](./release-new-runtime.md). + +### Inject runtime in chainspec + +ÄžDev runtime is automatically embeded in the raw chainspec with the `include_bytes!` macro. An other way to inject the runtime is to use "inject-runtime-code" xtask: + +```bash +cargo xtask inject-runtime-code --runtime runtime/gdev/target/srtool/release/wbuild/gdev-runtime/gdev_runtime.compact.compressed.wasm --raw-spec resources/gdev-raw.json +``` + +## Bootstraping + +### Choose the currency type For now, only `gdev` is supported. In the commands that will be indicated afterwards, you will have to replace `CURRENCY` by the currency type you have chosen. -## 2. Choose the docker image +### Choose the docker image -Choose or build the docker image that contains the version of the code thut you want to use. +Choose the docker image that contains the version of the code that you want to use. In the commands that will be indicated afterwards, you will have to replace `TAG` by the tag of the -docker image that you have chosen. +docker image that you have chosen (example : runtime-400). -## 3. Generate the session keys of genesis authority +### Generate the session keys of genesis authority Generate a random secret phrase: @@ -39,11 +60,11 @@ $ docker run --rm duniter/duniter-v2s:TAG -- key generate-session-keys --chain C Session Keys: 0x87189d723e1b2826c243bc433c718ac26ba60526932216a09102a254d54462b890a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d6290a0c2866034db9d05f8193a95fe5af8d5e12ab295a501c17c95cdbeaf226d62 ``` -## 4. Paste sessions keys in the genesis configuration file +### Paste sessions keys in the genesis configuration file -An example of genesis configuration file: `resources/gdev.json` +An example of genesis configuration file: `resources/gdev.json`. Paste your session keys in your `smith` identity with key `session_keys`. -## 5. Generate raw spec +### Generate raw spec ```docker docker run -v $HOME/dev/duniter-v2s/resources:/var/lib/duniter/resources -e DUNITER_GENESIS_CONFIG=/var/lib/duniter/resources/gdev.json --rm duniter/duniter-v2s:TAG -- build-spec -lerror --chain=gdev-gl --raw > name-raw.json @@ -53,24 +74,46 @@ docker run -v $HOME/dev/duniter-v2s/resources:/var/lib/duniter/resources -e DUNI ./scripts/gen-live-network-raw-spec.sh CURRENCY "<path/to/your/genesis/config/file>" ``` -## 6. Generate the docker compose and prepare nodes keys +This builds the specs using debug version of Duniter. + +### Generate the docker compose and prepare nodes keys ```bash ./scripts/create-live-network.sh "<your secret phrase>" CURRENCY "<path/to/dist/folder>" ``` -The distribution folder can then be copied to a server, then the compose must be launched from the -root of the distribution folder: +The new distribution folder can be copied to a server ```bash -scp -r -P SSH_PORT "<path/to/dist/folder>" user@ip:/remote/dist/path -cd "<path/to/dist/folder>" -docker compose up -d +scp -r "<path/to/dist/folder>" <server>:/remote/dist/path ``` -Then, on the server: +then on the server, launch the compose file from the the distribution folder's root: ```bash +ssh <server> cd "<path/to/dist/folder>" docker compose up -d ``` + +This is the first node of the new live network. + +## Finalization + +The following steps should be completed once you are satisfied with the new live network. + +### Rotate session keys + +You should rotate session keys for more secured keys produced on the server (the one you used before are still in your develop machine bash history and clipboard). + +### Publish image + +With these new session keys in the chainspec and the runtime build with srtool, you can release the new runtime again with: + +```bash +cargo xtask release-runtime 400 +``` + +### Tell the other smith + +Once you completed all these steps, the other smith can pull the docker image with a genesis containing your bootnode with the correct session keys. They can base their `docker-compose.yml` on the `duniter-validator` template. diff --git a/docs/dev/release-new-runtime.md b/docs/dev/release-new-runtime.md new file mode 100644 index 000000000..43920e1c5 --- /dev/null +++ b/docs/dev/release-new-runtime.md @@ -0,0 +1,41 @@ +# Release a new runtime + +Here you will learn how to release a new runtime using `gitlab ci` and `cargo xtask`. + +## Runtime tag and spec version + +Our runtime tags use `xxyy` version numbers where `x` corresponds to major change and `y` hotfix. + +1. Make sure to move any issue or merge request assigned to the choosen milestone `runtime-xxyy` to the next one. This prevents from forgetting unfinished work. +1. Check that the [CI on release/runtime-XX00](https://git.duniter.org/nodes/rust/duniter-v2s/-/pipelines?scope=all&page=1&ref=runtime-400) (runtime major release branch) is passing. This is necessary to build the docker images. +1. Increment the `spec_version` in the code. Example `spec_version: 300` -> `spec_version: 400`. + +Publish the `runtime-400` branch. Go to the pipelines and run the manual tasks as shown on the screenshot below. + +- `build_release_manual` +- `deploy_docker_release_sha` + + + +## Release runtime + +We choose [`xtask`](https://github.com/matklad/cargo-xtask/) to run Rust scripts using `cargo`. To build these scripts, just run: + +```bash +cargo xtask -h # this will build the scripts and show the available commands +``` + +To interact with GitLab, the `release_runtime` script uses the environment variable `GITLAB_TOKEN` which must contain a token with write permission on the repository. Go to your [personal access token preferences](https://git.duniter.org/-/profile/personal_access_tokens) to generate one and `export` it (you might want to add it to your `.bashrc`). You can then run this command: + +```bash +cargo xtask release-runtime 400 # requires to run docker as non-root user +``` + +This command does the following things (use your system monitor to track the progress as it produces not log): + +1. Download the [`paritytech/srtool`](https://docs.substrate.io/reference/command-line-tools/srtool/) (Substrate Runtime TOOLbox) docker image (about 2 minutes with a good connection). It is a docker container enabling to build the Substrate WebAssembly runtime in a deterministic way (machine-independant). +1. Build gdev runtime in release mode using `srtool` (about 5 minutes depending on your computing power). The target is put in the `runtime/gdev/target` folder (about 2GB). +1. Generate release notes using the template in `xtask/res` +1. Publish the release with the notes on GitLab using your `GITLAB_TOKEN` + +This release will trigger a GitLab CI publishing a docker image of the Substrate client with embeded runtime. \ No newline at end of file -- GitLab