diff --git a/.gitignore b/.gitignore index e714e214fdff6d0877dca47e31a35a37f1b6eabc..71fc585c5a6b12f916a255359f6f0d1bd6a2748a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,10 +12,12 @@ _obj _test bin /.release/*+* +/.release/*.tgz +/.release/*.patch +/.release/*.migrate /_live*/ /VERSION - # Architecture specific extensions/prefixes *.[568vq] [568vq].out diff --git a/cleanup b/cleanup index 110659ed8784384ed2cefe41e83d3557b45917f8..bb084a9d0389bd3e4ed2de82c57f056669408919 100755 --- a/cleanup +++ b/cleanup @@ -1,67 +1,64 @@ #!/bin/bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } +warn() { echo "$@" >&2; } +die() { warn "$@"; exit 1; } main () { - if test -z $UNSAFE; then - die 'Operation is unsafe, set UNSAFE=1 before run this script' - fi + if test -z $UNSAFE; then + die 'Operation is unsafe, set UNSAFE=1 before run this script' + fi - if test -z $1; then - die 'Pass version as argument' - fi + if test -z $1; then + die 'Pass version as argument' + fi - real_last_version=$(last_version) + real_last_version=$(last_version) - arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":") + arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":") - if test -z $arg_version_line; then - die 'Invalid version passed' - fi + if test -z $arg_version_line; then + die 'Invalid version passed' + fi - last_version_line=$(list_versions | grep -n "$real_last_version" | awk '{print $1}' FS=":") + last_version_line=$(list_versions | grep -n "$real_last_version" | awk '{print $1}' FS=":") - versions_to_delete=$(list_versions | awk "NR > $arg_version_line && NR <= $last_version_line") + versions_to_delete=$(list_versions | awk "NR > $arg_version_line && NR <= $last_version_line") - check_versions $versions_to_delete + check_versions $versions_to_delete - remove_versions $versions_to_delete || die "Failed to cleanup versions" - git reflog expire --expire=now --all - git gc --prune=now - git gc --aggressive --prune=now - if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then - git push -v -f --mirror --prune || die "Failed" - fi + remove_versions $versions_to_delete || die "Failed to cleanup versions" - ./release $real_last_version || die "Failed to re-release $real_last_version" + git tag --delete $real_last_version + git push origin :refs/tags/$real_last_version + + ./release $real_last_version || die "Failed to re-release $real_last_version" } check_versions () { - if test $# -lt 2; then - echo "Nothing to delete" - exit 0 - fi + if test $# -lt 2; then + warn "Nothing to delete" + exit 0 + fi } remove_versions () { - for var in "$@" - do - ./remove_version $var || die "Failed to delete $var" - done + for var in "$@" + do + ./remove_version $var || die "Failed to delete $var" + done } next_version() { - arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":") - next_version_line=$(($arg_version_line+1)) - list_versions | awk "NR==$next_version_line" + arg_version_line=$(list_versions | grep -n "$1" | awk '{print $1}' FS=":") + next_version_line=$(($arg_version_line+1)) + list_versions | awk "NR==$next_version_line" } last_version() { - list_versions | tail -n 1 + list_versions | tail -n 1 } list_versions() { - grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' + grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' } main "$@" diff --git a/cleanup_tags b/cleanup_tags deleted file mode 100755 index 73db672c87baab92f046c80500b924d69e8145f9..0000000000000000000000000000000000000000 --- a/cleanup_tags +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } - -if test -z $UNSAFE; then - die 'Operation is unsafe, set UNSAFE=1 before run this script' -fi - -leave=`cat migrate | grep '^VERSION' |awk '{print $2}' | xargs | sed 's/ /|/g'` -git tag | grep -vE "^$leave$" |xargs git tag -d -git filter-branch --tree-filter 'find . -name \*.tgz -exec rm -f {} \;' HEAD -git gc --prune=now && git gc --prune=now --aggressive -git push -v -f --mirror --prune diff --git a/deploy b/deploy index cf027ee03faa0b3dc1e688ad1508ff73b0770562..6aaa294b1a5e408cec6c0725acdac980a3cad007 100755 --- a/deploy +++ b/deploy @@ -1,21 +1,36 @@ #!/usr/bin/env bash +warn() { echo "$@" >&2; } +die() { warn "$@"; exit 1; } + test "$1" = '-n' && shift || RUN_TESTS=1 +test "$1" = '-l' && shift || LOCAL_ARTS=1 + +main() { + test -z "$LOCAL_ARTS" || sync_arts || die 'Failed' + + VERSION=${1:-$(< VERSION)} + + #... PUT DEPLOY INSTRUCTION FOR YOUR PROJECT HERE ... + find .release -type f -name '*+*' \ + -not -name "$(cat VERSION).*" \ + -not -name "$(cat _live/VERSION 2>/dev/null).*" \ + -delete + mkdir -p _live && + ln -sf ../.release _live/ && + cd _live && + narada-install --allow-downgrade --allow-restore "$VERSION" && + if test -n "$RUN_TESTS" -a -d t/devel; then + prove -r t/devel/ + fi && + if test -n "$RUN_TESTS" -a -d bin; then + prove -r bin/ + fi && + rm -f .backup/*+* +} -VERSION=${1:-$(< VERSION)} +sync_arts() { + local src="artifacts@artifacts.tgms.qarea.org:artifacts/$(basename $(pwd))/" + rsync -avz --ignore-existing "$src" .release/ +} -#... PUT DEPLOY INSTRUCTION FOR YOUR PROJECT HERE ... -find .release -type f -name '*+*' \ - -not -name "$(cat VERSION).*" \ - -not -name "$(cat _live/VERSION 2>/dev/null).*" \ - -delete -mkdir -p _live && -ln -sf ../.release _live/ && -cd _live && -narada-install --allow-downgrade --allow-restore "$VERSION" && -if test -n "$RUN_TESTS" -a -d t/devel; then - prove -r t/devel/ -fi && -if test -n "$RUN_TESTS" -a -d bin; then - prove -r bin/ -fi && -rm -f .backup/*+* +main $@ diff --git a/deploy_prod b/deploy_prod deleted file mode 100755 index f2e91cc95d2d36f50b99f22c6b7e204f43a46489..0000000000000000000000000000000000000000 --- a/deploy_prod +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } - -main() { - local addr=$DEPLOY_ADDR #should be prod - local path=$DEPLOY_PATH - - git checkout dev || die "Failed to checkout dev branch" - git pull origin dev || die "Failed to pull dev branch" - - go get -u -t ./... || die "Failed to update dependendcies" - ./build || die "Failed to build project" - - - last_ver=$(list_versions | tail -n1) - - if [ -n "$KEYPATH" ]; then - prod_ver=$(ssh -i $KEYPATH $addr cat "$path/VERSION") || die "Failed to fetch version from prod" - else - prod_ver=$(ssh $addr cat "$path/VERSION") || die "Failed to fetch version from prod" - fi - - echo "Production version" - echo $prod_ver - - ./cleanup $prod_ver || die "Failed to cleanup" - - git checkout master || die "Failed to checkout master branch" - - git merge --no-edit $last_ver || die "Failed to merge last version into master" - - ./deploy_server $last_ver || die "Failed to deploy $last_ver" - - git gc --aggressive - - if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then - git push origin --force --all || die "Failed" - git push origin --force --tags || die "Failed" - fi -} - -list_versions() { - grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' -} - -main "$@" diff --git a/deploy_server b/deploy_server deleted file mode 100755 index 441a14d69a9218d4fb130160c8ce9ddc5591aed9..0000000000000000000000000000000000000000 --- a/deploy_server +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } - -main() { - local addr=$DEPLOY_ADDR - local path=$DEPLOY_PATH - echo "Deploy addr '$addr'" - echo "Deploy path '$path'" - local v="${1:-$(< VERSION)}" - list_versions | grep -q -x -F "$v" || die "Version '$v' is not released yet" - - if [ -n "$KEYPATH" ]; then - rsync -avzR --size-only -e "ssh -i $KEYPATH" $(git ls-files .release/) "${addr}:${path}" && - ssh -o RequestTTY=yes -i $KEYPATH "$addr" bash -l -c \' "set -x; cd '$path' && narada-install '$v'" \' - else - rsync -avzR --size-only $(git ls-files .release/) "${addr}:${path}" && - ssh -o RequestTTY=yes "$addr" bash -l -c \' "set -x; cd '$path' && narada-install '$v'" \' - fi - } -list_versions() { - grep '^VERSION' migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' -} - -main "$@" diff --git a/release b/release index f7c562c58add67df95646a3f7bfc4edc63852592..296925169e66a1e7c4798343343e53123e2f94d1 100755 --- a/release +++ b/release @@ -1,53 +1,92 @@ #!/usr/bin/env bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } +warn() { echo "$@" >&2; } +die() { warn "$@"; exit 1; } main() { - if test $# -gt 1 -o "$1" = '-h' -o "$1" = '--help'; then - die 'Usage: ./release [-h|--help|-n|--major|--minor|--patch|<version>]' - fi + if test $# -gt 1 -o "$1" = '-h' -o "$1" = '--help'; then + die 'Usage: ./release [-h|--help|-n|--major|--minor|--patch|<version>]' + fi - if test $# -eq 1 -a "$1" = '-n'; then - shift - local test='' - elif test $# -eq 1; then - export RELEASE_TESTING=1 - local test='--test' - else - local test='--test' - fi - ./build $test || die 'Please fix the build first, then try again' + if test $# -eq 1 -a "$1" = '-n'; then + shift + local test='' + elif test $# -eq 1; then + export RELEASE_TESTING=1 + local test='--test' + else + local test='--test' + fi + ./build $test || die 'Please fix the build first, then try again' - if test $# -eq 0; then - release_project - release_migrate - else - workdir_is_clean || die 'Please commit all changes first, then try again' - local version="$(get_version "$1")" || die 'Failed' - if release_version "$version" migrate; then - git add migrate || die 'Failed' - echo "$version" > VERSION || die 'Failed' - release_project - release_migrate - git add ".release/${version}".* || die 'Failed' - git commit -m "Release $version [ci-skip]" || die 'Failed' - fi - git tag -a -m release "$version" || die 'Failed' - if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then - git push --follow-tags || die 'Failed' - fi - fi + if test $# -eq 0; then + release_project + release_migrate + else + workdir_is_clean || die 'Please commit all changes first, then try again' + # First get_version to check valid version + get_version "$1" || die 'Failed' + local version="$(get_version "$1")" + check_artifacts $version || die "Version $version exists in artifacts" + if release_version "$version" migrate; then + ssh artifacts@artifacts.tgms.qarea.org "mkdir -p artifacts/$(basename $(pwd))" + trap cleanup EXIT + git add migrate || die 'Failed' + echo "$version" > VERSION || die 'Failed' + release_project || die 'Failed' + release_migrate || die 'Failed' + move_artifacts || die 'Failed' + trap - EXIT + git commit -m "Release $version [ci-skip]" || die 'Failed' + fi + git tag -a -m release "$version" || die 'Failed' + if git branch -vv | grep -q '^\* \S\+\s\+\S\+ \[origin/'; then + git push --follow-tags || die 'Failed' + fi + fi +} + +check_artifacts() { + local addr='artifacts@artifacts.tgms.qarea.org' + local migrate_file="artifacts/$(basename $(pwd))/$1.migrate" + ssh "$addr" "test ! -f $migrate_file" +} + +move_artifacts() { + local path + path="artifacts@artifacts.tgms.qarea.org:artifacts/$(basename $(pwd))" + cd .release + rsync -avzR --size-only $(git ls-files .) "$path" && + cd .. && + copy_file_remote .release/$(< VERSION).patch && + copy_file_remote .release/$(< VERSION).tgz && + copy_file_remote .release/$(< VERSION).migrate || die 'Failed' +} + +copy_file_remote() { + if test -f $1; then + echo 'Copying ' $1 + local path + path=artifacts/$(basename $(pwd)) + scp $1 artifacts@artifacts.tgms.qarea.org:$path/. || die 'Failed' + fi +} + +cleanup() { + git checkout HEAD migrate + test -f .release/$(< VERSION).patch && rm .release/$(< VERSION).patch + test -f .release/$(< VERSION).tgz && rm .release/$(< VERSION).tgz + test -f .release/$(< VERSION).migrate && rm .release/$(< VERSION).migrate } release_project() { - #... PUT RELEASE INSTRUCTION FOR YOUR PROJECT FILES HERE ... - local prev_version - if list_versions | grep -q -x -F -f VERSION; then - prev_version=$(list_versions | grep -B 1 -x -F -f VERSION | head -n 1) - else - prev_version=$(list_versions | tail -n 1) - fi - git diff --name-only --binary "$prev_version" | + #... PUT RELEASE INSTRUCTION FOR YOUR PROJECT FILES HERE ... + local prev_version + if list_versions | grep -q -x -F -f VERSION; then + prev_version=$(list_versions | grep -B 1 -x -F -f VERSION | head -n 1) + else + prev_version=$(list_versions | tail -n 1) + fi + git diff --name-only --binary "$prev_version" | perl -MPath::Tiny -ne ' BEGIN { $skip = join q{|}, map { s/\A\s+//; s/\s+\z//; qr/$_/ms } grep { !/\A\s*(?:#.*)?\z/ms } split "\n", @@ -55,52 +94,52 @@ release_project() { chomp; print "$_\0" if !/\A(?:$skip)\z/ms; ' | xargs -0 -r git diff --binary "$prev_version" -- > .release/$(< VERSION).patch - test -s .release/$(< VERSION).patch || rm .release/$(< VERSION).patch - test ! -d bin/ || GZIP=-1 tar czf .release/$(< VERSION).tgz bin/ + test -s .release/$(< VERSION).patch || rm .release/$(< VERSION).patch + test ! -d bin/ || GZIP=-1 tar czf .release/$(< VERSION).tgz bin/ } release_migrate() { - local version="$(< VERSION)" - local migrate=".release/${version}.migrate" - cp migrate "$migrate" - list_versions | grep -q -x -F -f VERSION || release_version "$version" "$migrate" + local version="$(< VERSION)" + local migrate=".release/${version}.migrate" + cp migrate "$migrate" + list_versions | grep -q -x -F -f VERSION || release_version "$version" "$migrate" } release_version() { list_versions "$2" | grep -q -x -F "$1" && return 0 - echo -ne "\nrestart mailingms\n" >> "$2" + echo -ne "\nrestart mailingms\n" >> "$2" echo -ne "\nINSTALL\nVERSION $1\n\n" >> "$2" } list_versions() { - grep '^VERSION' ${1:-migrate} | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' + grep '^VERSION' ${1:-migrate} | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' } workdir_is_clean() { - git update-index -q --refresh --unmerged >/dev/null - git diff-index --quiet HEAD + git update-index -q --refresh --unmerged >/dev/null + git diff-index --quiet HEAD } get_version() { - local new cur re - if test "$1" != '--major' -a "$1" != '--minor' -a "$1" != '--patch'; then - new="$1" - else - cur=$(list_versions | tail -n 1) - re='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/' - if test "$1" = '--major'; then - new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",1+$1,0,0 if '$re) - elif test "$1" = '--minor'; then - new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,1+$2,0 if '$re) - else - new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,$2,1+$3 if '$re) - fi - test -n "$new" || die "Unable to increment ${1:2} number in version '$cur'" - fi - echo "$new" | grep -q '^[0-9A-Za-z.+-]\+$' || die "Bad version '$new'" - git check-ref-format --allow-onelevel "$new" || die "Bad version '$new'" - git tag -l | grep -q -x -F "$new" && die "Version '$new' already exists" - echo "$new" + local new cur re + if test "$1" != '--major' -a "$1" != '--minor' -a "$1" != '--patch'; then + new="$1" + else + cur=$(list_versions | tail -n 1) + re='/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/' + if test "$1" = '--major'; then + new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",1+$1,0,0 if '$re) + elif test "$1" = '--minor'; then + new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,1+$2,0 if '$re) + else + new=$(echo "$cur" | perl -ne 'printf "%d.%d.%d\n",$1,$2,1+$3 if '$re) + fi + test -n "$new" || die "Unable to increment ${1:2} number in version '$cur'" + fi + echo "$new" | grep -q '^[0-9A-Za-z.+-]\+$' || die "Bad version '$new'" + git check-ref-format --allow-onelevel "$new" || die "Bad version '$new'" + git tag -l | grep -q -x -F "$new" && die "Version '$new' already exists" + echo "$new" } diff --git a/remove_version b/remove_version index fd0db0a280a8edce0094b0848066d7b8f8b1ac7d..9d624b632e231c62918f3cf8dc1ee86985cd60cd 100755 --- a/remove_version +++ b/remove_version @@ -1,45 +1,43 @@ #!/usr/bin/env bash -warn() { echo "$@" >&2; } -die() { warn "$@"; exit 1; } +warn() { echo "$@" >&2; } +die() { warn "$@"; exit 1; } main() { - test $# -ne 0 || die "Please pass VERSION to remove_version script" - check_version $1 || die 'Please commit all changes first, then try again' - workdir_is_clean || die 'Please commit all changes first, then try again' - remove_version_from_git $1 - remove_version_from_migrate $1 - git commit migrate -m "Remove VERSION $1 [ci-skip]" + test $# -ne 0 || die "Please pass VERSION to remove_version script" + check_version $1 || die 'Invalid version' + workdir_is_clean || die 'Please commit all changes first, then try again' + remove_version_from_migrate $1 + remove_version_from_artifacts $1 + git commit migrate -m "Remove VERSION $1 [ci-skip]" } - -remove_version_from_migrate() { - awk -v \ - search_version="VERSION $1" \ - '/^INSTALL/{f=$0; next} $0 ~search_version {f="";next} f { print f ; f=""} {print}' \ - migrate \ - | cat -s \ - > migrate.tmp - mv migrate.tmp migrate +remove_version_from_artifacts() { + local addr='artifacts@artifacts.tgms.qarea.org' + local base="artifacts/$(basename $(pwd))/$1" + ssh "$addr" "rm -f $base.migrate" || die "Failed to remove migrate file" + ssh "$addr" "rm -f $base.patch" || die "Failed to remove patch file" + ssh "$addr" "rm -f $base.tgz" || die "Failed to remove tgz file" } -remove_version_from_git() { - git filter-branch --force --index-filter \ - "git rm --cached --ignore-unmatch .release/$1*" \ - --prune-empty --tag-name-filter cat -- --all - - git tag --delete $1 - git push origin :refs/tags/$1 +remove_version_from_migrate() { + awk -v \ + search_version="VERSION $1" \ + '/^INSTALL/{f=$0; next} $0 ~search_version {f="";next} f { print f ; f=""} {print}' \ + migrate \ + | cat -s \ + > migrate.tmp + mv migrate.tmp migrate } check_version() { - grep "^VERSION $1$" migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' > /dev/null - test ${PIPESTATUS[0]} -eq 0 || die "Can't find VERSION $1 in migrate file" + grep "^VERSION $1$" migrate | sed 's/^VERSION\s\+\(\S\+\)\s*$/\1/' > /dev/null + test ${PIPESTATUS[0]} -eq 0 || die "Can't find VERSION $1 in migrate file" } workdir_is_clean() { - git update-index -q --refresh --unmerged >/dev/null - git diff-index --quiet HEAD + git update-index -q --refresh --unmerged >/dev/null + git diff-index --quiet HEAD } main "$@"