#!/bin/bash set -eu WORKDIR=/home/oscarzhou/source/github.com/portainer GLOBAL_VOLUME=/home/oscarzhou/volumes TRUE=0; FALSE=1; # PORTAINER_FLAGS= # PORTAINER_FLAGS=--enable-init true ERROR_COLOR='\033[0;31m'; HIGHLIGHT_COLOR='\033[0;32m'; NO_COLOR='\033[0m'; function choose_repo() { read -p "Choose the working project EE/(CE)/(k8s)/(agent):" REPO if [ -z "$REPO" ]; then REPO="EE"; fi if [[ "${REPO}" == "ee" || "${REPO}" == "EE" ]]; then cd ${WORKDIR}/portainer-ee elif [[ "${REPO}" == "ce" || "${REPO}" == "CE" ]]; then cd ${WORKDIR}/portainer elif [[ "${REPO}" == "k8s" || "${REPO}" == "ks" ]]; then cd ${WORKDIR}/k8s elif [[ "${REPO}" == "ag" || "${REPO}" == "agent" ]]; then cd ${WORKDIR}/agent fi } function is_root() { if [ "$EUID" -ne 0 ]; then printf "${HIGHLIGHT_COLOR}Please run as root${NO_COLOR}\n" exit; fi } function check_branch() { printf "Your current checkout branch \n$(git branch)\n" read -p "Continue N/(Y)?" CORRECT_BRANCH if [ -z "$CORRECT_BRANCH" ]; then CORRECT_BRANCH="N"; fi if [[ "${CORRECT_BRANCH}" == "N" || "${CORRECT_BRANCH}" == "n" ]]; then printf "${ERROR_COLOR}Exit.\n"; return $FALSE; fi return $TRUE; } function choose_export_volume() { read -p "Choose the volume EE/CE/Temp-data(TD):" DEST if [ -z "$DEST" ]; then DEST="EE"; fi if [[ "${DEST}" == "ee" || "${DEST}" == "EE" ]]; then VOLUME=~/volumes/portainer-ee-data elif [[ "${DEST}" == "ce" || "${DEST}" == "CE" ]]; then VOLUME=~/volumes/portainer-ce-data elif [[ "${DEST}" == "td" || "${DEST}" == "TD" ]]; then VOLUME=~/volumes/temp-data fi export PORTAINER_DATA=${VOLUME} printf "${HIGHLIGHT_COLOR}export PORTAINER_DATA=${PORTAINER_DATA}${NO_COLOR}\n" } function cleanup_temporary_volume() { printf "${HIGHLIGHT_COLOR}Clean temporary data${NO_COLOR}\n" local VOLUME=~/volumes/temp-data if [ -d ${VOLUME} ]; then printf "The current volume is ${VOLUME}. " read -p "Do you want to clean up the existing data N/(Y)?" CLEAN_DATA if [[ "${CLEAN_DATA}" == "y" || "${CLEAN_DATA}" == "Y" ]]; then rm -rvf ${VOLUME}/* fi else mkdir ${VOLUME} fi } function build_portainer_frontend_without_prompt() { printf "${HIGHLIGHT_COLOR}Build Portainer Frontend${NO_COLOR}\n" yarn yarn start:client } function build_portainer_backend_without_prompt() { printf "${HIGHLIGHT_COLOR}Build Portainer Backend${NO_COLOR}\n" if [ -z dist/portainer ]; then rm dist/portainer; fi yarn start:server } function build_portainer_frontend() { choose_repo if ! check_branch; then exit; fi build_portainer_frontend_without_prompt } function build_portainer_backend() { choose_repo choose_export_volume if ! check_branch; then exit; fi build_portainer_backend_without_prompt } function build_portainer_agent() { choose_repo if ! check_branch; then exit; fi ./dev.sh compile } function build_portainer_all() { printf "${HIGHLIGHT_COLOR}Build Portainer all${NO_COLOR}\n" choose_repo choose_export_volume if ! check_branch; then exit; fi build_portainer_backend_without_prompt build_portainer_frontend_without_prompt } function run_before_commit() { printf "${HIGHLIGHT_COLOR}Run before commit${NO_COLOR}\n" choose_repo if ! check_branch; then exit; fi yarn printf "${HIGHLIGHT_COLOR}yarn format${NO_COLOR}\n" yarn format printf "${HIGHLIGHT_COLOR}yarn lint${NO_COLOR}\n" yarn lint } function run_before_commit_k8s() { printf "${HIGHLIGHT_COLOR}Run before commit${NO_COLOR}\n" choose_repo if ! check_branch; then exit; fi printf "${HIGHLIGHT_COLOR}chart-testing ct lint${NO_COLOR}\n" docker run --rm -it -w /repo -v `pwd`:/repo quay.io/helmpack/chart-testing ct lint --all --config=.ci/ct-config.yaml } function generate_portainer_jwt() { printf "${HIGHLIGHT_COLOR}Generate Portainter JWT${NO_COLOR}\n" read -p "Username(admin):" username if [ -z "$username" ]; then username="admin"; fi read -p "Password(****):" password read -p "Address(127.0.0.1):" address if [ -z "$address" ]; then address="127.0.0.1"; fi payload="{\"username\":\"${username}\",\"password\":\"${password}\"}" curl -d ${payload} -H 'Content-Type: application/json' "http://${address}:9000/api/auth" } function get_portainer_ce_api_reference() { printf "${HIGHLIGHT_COLOR}Get the reference of Portainer CE API${NO_COLOR}\n" cd ${WORKDIR}/portainer if ! check_branch; then exit; fi read -p "Commit(HEAD):" commit if [ -z "$commit" ]; then commit=$(git rev-parse HEAD) fi printf "${HIGHLIGHT_COLOR}Installing github.com/portainer/portainer/api@${commit}${NO_COLOR}\n" output=$(go install github.com/portainer/portainer/api@${commit}) | while IFS= read -r line; do echo "$line" done # result=" # go: downloading github.com/portainer/portainer/api v0.0.0-20220622202437-f0ca3e63db9d # go: downloading github.com/portainer/portainer v0.6.1-0.20220622202437-f0ca3e63db9d # package github.com/portainer/portainer/api is not a main package # " # while IFS= read -r line; do # echo "$line" # done <<< $(echo ${result}) } function menu() { PS3='Please select the option: ' OPTIONS=( 'Build Portainer EE/CE All' 'Build Portainer EE/CE Frontend' 'Build Portainer EE/CE Backend' 'Generate Portainer EE/CE JWT' 'Run Before Commit [Portainer EE/CE]' 'Get Portainer CE API Reference' 'Run Before Commit [k8s]' 'Build Portainer Agent' 'Cleanup Temporary Volume' 'Quit' ) select opt in "${OPTIONS[@]}" do case $opt in 'Build Portainer EE/CE All') build_portainer_all ;; 'Build Portainer EE/CE Frontend') build_portainer_frontend ;; 'Build Portainer EE/CE Backend') build_portainer_backend ;; 'Generate Portainer EE/CE JWT') generate_portainer_jwt ;; 'Run Before Commit [Portainer EE/CE]') run_before_commit ;; 'Get Portainer CE API Reference') get_portainer_ce_api_reference ;; 'Run Before Commit [k8s]') run_before_commit_k8s ;; 'Build Portainer Agent') build_portainer_agent ;; 'Cleanup Temporary Volume') cleanup_temporary_volume ;; 'Quit') break ;; esac done } # check if the function exists (bash specific) if [ "$#" -eq 0 ]; then menu else "$@" fi