Symlinks: Upload to SFTP
In order to upload symlinks via SCP it’s enough to use the recursive mode by adding the -r
parameter:
scp -r
However, enabling the mode will also copy the content to which the symlink points. This is troublesome if we only want the symlinks to be copied, and it’s not possible to do it in a different way with SCP. Usually, this is solved by using rsync
:
rsync -avz -e ssh /scr-dir user@host:/dst-dir
Unfortunately, this method is very time consuming. Below you will find a description how to automate and speed it up with Buddy.
Solution 1: Local Script + Server Upload + Host Script
The first solution employs some simple scripts and a deployment action. First we need a script grab-links.sh
that will list all symlinks in the folder. The script will search the folder in recursive mode and create a file create-links.sh
with instructions that will reproduce the symlinks on the target server:
# !/bin/shecho "#!/bin/sh\n" > create-links.shfor file in $(find . -type l); dolink=$(readlink $file);echo "if [ ! -L $file ]; then ln -s $link $file; fi" >> create-links.sh;done
Now, we need to save the script to a grab-links.sh
file and execute:
chmod +x grab-links.sh./grab-links.sh
This will generate create-links.sh
that you can upload and run on the target server to reproduce your symlinks:
chmod +x create-links.sh./create-links.sh
Automation with Buddy
In Buddy you can create a pipeline that will automatically perform all these steps on every push to the repository:
- Upload the script
grab-links.sh
to the repository - Add a new pipeline and set the trigger mode to On every push
- Add Build action and enter the commands that will run the script in the Buddy’s infrastructure:
chmod +x grab-links.sh./grab-links.sh
- Add SFTP action that will upload the repository files with the newly generated script
create-links.sh
- Add SSH action and enter the commands that will execute the script on the targer server:
chmod +x create-links.sh./create-links.sh
Solution 2: Git Clone
Git handles symlinks exactly the way one could expect: if you push a symlink to the repository and somebody else clones this repository, the symlink will be reproduced in their local repo. So, basically, all that you need to do is install Git on the production server and run
git clone
Automation with Buddy
With Buddy you can execute git clone
automatically on every push the repository. A good practice is to add unit tests to make sure your code is free of errors before it’s pulled.
- Add a new pipeline and set the trigger mode to On every push
- Add PHP Unit action and define your tests. It comes with Composer preinstalled, too.
- Add SSH action that will execute
git clone
on the external repository.
Summary
Using Buddy to upload symlinks is just one of the many use cases the software can be used. You can expand your workflow and configure Buddy for example to:
- run integration tests at a given time
- notify your team of finished deployments on a Slack channel
- use environment variables to support private packages in npm and Composer
Make sure to follow our blog and check out our guides for more inspiration and use cases.