From f07f3cc8eb86663e02b874d64188dd0a7cf05a0b Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Mon, 2 Jan 2023 17:47:31 +0530 Subject: [PATCH] feat: publish documentation to librepages --- .woodpecker.yml | 12 ++++ Makefile | 47 +++++++++++++++ scripts/ci.sh | 155 ++++++++++++++++++++++++++++++++++++++++++++++++ scripts/lib.sh | 32 ++++++++++ 4 files changed, 246 insertions(+) create mode 100644 .woodpecker.yml create mode 100644 Makefile create mode 100755 scripts/ci.sh create mode 100755 scripts/lib.sh diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..36ce9b5 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,12 @@ +pipeline: + backend: + image: rust + commands: + - apt update && apt-get -y --no-install-recommends install tar gpg curl wget git + - rustup component add rustfmt + - rustup component add clippy + - make lint + - make test + - make doc + - make ci-deploy + secrets: [ GITEA_WRITE_DEPLOY_KEY, LIBREPAGES_DEPLOY_SECRET ] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5074e2f --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +default: ## Debug build + cargo build + +check: ## Check for syntax errors on all workspaces + cargo check --workspace --tests --all-features + +ci-deploy: ## Deploy from CI/CD. Only call from within CI + @if [ "${CI}" != "woodpecker" ]; \ + then echo "Only call from within CI. Will re-write your local Git configuration. To override, set export CI=woodpecker"; \ + exit 1; \ + fi + git config --global user.email "${CI_COMMIT_AUTHOR_EMAIL}" + git config --global user.name "${CI_COMMIT_AUTHOR}" + ./scripts/ci.sh --init "$$GITEA_WRITE_DEPLOY_KEY" + ./scripts/ci.sh --deploy librepages dist + ./scripts/ci.sh --clean + + + +clean: ## Clean all build artifacts and dependencies + @cargo clean + +coverage: ## Generate HTML code coverage + cargo tarpaulin -t 1200 --out Html + +dev-env: ## Download development dependencies + cargo fetch + +doc: ## Prepare documentation + cargo doc --no-deps --workspace --all-features + rm -rf dist || true && cp -r ./target/doc/ dist/ + +lint: ## Lint codebase + cargo fmt -v --all -- --emit files + cargo clippy --workspace --tests --all-features + +release: ## Release build + cargo build --release + +test: ## Run tests + cargo test --all-features --no-fail-fast + +xml-test-coverage: ## Generate cobertura.xml test coverage + cargo tarpaulin -t 1200 --out Xml + +help: ## Prints help for targets with comments + @cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-]+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/scripts/ci.sh b/scripts/ci.sh new file mode 100755 index 0000000..4ffb86d --- /dev/null +++ b/scripts/ci.sh @@ -0,0 +1,155 @@ +#!/bin/bash +# ci.sh: Helper script to automate deployment operations on CI/CD +# Copyright © 2022 Aravinth Manivannan +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +set -xEeuo pipefail +#source $(pwd)/scripts/lib.sh + +readonly SSH_ID_FILE=/tmp/ci-ssh-id +readonly SSH_REMOTE_NAME=origin-ssh + +match_arg() { + if [ $1 == $2 ] || [ $1 == $3 ] + then + return 0 + else + return 1 + fi +} + +help() { + cat << EOF +USAGE: ci.sh [SUBCOMMAND] +Helper script to automate deployment operations on CI/CD + +Subcommands + + -c --clean cleanup secrets, SSH key and other runtime data + -i --init initialize environment, write SSH private to file + -d --deploy push branch to Gitea and call Pages server + -h --help print this help menu +EOF +} + +# $1: SSH private key +write_ssh(){ + truncate --size 0 $SSH_ID_FILE + echo "$1" > $SSH_ID_FILE + chmod 600 $SSH_ID_FILE +} + +set_ssh_remote() { + http_remote_url=$(git remote get-url origin) + remote_hostname=$(echo $http_remote_url | cut -d '/' -f 3) + repository_owner=$(echo $http_remote_url | cut -d '/' -f 4) + repository_name=$(echo $http_remote_url | cut -d '/' -f 5) + ssh_remote="git@$remote_hostname:$repository_owner/$repository_name" + ssh_remote="git@git.batsense.net:ForgeFlux/f3-rs.git" + git remote add $SSH_REMOTE_NAME $ssh_remote +} + +clean() { + if [ -f $SSH_ID_FILE ] + then + shred $SSH_ID_FILE + rm $SSH_ID_FILE + fi +} + +# $1: branch name +# $2: directory containing build assets +write_to_branch() { + readonly PROJECT_ROOT=$(pwd) + cd $PROJECT_ROOT + original_branch=$(git branch --show-current) + tmp_dir=$(mktemp -d) + cp -r $2/* $tmp_dir + + if [[ -z $(git ls-remote --heads origin ${1}) ]] + then + echo "[*] Creating deployment branch $1" + git checkout --orphan $1 + else + echo "[*] Deployment branch $1 exists, pulling changes from remote" + git fetch origin $1 + git switch $1 + fi + git rm -rf . + /bin/rm -rf * + cp -r $tmp_dir/* . + git add --all + if [ $(git status --porcelain | xargs | sed '/^$/d' | wc -l) -gt 0 ]; + then + echo "[*] Repository has changed, committing changes" + git commit \ + --message="new deploy: $(date --iso-8601=seconds)" + fi + git checkout $original_branch +} + +# $1: Deployment target branch +deploy() { + if (( "$#" < 1 )) + then + help + else + git -c core.sshCommand="/usr/bin/ssh -oStrictHostKeyChecking=no -i $SSH_ID_FILE"\ + push --force $SSH_REMOTE_NAME $1 + curl -vv --location --request \ + POST "https://deploy.batsense.net/api/v1/update"\ + --header 'Content-Type: application/json' \ + --data-raw "{ \"secret\": \"$LIBREPAGES_DEPLOY_SECRET\", \"branch\": \"$1\" }" + fi +} + +if (( "$#" < 1 )) +then + help + exit -1 +fi + + +if match_arg $1 '-i' '--init' +then + if (( "$#" < 2 )) + then + help + exit -1 + fi + set_ssh_remote + write_ssh "$2" +elif match_arg $1 '-c' '--clean' +then + clean +elif match_arg $1 '-p' '--publish' +then + write_to_branch $2 $3 $4 +elif match_arg $1 '-d' '--deploy' +then + if (( "$#" < 2 )) + then + help + exit -1 + fi + write_to_branch $2 $3 + deploy $2 + clean +elif match_arg $1 '-h' '--help' +then + help +else + help +fi diff --git a/scripts/lib.sh b/scripts/lib.sh new file mode 100755 index 0000000..da0b409 --- /dev/null +++ b/scripts/lib.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Copyright © 2021 Aravinth Manivannan +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +check_arg(){ + if [ -z $1 ] + then + help + exit 1 + fi +} + +match_arg() { + if [ $1 == $2 ] || [ $1 == $3 ] + then + return 0 + else + return 1 + fi +}