Not everyone likes subversion. If you use Git to manage WordPress plugin development, keeping your Git repo and the WordPress.org SVN repo in sync is tedious. Luckily, we can use TravisCI deployment provider to automate SVN deployment after tests.
Prerequisites
You need these before moving on:
- GitHub account
- TravisCI account
- Plugin source code
- WordPress.org plugin SVN repo (You get this after plugin review approval.)
First Push to GitHub
In order to use TravisCI, we have to host the plugin repository on GitHub.
First, create a new repository on GitHub by going to this page and filling in the repository name.
Then, we are going to commit all plugin files into Git and push it to this GitHub repository. Remember to replace the remote URL with yours.
$ cd /path/to/plugin/directory $ git init $ git add -A $ git commit -m "first commit" $ git remote add origin https://github.com/TangRufus/tutsplus-dpl-demo.git $ git push -u origin master
Connecting TravisCI
Connect your GitHub repository with TravisCI by going to your TravisCI account page and switching on your repository. Click Sync account in the upper right corner if your newly created repository doesn’t show up in the list.
You’re all set. Every time you push new commits or someone makes pull requests to GitHub, it will trigger a build on TravisCI.
First Build on TravisCI
TravisCI uses a YAML file named .travis.yml
in the root of your repository to customize the builds. Learn more from the build customizing document to see how you can control the build lifecycle.
This is a basic configuration file that instructs TravisCI to run builds on PHP 7.0
and 7.1
. Since testing is out of the scope of this tutorial, I replaced the actual test commands with echo 'Tested'
.
# .travis.yml language: php sudo: false php: - 7.0 - 7.1 script: # Run your tests here. - echo 'Tested'
Commit this file and push it to GitHub. TravisCI builds will be triggered automatically.
$ git add .travis.yml $ git ci -am "Add .travis.yml" $ git push origin master
Adding Deployment Provider Configuration
Deployment providers run if the tests passed and pre-defined conditionals (the on
section) are met. TravisCI provides nearly 40 official deployment providers. Sadly, none of them support WordPress.org subversion repositories. Thus, I made my own custom provider. You can find it on GitHub and its pull request.
To use it, add these lines to the end of .travis.yml
.
before_deploy: - mkdir build - cp LICENSE build - cp README.txt build - cp remove-medium-cross-links.php build deploy: - provider: wordpress-plugin edge: source: TypistTech/dpl branch: add-wordpress-plugin-deployment on: php: 7.1 tags: true repo: TangRufus/tutsplus-dpl-demo slug: remove-medium-cross-links username: tangrufus password: $WORDPRESS_ORG_PASSWORD build_dir: build
Configuration Explanation
before_deploy
The before_deploy
section copies three files into the build
directory which is to be checked into the WordPress.org subversion repository. In the real world, this is where you want to run gulp
or grunt
tasks to prepare the production-ready plugin.
Don’t copy test files or any unnecessary files into build
as the whole build
directory is released to users, and users don’t need your test files.
provider
and edge
We tell TravisCI to install my provider from the add-wordpress-plugin-deployment
branch https://github.com/TypistTech/dpl. Once the pull request has been merged, the edge
part is unnecessary.
on
The on
section controls whether a deployment should be performed. Deployment is triggered only when all requirements are met.
In the above example, we deploy to WordPress.org only when:
- it’s a PHP
7.1
build - it’s a tagged commit
- it’s triggered by the TangRufus/tutsplus-dpl-demo repo (forks and pull requests would not trigger deployment)
slug
The plugin’s slug.
If your plugin’s URL is https://wordpress.org/plugins/my-awesome-plugin/, then my-awesome-plugin
is the plugin’s slug.
username
Your WordPress.org account username with which you submitted the plugin for review approval.
password
The password of the WordPress.org account. Never save this password in the .travis.yml
in plain text!
In the above example, we use the $WORDPRESS_ORG_PASSWORD
environment variable, which can be set on the TravisCI web dashboard. Choose Settings from the cog menu, and click on Add in the Environment Variables section. Never enable the “Display value in build log” option!
build_dir
Everything in this directory will be committed to the WordPress.org subversion repository, i.e. will be included in the downloadable zip file.
We set this to build
because we have copied plugin files into build
during before_deploy
.
Tagging
Assume that we have fixed some bugs and are ready to publish a new version to WordPress.org.
These commands commit the changes to the master
branch but do not trigger a deployment:
$ git add -A $ git commit -am "Bug fix" $ git push origin master
Only tagged commits trigger deployment:
$ git tag -a 1.0.17 -m "Version bump 1.0.17" $ git push origin master --tags
Results
Head back to TravisCI and open the PHP 7.1
build log. You should see a deployment is logged.
Building dpl gem locally with source TypistTech/dpl and branch add-wordpress-plugin-deployment Installing deploy dependencies !!! WordPress Plugin support is experimental !!! Preparing deploy Finding configuration for WordPress plugin deployment... Slug: remove-medium-cross-links Username: tangrufus Password found Build Directory: build Assets Directory: not found Validating configuration for WordPress plugin deployment... Configuration looks good Going to deloy tag: 1.0.17 Cleaning up git repository with `git stash --all`. If you need build artifacts for deployment, set `deploy.skip_cleanup: true`. See https://docs.travis-ci.com/user/deployment/#Uploading-Files. /usr/lib/git-core/git-stash: 186: /usr/lib/git-core/git-stash: cannot create /home/travis/build/TangRufus/tutsplus-dpl-demo/.git/logs/refs/stash: Directory nonexistent Deploying application Checking out https://plugins.svn.wordpress.org/remove-medium-cross-links Clearing /tmp/d20170513-3291-1yh7vqo/trunk... Removing deleted files from subversion... D /tmp/d20170513-3291-1yh7vqo/trunk Temporary removing trunk and assets(if assets_dir is set) Deleting tmp/d20170513-3291-1yh7vqo/trunk Committed revision 1656616. Copying build to /tmp/d20170513-3291-1yh7vqo/trunk... Copying /tmp/d20170513-3291-1yh7vqo/trunk to /tmp/d20170513-3291-1yh7vqo/tags/1.0.17... Adding new files to subversion... A /tmp/d20170513-3291-1yh7vqo/trunk A /tmp/d20170513-3291-1yh7vqo/trunk/LICENSE A /tmp/d20170513-3291-1yh7vqo/trunk/README.txt A /tmp/d20170513-3291-1yh7vqo/trunk/remove-medium-cross-links.php A /tmp/d20170513-3291-1yh7vqo/tags/1.0.17 A /tmp/d20170513-3291-1yh7vqo/tags/1.0.17/LICENSE A /tmp/d20170513-3291-1yh7vqo/tags/1.0.17/README.txt A /tmp/d20170513-3291-1yh7vqo/tags/1.0.17/remove-medium-cross-links.php Committing 1.0.17 Adding tmp/d20170513-3291-1yh7vqo/tags/1.0.17 Adding tmp/d20170513-3291-1yh7vqo/tags/1.0.17/LICENSE Adding tmp/d20170513-3291-1yh7vqo/tags/1.0.17/README.txt Adding tmp/d20170513-3291-1yh7vqo/tags/1.0.17/remove-medium-cross-links.php Adding tmp/d20170513-3291-1yh7vqo/trunk Adding tmp/d20170513-3291-1yh7vqo/trunk/LICENSE Adding tmp/d20170513-3291-1yh7vqo/trunk/README.txt Adding tmp/d20170513-3291-1yh7vqo/trunk/remove-medium-cross-links.php Transmitting file data ...... Committed revision 1656617.
And on the WordPress.org trac (https://plugins.trac.wordpress.org/browser/
Caveats
svn commit
Twice
Since TravisCI ships with an old version of subversion
which doesn’t play well with subdirectories, I do svn commit
twice.
The first svn commit
removes everything inside trunk
. The second svn commit
copies everything from build_dir
to trunk
.
Experimental
This provider is still experimental and is not merged to TravisCI’s official repo yet. You can keep track of TravisCI’s feedback on its pull request.
Using edge
doesn’t merge my branch into the upstream master. There is a chance that my branch is behind the official repo. When it happens, you can fork my branch and rebase it, and then change source
in .travis.yml
to your GitHub repository.
Wrapping Up
To use this deployment provider:
- Host the plugin repository on GitHub.
- Connect GitHub and TravisCI.
- Add the configuration to
.travis.yml
. - Push a tag.
I hope all the above helps you deploy plugins to WordPress.org faster.
WordPress has an incredibly active economy. There are themes, plugins, libraries, and many other products that help you build out your site and project. The open-source nature of the platform also makes it a great option for you to improve your programming skills. Whatever the case, you can see everything we have available in the Envato Marketplace.
Thanks for reading!