From 869281d81f6c190efaaf4ff7b85eb591b07df286 Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 19 Aug 2021 16:48:35 +0300 Subject: [PATCH 1/3] Add docker --- .env.example | 28 +++++++ .gitignore | 2 + docker-compose.yml | 119 ++++++++++++++++++++++++++ docker/Dockerfile_wp | 155 ++++++++++++++++++++++++++++++++++ docker/wait-for-it.sh | 182 ++++++++++++++++++++++++++++++++++++++++ docker/wp-entrypoint.sh | 45 ++++++++++ 6 files changed, 531 insertions(+) create mode 100644 .env.example create mode 100644 docker-compose.yml create mode 100644 docker/Dockerfile_wp create mode 100644 docker/wait-for-it.sh create mode 100644 docker/wp-entrypoint.sh diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..3047cbcb8 --- /dev/null +++ b/.env.example @@ -0,0 +1,28 @@ +PLUGIN_NAME=woocommerce-paypal-payments +BASE_PATH=./ +PROJECT_MOUNT_PATH=/var/www/html/wp-content/plugins/woocommerce-paypal-payments +DOCROOT_PATH=/var/www/html +BUILD_ROOT_PATH=/app/ +PROJECT_NAME=inpsyde_woocommerce-paypal-payments +HOST_IP_ADDRESS=172.17.0.1 + +WP_DOMAIN=wc-pp.myhost +WP_TITLE="WooCommerce PayPal Payments" + +WP_VERSION=5.3 +WC_VERSION=4.7.0 + +PHP_BUILD_VERSION=7.1 +PHP_TEST_VERSION=7.1 +PHP_DEPS_VERSION=7.1 + +DB_ROOT_PASSWORD=root +DB_NAME=wordpress +DB_USER_NAME=wordpress +DB_USER_PASSWORD=J(P*@%OSJiaifN2 + +ADMIN_USER=admin +ADMIN_PASS=admin +ADMIN_EMAIL=me@my.com + +COMPOSER_MEMORY_LIMIT=1.5G diff --git a/.gitignore b/.gitignore index 9f905d643..a0fa47240 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ modules/ppcp-button/assets/* modules/ppcp-wc-gateway/assets/* .idea/ *.zip +.env +auth.json diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..03def9356 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,119 @@ +version: '3.4' +services: + wp_dev: + build: + context: ./ + dockerfile: docker/Dockerfile_wp + target: dev + args: + PHP_BUILD_VERSION: $PHP_BUILD_VERSION + PHP_TEST_VERSION: $PHP_TEST_VERSION + PHP_DEPS_VERSION: $PHP_DEPS_VERSION + PROJECT_MOUNT_PATH: $PROJECT_MOUNT_PATH + BUILD_ROOT_PATH: $BUILD_ROOT_PATH + DOCROOT_PATH: $DOCROOT_PATH + WP_DOMAIN: ${WP_DOMAIN} + WP_VERSION: $WP_VERSION + container_name: "${PROJECT_NAME}_wp_dev" + depends_on: + - db + restart: unless-stopped + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_NAME: $DB_NAME + WORDPRESS_DB_USER: $DB_USER_NAME + WORDPRESS_DB_PASSWORD: $DB_USER_PASSWORD + WORDPRESS_DEBUG: 1 + DOCROOT_PATH: ${DOCROOT_PATH} + PLUGIN_NAME: ${PLUGIN_NAME} + ADMIN_USER: ${ADMIN_USER} + ADMIN_PASS: ${ADMIN_PASS} + ADMIN_EMAIL: ${ADMIN_EMAIL} + WP_DOMAIN: ${WP_DOMAIN} + WP_TITLE: ${WP_TITLE} + WC_VERSION: $WC_VERSION + + volumes: + - wordpress:${DOCROOT_PATH} + - ${BASE_PATH}:${PROJECT_MOUNT_PATH} + ports: + - 80:80 + + db: + image: mariadb:latest + container_name: "${PROJECT_NAME}_db" + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD + MYSQL_DATABASE: $DB_NAME + MYSQL_USER: $DB_USER_NAME + MYSQL_PASSWORD: $DB_USER_PASSWORD + ports: + - 3306:3306 + volumes: + - db:/var/lib/mysql + + db_admin: + image: phpmyadmin/phpmyadmin:latest + container_name: "${PROJECT_NAME}_db_admin" + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD + depends_on: + - db + ports: + - 1234:80 + # volumes: + # - db_admin + + composer: + build: + context: ./ + dockerfile: docker/Dockerfile_wp + target: composer + args: + PHP_DEPS_VERSION: $PHP_DEPS_VERSION + BUILD_ROOT_PATH: $BUILD_ROOT_PATH + container_name: "${PROJECT_NAME}_composer" + working_dir: ${BUILD_ROOT_PATH} + volumes: + - ${BASE_PATH}:${BUILD_ROOT_PATH} + environment: + - COMPOSER_MEMORY_LIMIT=${COMPOSER_MEMORY_LIMIT} + + build: + build: + context: ./ + dockerfile: docker/Dockerfile_wp + target: build + args: + PHP_DEPS_VERSION: $PHP_DEPS_VERSION + PHP_BUILD_VERSION: $PHP_BUILD_VERSION + BUILD_ROOT_PATH: $BUILD_ROOT_PATH + WP_VERSION: $WP_VERSION + container_name: "${PROJECT_NAME}_build" + working_dir: ${BUILD_ROOT_PATH} + volumes: + - ${BASE_PATH}:${BUILD_ROOT_PATH} + + test: + extra_hosts: + - "host.docker.internal:${HOST_IP_ADDRESS}" + build: + context: ./ + dockerfile: docker/Dockerfile_wp + target: test + args: + PHP_DEPS_VERSION: $PHP_DEPS_VERSION + BUILD_ROOT_PATH: $BUILD_ROOT_PATH + PHP_BUILD_VERSION: $PHP_BUILD_VERSION + PHP_TEST_VERSION: $PHP_TEST_VERSION + container_name: "${PROJECT_NAME}_test" + working_dir: ${BUILD_ROOT_PATH} + volumes: + - ${BASE_PATH}:${BUILD_ROOT_PATH} + +volumes: + wordpress: + db: + db_admin: diff --git a/docker/Dockerfile_wp b/docker/Dockerfile_wp new file mode 100644 index 000000000..27bde5660 --- /dev/null +++ b/docker/Dockerfile_wp @@ -0,0 +1,155 @@ +ARG PHP_BUILD_VERSION +ARG PHP_TEST_VERSION +ARG PHP_DEPS_VERSION +ARG WP_VERSION + +# Composer on correct PHP version +FROM php:${PHP_DEPS_VERSION}-cli as composer + +ARG BUILD_ROOT_PATH + +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +RUN echo 'memory_limit = 128M' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini; + +RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \ + php composer-setup.php --install-dir=/usr/bin --filename=composer && \ + php -r "unlink('composer-setup.php');" + +RUN apt-get update +RUN apt-get install -y \ + ssh \ + zip \ + unzip \ + curl \ + git \ + # These are for extensions + zlib1g-dev \ + libicu-dev + +RUN mkdir -p ~/.ssh +RUN ssh-keyscan -H github.com >> ~/.ssh/known_hosts + +RUN docker-php-ext-install intl json && \ + docker-php-ext-enable intl json + +WORKDIR ${BUILD_ROOT_PATH} + +# Composer on correct PHP version +FROM php:${PHP_BUILD_VERSION}-cli as build + +ARG BUILD_ROOT_PATH + +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +RUN echo 'memory_limit = 256M' >> /usr/local/etc/php/conf.d/docker-php-memlimit.ini; + +RUN apt-get update +RUN apt-get install -y gnupg apt-transport-https ca-certificates + +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + +RUN apt-get update +RUN apt-get install -y \ + ssh \ + zip \ + unzip \ + curl \ + git \ + yarn \ + # These are for extensions + zlib1g-dev \ + libicu-dev \ + g++ \ + # For installing things from URL + wget + +RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \ + php composer-setup.php --install-dir=/usr/bin --filename=composer --version=1.10.19 && \ + php -r "unlink('composer-setup.php');" + +RUN mkdir -p ~/.ssh +RUN ssh-keyscan -H github.com >> ~/.ssh/known_hosts + +RUN docker-php-ext-install intl json && \ + docker-php-ext-enable intl json + +# Install Node +RUN curl -sL https://deb.nodesource.com/setup_15.x | bash - +RUN apt-get install -y nodejs + +WORKDIR ${BUILD_ROOT_PATH} +COPY . ./ + + +FROM php:${PHP_TEST_VERSION}-cli as test + +ARG BUILD_ROOT_PATH + +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" +RUN apt-get update +RUN apt-get install -y \ + # These are for extensions + zlib1g-dev \ + libicu-dev \ + g++ +RUN pecl install xdebug-2.6.1 +RUN docker-php-ext-install pcntl posix intl json + +WORKDIR ${BUILD_ROOT_PATH} +COPY --from=build ${BUILD_ROOT_PATH} ${BUILD_ROOT_PATH} + + +# Install PHP dev dependencies +FROM build as vendor-dev + +ARG BUILD_ROOT_PATH + +WORKDIR ${BUILD_ROOT_PATH} +COPY --from=build ${BUILD_ROOT_PATH} ${BUILD_ROOT_PATH} + +RUN composer config discard-changes true && composer install --no-dev --no-scripts + + +# WordPress for development +FROM wordpress:${WP_VERSION}-php${PHP_TEST_VERSION}-apache as dev + +ARG PROJECT_MOUNT_PATH +ARG BUILD_ROOT_PATH +ARG DOCROOT_PATH +ARG WP_DOMAIN + +COPY docker/wp-entrypoint.sh /usr/local/bin +COPY docker/wait-for-it.sh /usr/local/bin + +RUN chmod +x /usr/local/bin/wp-entrypoint.sh /usr/local/bin/wait-for-it.sh + +RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \ + && chmod +x wp-cli.phar \ + && mv wp-cli.phar /usr/local/bin/wp +RUN sed -i "s|#ServerName www.example.com|ServerName ${WP_DOMAIN}|" /etc/apache2/sites-available/*.conf +RUN sed -i "s|#ServerName www.example.com|ServerName ${WP_DOMAIN}|" /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf + + +RUN apt-get update +RUN apt-get install -y \ + zip \ + unzip \ + curl \ + # These are for extensions + zlib1g-dev \ + libicu-dev \ + g++ + +RUN docker-php-ext-install pcntl posix intl json + +RUN apt-get remove -y \ + # These are for extensions + zlib1g-dev \ + libicu-dev \ + g++ + +WORKDIR ${DOCROOT_PATH} +COPY --from=vendor-dev ${BUILD_ROOT_PATH} ${PROJECT_MOUNT_PATH} + +ENTRYPOINT ["wp-entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/docker/wait-for-it.sh b/docker/wait-for-it.sh new file mode 100644 index 000000000..5e8679e54 --- /dev/null +++ b/docker/wait-for-it.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi diff --git a/docker/wp-entrypoint.sh b/docker/wp-entrypoint.sh new file mode 100644 index 000000000..0b522cf07 --- /dev/null +++ b/docker/wp-entrypoint.sh @@ -0,0 +1,45 @@ +#!/bin/bash +set -e + +if wait-for-it.sh "${WORDPRESS_DB_HOST}" -t 60; then + docker-entrypoint.sh apache2 -v + + wp core multisite-install \ + --allow-root \ + --title="${WP_TITLE}" \ + --admin_user="${ADMIN_USER}" \ + --admin_password="${ADMIN_PASS}" \ + --url="${WP_DOMAIN}" \ + --admin_email="${ADMIN_EMAIL}" \ + --skip-email + + cat << 'EOF' > "${DOCROOT_PATH}/.htaccess" +RewriteEngine On +RewriteBase / +RewriteRule ^index\.php$ - [L] + +RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L] + +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] +RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L] +RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L] +RewriteRule . index.php [L] +EOF + + wp site create \ + --allow-root \ + --slug="de" \ + || true # allow failure if already exists + + wp plugin is-installed akismet --allow-root && wp plugin uninstall akismet --allow-root --path="${DOCROOT_PATH}" + wp plugin is-installed hello --allow-root && wp plugin uninstall hello --allow-root --path="${DOCROOT_PATH}" + + wp plugin install woocommerce --version="${WC_VERSION}" --allow-root --path="${DOCROOT_PATH}" \ + && wp plugin activate woocommerce --network --allow-root --path="${DOCROOT_PATH}" + + wp plugin activate "${PLUGIN_NAME}" --network --allow-root --path="${DOCROOT_PATH}" +fi + +exec "$@" From 6aa0f17bca98b41dfd6010923a335041fb1d7bfd Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 19 Aug 2021 17:49:54 +0300 Subject: [PATCH 2/3] Add dockers docs and yarn commands --- README.md | 22 ++++++++++++++++++++++ package.json | 13 +++++++++++++ 2 files changed, 35 insertions(+) diff --git a/README.md b/README.md index 8d7c51260..79213f000 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,28 @@ PayPal's latest complete payments processing solution. Accept PayPal, Pay Later, 2. `$ ./vendor/bin/phpunit` 3. `$ ./vendor/bin/phpcs` +### Docker + +You can also use the Docker environment which includes WP, WC and all developments tools. + +0. Install Docker and Docker Compose. +1. `$ cp .env.example .env` and edit the configuration in the `.env` file if needed. +2. `$ yarn run docker:build` (or copy the commands from [package.json](/package.json) if you do not have `yarn`). +3. `$ yarn docker:install` +4. `$ yarn docker:start` +5. Add `127.0.0.1 wc-pp.myhost` to your `hosts` file and open http://wc-pp.myhost (the default value of `WP_DOMAIN` in `.env`). + +Tests and code style: +- `$ yarn run docker:test` +- `$ yarn run docker:lint` + +After some changes in `.env` (such as PHP, WP versions) you may need to rebuild the Docker image: + +1. `$ yarn run docker:destroy` (all data will be lost) +2. `$ yarn run docker:build` + +See [package.json](/package.json) for other useful commands. + ## Preparation for wordpress.org release If you want to deploy a new version, you need to do some preparation: diff --git a/package.json b/package.json index eabea103c..0813e371c 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,19 @@ "build:modules": "yarn run build:modules:ppcp-button && yarn build:modules:ppcp-wc-gateway", "build:dev": "yarn run install:modules && yarn run build:modules", + "docker:build": "docker-compose build", + "docker:start": "docker-compose up -d wp_dev", + "docker:stop": "docker-compose down", + "docker:destroy": "docker-compose down -v", + "docker:logs": "docker-compose logs", + "docker:shell": "docker-compose run --rm wp_dev bash", + "docker:install": "docker-compose run --rm composer composer install && yarn run docker:build-js", + "docker:build-js": "docker-compose run --rm build yarn run build:dev", + "docker:composer-update": "docker-compose run --rm composer composer update", + "docker:test": "docker-compose run --rm test vendor/bin/phpunit", + "docker:lint": "docker-compose run --rm test vendor/bin/phpcs --parallel=8 -n -s", + "docker:fix-lint": "docker-compose run --rm test vendor/bin/phpcbf", + "prebuild": "rm -rf ./vendor", "build": "composer install --no-dev && npm run build:dev && npm run archive", "prearchive": "rm -rf $npm_package_name.zip", From 6dc71e439f479c85e411e414bc1958406e7ffcad Mon Sep 17 00:00:00 2001 From: Alex P Date: Thu, 19 Aug 2021 18:49:00 +0300 Subject: [PATCH 3/3] Delete docker files from release package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0813e371c..ad02506a6 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "prearchive": "rm -rf $npm_package_name.zip", "archive": "zip -r $npm_package_name.zip . -x **.git/\\* **node_modules/\\*", "postarchive": "npm run archive:cleanup && rm -rf $npm_package_name && unzip $npm_package_name.zip -d $npm_package_name && rm $npm_package_name.zip && zip -r $npm_package_name.zip $npm_package_name && rm -rf $npm_package_name", - "archive:cleanup": "zip -d $npm_package_name.zip tests/\\* .github/\\* wordpress_org_assets/\\* \\*.DS_Store README.md .gitattributes .gitignore .travis.yml composer.json composer.lock package.json package-lock.json patchwork.json yarn.lock phpunit.xml.dist .phpunit.result.cache phpcs.xml.dist modules/ppcp-button/.babelrc modules/ppcp-button/package.json modules/ppcp-button/webpack.config.js modules/ppcp-button/yarn.lock vendor/\\*/.idea/\\* vendor/\\*/.gitignore vendor/\\*/.gitattributes vendor/\\*/.travis.yml" + "archive:cleanup": "zip -d $npm_package_name.zip .env* docker/\\* docker-compose.yml tests/\\* .github/\\* wordpress_org_assets/\\* \\*.DS_Store README.md .gitattributes .gitignore .travis.yml composer.json composer.lock package.json package-lock.json patchwork.json yarn.lock phpunit.xml.dist .phpunit.result.cache phpcs.xml.dist modules/ppcp-button/.babelrc modules/ppcp-button/package.json modules/ppcp-button/webpack.config.js modules/ppcp-button/yarn.lock vendor/\\*/.idea/\\* vendor/\\*/.gitignore vendor/\\*/.gitattributes vendor/\\*/.travis.yml" }, "config": { "wp_org_slug": "woocommerce-paypal-payments"