From ca75e1a25dd956771f4b91c11801975828e863aa Mon Sep 17 00:00:00 2001 From: Erick Hitter <git-contrib@ethitter.com> Date: Sat, 13 Apr 2019 15:53:53 -0700 Subject: [PATCH] Port GitHub-Actions-based deploy workflow See https://github.com/10up/actions-wordpress/blob/598b1572d5024340f09d7efc083a65ebff3bcdef/dotorg-plugin-deploy/entrypoint.sh --- bin/deploy.sh | 193 ++++++++++++++++++++++++++++---------------------- 1 file changed, 109 insertions(+), 84 deletions(-) diff --git a/bin/deploy.sh b/bin/deploy.sh index df57b79..2a5e91c 100755 --- a/bin/deploy.sh +++ b/bin/deploy.sh @@ -1,103 +1,128 @@ #!/usr/bin/env bash -echo "Unfinished" 1>&2 -exit 1 - +## MIT License +## +## Copyright (c) 2019 Helen Hou-Sandi +## Copyright (c) 2019 Erick Hitter +## +## Permission is hereby granted, free of charge, to any person obtaining a copy +## of this software and associated documentation files (the "Software"), to deal +## in the Software without restriction, including without limitation the rights +## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +## copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all +## copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +## SOFTWARE. + +# Note that this does not use pipefail +# because if the grep later doesn't match any deleted files, +# which is likely the majority case, +# it does not exit with a 0, and I only care about the final exit. +set -eo + +# Ensure SVN username and password are set +# IMPORTANT: while secrets are encrypted and not viewable in the GitHub UI, +# they are by necessity provided as plaintext in the context of the Action, +# so do not echo or use debug mode unless you want your secrets exposed! if [[ -z "$CI" ]]; then echo "Script is only to be run by GitLab CI" 1>&2 exit 1 fi +if [[ -z "$WP_ORG_USERNAME" ]]; then + echo "WordPress.org password not set" 1>&2 + exit 1 +fi + if [[ -z "$WP_ORG_PASSWORD" ]]; then echo "WordPress.org password not set" 1>&2 exit 1 fi +if [[ -z "$PLUGIN_SLUG" ]]; then + echo "Plugin's SVN slug is not set" 1>&2 + exit 1 +fi + +if [[ -z "$PLUGIN_VERSION" ]]; then + echo "Plugin's version is not set" 1>&2 + exit 1 +fi + if [[ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" || "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "master" ]]; then echo "Build branch is required and must be 'master'" 1>&2 exit 0 fi -WP_ORG_USERNAME="ethitter" -PLUGIN="view-all-posts-pages" -PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" -PLUGIN_BUILDS_PATH="$PROJECT_ROOT/builds" -#PLUGIN_BUILD_CONFIG_PATH="$PROJECT_ROOT/build-cfg" -#VERSION=$(/usr/bin/php -f "$PLUGIN_BUILD_CONFIG_PATH/utils/get_plugin_version.php" "$PROJECT_ROOT" "$PLUGIN") -VERSION=grep -o "(^|\s|\*)+Version:\s+([0-9]|\.)*(?=\s|$)" "$PROJECT_ROOT/$PLUGIN/$PLUGIN.php" -#ZIP_FILE="$PLUGIN_BUILDS_PATH/$PLUGIN-$VERSION.zip" - -# Ensure the zip file for the current version has been built -#if [ ! -f "$ZIP_FILE" ]; then -# echo "Built zip file $ZIP_FILE does not exist" 1>&2 -# exit 1 -#fi - -# Check if the tag exists for the version we are building -TAG=$(svn ls "https://plugins.svn.wordpress.org/$PLUGIN/tags/$VERSION") -error=$? -if [ $error == 0 ]; then - # Tag exists, don't deploy - echo "Tag already exists for version $VERSION, aborting deployment" - exit 1 +echo "ℹ︎ PLUGIN_SLUG is $PLUGIN_SLUG" +echo "ℹ︎ PLUGIN_VERSION is $PLUGIN_VERSION" + +SVN_URL="https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/" +SVN_DIR="/tmp/svn-${PLUGIN_SLUG}" +TMP_DIR="/tmp/git-archive" + +# Checkout just trunk for efficiency +# Tagging will be handled on the SVN level +echo "➤ Checking out .org repository..." +svn checkout --depth immediates "$SVN_URL" "$SVN_DIR" +cd "$SVN_DIR" +svn update --set-depth infinity trunk + +echo "➤ Copying files..." +cd "$CI_BUILDS_DIR" + +git config --global user.email "git-contrib+ci@ethitter.com" +git config --global user.name "Erick Hitter (GitLab CI)" + +# If there's no .gitattributes file, write a default one into place +if [[ ! -e "$CI_BUILDS_DIR/.gitattributes" ]]; then + cat > "$CI_BUILDS_DIR/.gitattributes" <<-EOL + /.gitattributes export-ignore + /.gitignore export-ignore + /.github export-ignore + EOL + + # Ensure we are in the $CI_BUILDS_DIR directory, just in case + # The .gitattributes file has to be committed to be used + # Just don't push it to the origin repo :) + git add .gitattributes && git commit -m "Add .gitattributes file" fi -cd "$PLUGIN_BUILDS_PATH" -# Remove any unzipped dir so we start from scratch -rm -fR "$PLUGIN" -# Unzip the built plugin -#unzip -q -o "$ZIP_FILE" - -# Clean up any previous svn dir -rm -fR svn - -# Checkout the SVN repo -svn co -q "http://svn.wp-plugins.org/$PLUGIN" svn - -# Move out the trunk directory to a temp location -mv svn/trunk ./svn-trunk -# Create trunk directory -mkdir svn/trunk -# Copy our new version of the plugin into trunk -rsync -r -p $PLUGIN/* svn/trunk - -# Copy all the .svn folders from the checked out copy of trunk to the new trunk. -# This is necessary as the Travis container runs Subversion 1.6 which has .svn dirs in every sub dir -cd svn/trunk/ -TARGET=$(pwd) -cd ../../svn-trunk/ - -# Find all .svn dirs in sub dirs -SVN_DIRS=`find . -type d -iname .svn` - -for SVN_DIR in $SVN_DIRS; do - SOURCE_DIR=${SVN_DIR/.} - TARGET_DIR=$TARGET${SOURCE_DIR/.svn} - TARGET_SVN_DIR=$TARGET${SVN_DIR/.} - if [ -d "$TARGET_DIR" ]; then - # Copy the .svn directory to trunk dir - cp -r $SVN_DIR $TARGET_SVN_DIR - fi -done - -# Back to builds dir -cd ../ - -# Remove checked out dir -rm -fR svn-trunk - -# Add new version tag -#mkdir svn/tags/$VERSION -#rsync -r -p $PLUGIN/* svn/tags/$VERSION - -# Add new files to SVN -svn stat svn | grep '^?' | awk '{print $2}' | xargs -I x svn add x@ -# Remove deleted files from SVN -svn stat svn | grep '^!' | awk '{print $2}' | xargs -I x svn rm --force x@ -svn stat svn - -# Commit to SVN -#svn ci --no-auth-cache --username $WP_ORG_USERNAME --password $WP_ORG_PASSWORD svn -m "Deploy version $VERSION" - -# Remove SVN temp dir -rm -fR svn +# This will exclude everything in the .gitattributes file with the export-ignore flag +git archive HEAD | tar x --directory="$TMP_DIR" + +cd "$SVN_DIR" + +# Copy from clean copy to /trunk +# The --delete flag will delete anything in destination that no longer exists in source +rsync -r "$TMP_DIR/" trunk/ --delete + +# Add everything and commit to SVN +# The force flag ensures we recurse into subdirectories even if they are already added +# Suppress stdout in favor of svn status later for readability +echo "➤ Preparing files..." +svn add . --force > /dev/null + +# SVN delete all deleted files +# Also suppress stdout here +svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm % > /dev/null + +# Copy tag locally to make this a single commit +echo "➤ Copying tag..." +svn cp "trunk" "tags/$PLUGIN_VERSION" + +svn status + +echo "➤ Committing files..." +svn commit -m "Update to version $PLUGIN_VERSION from GitLab ($CI_PROJECT_URL)" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" + +echo "✓ Plugin deployed!" -- GitLab