From 00923e78d486f1b44883eafe65464fd2a36025c1 Mon Sep 17 00:00:00 2001 From: Anmol Date: Wed, 12 Jun 2024 14:25:11 +0530 Subject: [PATCH] feature: github action using starshipjs (#27) --- .github/workflows/test.yaml | 5 +- .gitignore | 5 ++ README.md | 6 +- action.yaml | 74 +++++++++++--------- install.sh | 99 -------------------------- package.json | 8 +++ port-forward.sh | 135 ------------------------------------ yarn.lock | 4 ++ 8 files changed, 62 insertions(+), 274 deletions(-) delete mode 100755 install.sh create mode 100644 package.json delete mode 100755 port-forward.sh create mode 100644 yarn.lock diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index be14e96..5181ac5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -52,7 +52,6 @@ jobs: - uses: ./ id: starship with: - port-forward: true name: test-with-values values: config.yaml @@ -130,7 +129,6 @@ jobs: - uses: ./ id: starship with: - port-forward: true name: test-kubeconfig kubeconfig: ${{ steps.kubeconfig.outputs.content }} values: config.yaml @@ -149,7 +147,7 @@ jobs: NAMESPACE: ${{ steps.starship.outputs.namespace }} NAME: ${{ steps.starship.outputs.name }} - test-with-no-portforward: + test-with-no-ports: runs-on: ubuntu-latest steps: @@ -170,7 +168,6 @@ jobs: - uses: ./ id: starship with: - port-forward: false name: test-no-portforward values: config.yaml diff --git a/.gitignore b/.gitignore index e131255..80263b8 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,8 @@ bin-release/ # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` # should NOT be excluded as they contain compiler settings and other important # information for Eclipse / Flash Builder. +**/node_modules/ +**/.DS_Store +**/dist +**/yarn-error.log +lerna-debug.log diff --git a/README.md b/README.md index 0a6fccc..cd0777e 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,12 @@ For more information, reference the GitHub Help Documentation for [Creating a wo For more information on inputs, see the [API Documentation](https://developer.github.com/v3/repos/releases/#input) - `values`: Required, config for helm chart for starship devnet inputs -- `port-forward`: Optional, toggle to perform local port-forwarding, based on the `values.yaml` (default: `false`) +- `version`: Optional, version of devnet helm chart from starship (default: `0.2.3`) +- `cli-version`: Optional, version of @starship-ci/cli to use (default: `2.4.0`) - `kubeconfig`: Optional, Kubeconfig for remote cluster, if set, will be used instead of creating local kind cluster -- `version`: Optional, version of devnet chart from starship (default: `0.2.3`) +- `namespace`: Optional, Kubernetes namespace to which helm charts will be deployed. If not found, namespace will be created. (default: `ci-${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}`) - `repo`: Optional, Helm repo to fetch the chart from (default: https://cosmology-tech.github.io/starship) - `name`: Optional, Release name for the helm chart deployment (default: `starship-devnet`) -- `namespace`: Optional, Kubernetes namespace to which helm charts will be deployed. If not found, namespace will be created. (default: `ci-${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}`) - `chart`: Optional, Name of the help chart to use. Recommended: use default (default: `starship/devnet`) ### Outputs diff --git a/action.yaml b/action.yaml index 92e11bd..6772bb0 100644 --- a/action.yaml +++ b/action.yaml @@ -8,18 +8,18 @@ inputs: values: description: "Values yaml raw data of filename for helm that define the topology for the devnet" required: true - port-forward: - description: "Flag weather to perform port forwarding as defined in the values file to local ports (default: true)" + version: + description: "Version of devnet chart (default: v0.2.3)" + required: false + default: "v0.2.3" + cli-version: + description: "Version of @starship-ci/cli to use: default: 2.3.0" required: false - default: "true" + default: "2.4.0" kubeconfig: description: "Kubeconfig file for remote cluster, if set, will be used instead of creating kind cluster" required: false default: "" - version: - description: "Version of devnet chart (default: 0.1.45)" - required: false - default: "0.2.3" chart: description: "Name of the help chart to use. Recommended: use default (default: starship/devnet)" required: false @@ -36,10 +36,6 @@ inputs: description: "Kubernetes namespace to deploy helm charts on (default: ci-{github.repository}-{github.workflow}-{github.ref} )" required: false default: "" - timeout: - description: "Timeout for helm install (default: 10m)" - required: false - default: "10m" outputs: namespace: @@ -53,12 +49,11 @@ runs: using: composite steps: - - name: Install dependencies - run: | - sudo apt-get install -y make sed wget tar jq - sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq - sudo chmod +x /usr/bin/yq - shell: bash + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "20.x" + cache: "yarn" - name: Setup helm uses: azure/setup-helm@v3 @@ -112,12 +107,25 @@ runs: env: INPUT_NAMESPACE: ${{ inputs.namespace }} + - name: Create namespace if nonexistent + run: | + kubectl create namespace ${{ steps.set-namespace.outputs.namespace }} || true + shell: bash + + - name: Setup starshipjs client + run: | + yarn global add @starship-ci/cli@${{ inputs.cli-version }} + starship --version + shell: bash + - name: Setup starship helm repo run: | - helm version - helm repo add starship ${{ inputs.repo }} - helm repo update - helm search repo starship/devnet + starship setup \ + --helmName ${{ inputs.name }} \ + --helmVersion ${{ inputs.version }} \ + --helmFile $GITHUB_WORKSPACE/${{ inputs.name }}-values.yaml \ + --helmNamespace ${{ steps.set-namespace.outputs.namespace }} \ + --helmChart ${{ inputs.chart }} shell: bash - name: Helm install @@ -126,7 +134,12 @@ runs: run: | helm delete ${{ inputs.name }} --debug --namespace ${{ steps.set-namespace.outputs.namespace }} --wait || true sleep 5 - ${{ github.action_path }}/install.sh --config ${{ inputs.values }} --name ${{ inputs.name }} --chart ${{ inputs.chart }} --version ${{ inputs.version }} --namespace ${{ steps.set-namespace.outputs.namespace }} --timeout ${{ inputs.timeout }} + starship start \ + --helmName ${{ inputs.name }} \ + --helmVersion ${{ inputs.version }} \ + --helmFile $GITHUB_WORKSPACE/${{ inputs.name }}-values.yaml \ + --helmNamespace ${{ steps.set-namespace.outputs.namespace }} \ + --helmChart ${{ inputs.chart }} shell: bash - name: Logs @@ -152,15 +165,10 @@ runs: helm delete ${{ inputs.name }} --debug --namespace ${{ steps.set-namespace.outputs.namespace }} --wait || true sleep 5 kubectl get pods --namespace ${{ steps.set-namespace.outputs.namespace }} - ${{ github.action_path }}/install.sh --config ${{ inputs.name }}-values.yaml --name ${{ inputs.name }} --chart ${{ inputs.chart }} --version ${{ inputs.version }} --namespace ${{ steps.set-namespace.outputs.namespace }} --timeout ${{ inputs.timeout }} - shell: bash - - - name: Port forward - if: ${{ inputs.port-forward == 'true' }} - run: | - kubectl version - ${{ github.action_path }}/port-forward.sh --config=$VALUES_FILE --namespace=$NAMESPACE + starship start \ + --helmName ${{ inputs.name }} \ + --helmVersion ${{ inputs.version }} \ + --helmFile $GITHUB_WORKSPACE/${{ inputs.name }}-values.yaml \ + --helmNamespace ${{ steps.set-namespace.outputs.namespace }} \ + --helmChart ${{ inputs.chart }} shell: bash - env: - VALUES_FILE: ${{ inputs.name }}-values.yaml - NAMESPACE: ${{ steps.set-namespace.outputs.namespace }} diff --git a/install.sh b/install.sh deleted file mode 100755 index 24a3c74..0000000 --- a/install.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash - -## Script used to install the helm chart for the devnet from a config file -## Usage: -## ./scripts/install.sh --coinfig -## Options: -## -c|--config: config file to use (default: config.yaml) -## -v|--version: helm chart version (default: 0.1.43) - -set -euo pipefail - -# read config file from args into variable -CONFIGFILE="config.yaml" - -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -echo "Script dir: ${SCRIPT_DIR}" - -# default values -DRY_RUN="" -TIMEOUT="" -NAMESPACE="" -HELM_NAME="starship" -HELM_CHART="starship/devnet" -HELM_CHART_VERSION="0.2.3" - -function set_helm_args() { - if [[ $TIMEOUT ]]; then - args="$args --timeout $TIMEOUT --wait --debug" - fi - if [[ $NAMESPACE ]]; then - args="$args --namespace $NAMESPACE --create-namespace" - fi - if [[ $DRY_RUN ]]; then - args="$args --dry-run" - fi - num_chains=$(yq -r ".chains | length - 1" ${CONFIGFILE}) - if [[ $num_chains -lt 0 ]]; then - echo "No chains to parse: num: $num_chains" - return 0 - fi - for i in $(seq 0 $num_chains); do - scripts=$(yq -r ".chains[$i].scripts" ${CONFIGFILE}) - if [[ "$scripts" == "null" ]]; then - return 0 - fi - datadir="$(cd "$(dirname -- "${CONFIGFILE}")" >/dev/null; pwd -P)" - for script in $(yq -r ".chains[$i].scripts | keys | .[]" ${CONFIGFILE}); do - args="$args --set-file chains[$i].scripts.$script.data=$datadir/$(yq -r ".chains[$i].scripts.$script.file" ${CONFIGFILE})" - done - done -} - -function install_chart() { - args="" - set_helm_args - echo "args: $args" - helm install ${HELM_NAME} ${HELM_CHART} --version ${HELM_CHART_VERSION} -f ${CONFIGFILE} $args -} - -while [ $# -gt 0 ]; do - case "$1" in - -c|--config) - CONFIGFILE="$2" - shift 2 # past argument=value - ;; - -v|--version) - HELM_CHART_VERSION="$2" - shift 2 # past argument - ;; - -t|--timeout) - TIMEOUT="$2" - shift 2 # past argument - ;; - -n|--name) - HELM_NAME="$2" - shift 2 # past argument - ;; - --namespace) - NAMESPACE="$2" - shift 2 # past argument - ;; - --chart) - HELM_CHART="$2" - shift 2 # past argument - ;; - --dry-run) - DRY_RUN=1 - shift 2 # past argument - ;; - -*|--*) - echo "Unknown option $1" - exit 1 - ;; - *) - ;; - esac -done - -install_chart diff --git a/package.json b/package.json new file mode 100644 index 0000000..7ca6eb3 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "name": "starship-action", + "version": "1.0.0", + "main": "index.js", + "repository": "git@github.com:cosmology-tech/starship-action.git", + "author": "Anmol1696 ", + "license": "MIT" +} diff --git a/port-forward.sh b/port-forward.sh deleted file mode 100755 index 8c520b1..0000000 --- a/port-forward.sh +++ /dev/null @@ -1,135 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -function color() { - local color=$1 - shift - local black=30 red=31 green=32 yellow=33 blue=34 magenta=35 cyan=36 white=37 - local color_code=${!color:-$green} - printf "\033[%sm%s\033[0m\n" "$color_code" "$*" -} - -function stop_port_forward() { - color green "Trying to stop all port-forward, if any...." - PIDS=$(ps -ef | grep -i -e 'kubectl port-forward' | grep -v 'grep' | cat | awk '{print $2}') || true - for p in $PIDS; do - kill -15 $p - done - sleep 2 -} - -# Default values -CHAIN_RPC_PORT=26657 -CHAIN_COMETMOCK_PORT=22331 -CHAIN_GRPC_PORT=9090 -CHAIN_LCD_PORT=1317 -CHAIN_EXPOSER_PORT=8081 -CHAIN_FAUCET_PORT=8000 -RELAYER_REST_PORT=3000 -RELAYER_EXPOSER_PORT=8081 -EXPLORER_LCD_PORT=8080 -REGISTRY_LCD_PORT=8080 -REGISTRY_GRPC_PORT=9090 -MONITORING_PROMETHEUS_PORT=8080 -MONITORING_GRAFANA_PORT=8080 - -for i in "$@"; do - case $i in - -c=*|--config=*) - CONFIGFILE="${i#*=}" - shift # past argument=value - ;; - -n=*|--namespace=*) - NAMESPACE="${i#*=}" - shift # past argument=value - ;; - -*|--*) - echo "Unknown option $i" - exit 1 - ;; - *) - ;; - esac -done - -stop_port_forward - -echo "Port forwarding for config ${CONFIGFILE}" -echo "Port forwarding all chains" -num_chains=$(yq -r ".chains | length - 1" ${CONFIGFILE}) -if [[ $num_chains -gt -1 ]]; then - for i in $(seq 0 $num_chains); do - # derive chain pod name from chain id - # https://github.com/cosmology-tech/starship/blob/main/charts/devnet/templates/_helpers.tpl#L56 - chain=$(yq -r ".chains[$i].id" ${CONFIGFILE} ) - chain=${chain/_/"-"} - localrpc=$(yq -r ".chains[$i].ports.rpc" ${CONFIGFILE} ) - localgrpc=$(yq -r ".chains[$i].ports.grpc" ${CONFIGFILE} ) - locallcd=$(yq -r ".chains[$i].ports.rest" ${CONFIGFILE} ) - localexp=$(yq -r ".chains[$i].ports.exposer" ${CONFIGFILE}) - localfaucet=$(yq -r ".chains[$i].ports.faucet" ${CONFIGFILE}) - color yellow "chains: forwarded $chain" - if [[ $(yq -r ".chains[$i].cometmock.enabled" $CONFIGFILE) == "true" ]]; - then - [[ "$localrpc" != "null" ]] && color yellow " cometmock rpc to http://localhost:$localrpc" && kubectl port-forward pods/$chain-cometmock-0 $localrpc:$CHAIN_COMETMOCK_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - else - [[ "$localrpc" != "null" ]] && color yellow " rpc to http://localhost:$localrpc" && kubectl port-forward pods/$chain-genesis-0 $localrpc:$CHAIN_RPC_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - fi - [[ "$localgrpc" != "null" ]] && color yellow " grpc to http://localhost:$localgrpc" && kubectl port-forward pods/$chain-genesis-0 $localgrpc:$CHAIN_GRPC_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - [[ "$locallcd" != "null" ]] && color yellow " lcd to http://localhost:$locallcd" && kubectl port-forward pods/$chain-genesis-0 $locallcd:$CHAIN_LCD_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - [[ "$localexp" != "null" ]] && color yellow " exposer to http://localhost:$localexp" && kubectl port-forward pods/$chain-genesis-0 $localexp:$CHAIN_EXPOSER_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - [[ "$localfaucet" != "null" ]] && color yellow " faucet to http://localhost:$localfaucet" && kubectl port-forward pods/$chain-genesis-0 $localfaucet:$CHAIN_FAUCET_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - sleep 1 - done -else - echo "No chains to port-forward: num: $num_chains" -fi - - -echo "Port forward relayers" -num_relayers=$(yq -r ".relayers | length - 1" ${CONFIGFILE}) -if [[ $num_relayers -gt -1 ]]; then - for i in $(seq 0 $num_relayers); do - # derive chain pod name from chain id - # https://github.com/cosmology-tech/starship/blob/main/charts/devnet/templates/_helpers.tpl#L56 - relayer=$(yq -r ".relayers[$i].name" ${CONFIGFILE} ) - relayer=$(yq -r ".relayers[$i].type" ${CONFIGFILE} )-${relayer/_/"-"} - localrest=$(yq -r ".relayers[$i].ports.rest" ${CONFIGFILE} ) - localexposer=$(yq -r ".relayers[$i].ports.exposer" ${CONFIGFILE} ) - color yellow "relayers: forwarded $relayer" - [[ "$localrest" != "null" ]] && color yellow " rpc to http://localhost:$localrest" && kubectl port-forward pods/$relayer-0 $localrest:$RELAYER_REST_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - [[ "$localexposer" != "null" ]] && color yellow " rpc to http://localhost:$localexposer" && kubectl port-forward pods/$relayer-0 $localexposer:$RELAYER_EXPOSER_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - sleep 1 - done -else - echo "No relayer to port-forward: num: $num_relayers" -fi - - -echo "Port forward services" - -if [[ $(yq -r ".registry.enabled" $CONFIGFILE) == "true" ]]; -then - kubectl port-forward service/registry 8081:$REGISTRY_LCD_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - kubectl port-forward service/registry 9091:$REGISTRY_GRPC_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - sleep 1 - color yellow "registry: forwarded registry lcd to grpc http://localhost:8081, to http://localhost:9091" -fi - -if [[ $(yq -r ".explorer.enabled" $CONFIGFILE) == "true" ]]; -then - kubectl port-forward service/explorer 8080:$EXPLORER_LCD_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - sleep 1 - color green "Open the explorer to get started.... http://localhost:8080" -fi - -if [[ $(yq -r ".monitoring.enabled" $CONFIGFILE) == "true" ]]; -then - color yellow "monitoring port forward:" - localgrafana=$(yq -r ".monitoring.ports.grafana" ${CONFIGFILE}) - localprometheus=$(yq -r ".monitoring.ports.prometheus" ${CONFIGFILE}) - [[ "$localgrafana" != "null" ]] && color yellow " grafana to http://localhost:$localgrafana" && kubectl port-forward service/grafana $localgrafana:$MONITORING_GRAFANA_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - [[ "$localprometheus" != "null" ]] && color yellow " prometheus to http://localhost:$localprometheus" && kubectl port-forward service/prometheus-service $localprometheus:$MONITORING_PROMETHEUS_PORT --namespace $NAMESPACE > /dev/null 2>&1 & - sleep 1 -fi diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..fb57ccd --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +