This article is about deploying via SFTP with CloudBees CodeShip Basic. If you’d like to learn more about CloudBees CodeShip Basic, we recommend the getting started guide. You should also be aware of how deployment pipelines work on CloudBees CodeShip Basic. |
After your code passed through the pipeline successfully, the last step in your CI chain is deploying your code. You’re either using one of our many integrations or deploying with your own script. If you’re using your own means of deployment, we recommend tools like rsync, Capistrano (Ruby), Rocketeer (PHP), Deployer (PHP), or Fabric (Python).
Generally, we advise on using any SSH-based tool over FTP since the latter is not encrypted and transmits plain-text. If security is of any concern to you, one of the first steps is to use SSH when you’re deploying without a tool.
Our recommendation if you do not want to use a deployment tool or one of our integrations is the following:
-
Add the CodeShip public key to your
~/.ssh/authorized_keys
file, see Authenticating via SSH public keys. -
Create a deployment script, see Run commands on a remote server via SSH. At the very least, you will have to copy all files needed by your application to the server and start the services needed by your application.
When CodeShip checks out your repository, we clone it to a folder called |
Authenticating via SSH public keys
All of the methods below can use key-based authentication. As this does not require you to provide your account password to CodeShip, we strongly advise to configure this.
Add the
CodeShip public SSH key for your project to the ~/.ssh/authorized_keys
file on
your server. Below are the commands you need to prepare everything and
open an editor window where you can simply paste your key and save the
file. Please run those commands via an SSH session on your server.
mkdir -p ~/.ssh touch ~/.ssh/authorized_keys chmod -R go-rwx ~/.ssh/ # add the CodeShip public SSH key to ~/.ssh/authorized_keys nano ~/.ssh/authorized_keys
In the above example, we use nano
to paste the public SSH key, but you
might use any editor like vi
or others that are installed on your
server.
See Run commands on a remote server via SSH on how to run commands on a remote server when building your application on CodeShip.
Run commands on a remote server via SSH
If you give a command as the last parameter to SSH it will run this command on the server and exit with the return status of that command. This can be used to start services or trigger a deployment on an external system.
To restart Apache on a remote server, you could call the following
command. (This would require the deploy user to be able to call sudo
without a password.)
ssh deploy@your.server.com 'sudo service apache restart'
deploy
is the username that you are using on the deployment server and
your.server.com
is the IP or domain name of the server you want to
deploy to.
Continuous Deployment with SCP
SCP allows you to copy files from your local system to another server.
With the -r
option you can also recursively upload directories. You
can read more about the different options in the
SCP man page.
For the branch you want to deploy you create a script deployment that contains:
scp -rp ~/clone/* ssh_user@your.server.com:/path/on/server/
Add the
SSH key of your project into your servers ~/.ssh/authorized_keys
file.
Continuous Deployment with RSYNC
Rsync is an amazing tool to sync your local filesystem with an external server. Rsync will check the files and only upload files that have changed.
For the branch you want to deploy you create a script deployment that contains the following code.
rsync -avz ~/clone/ ssh_user@your.server.com:/path/on/server/
Or you can also run rsync over ssh.
rsync -avz -e "ssh" ~/clone/ ssh_user@your.server.com:/path/on/server/
You can read more about the Rsync options in the Rsync man page.
Continuous Deployment with SFTP
SFTP supports FTP-like commands over an encrypted SSH session. You can automate SFTP by creating a batch file and handing it to SFTP. The batch file can contain any commands documented in the interactive commands section of the SFTP man page.
We will deploy the complete repository contents onto a remote server. Please add a file containing the following directives to your repository. You can name it any way you like. In our case we will call it production and store it in a subdirectory called deploy.
put -rp /home/rof/clone /path/on/server/
For the branch you want to deploy you create a script deployment that contains:
sftp -b deploy/production ssh_user@your.server.com
-
Make sure you add the SSH key of your project into your servers
authorized_keys
file. -
Also make sure your remote directory already exists before running your first deployment.
Continuous Deployment with FTP
For FTP we recommend using LFTP for uploading files. The following section will help you get started.
To keep your username and password out of your build logs, add them as environment variables in your project configuration:
FTP_USER FTP_PASSWORD
So if you wanted to copy all of your repository to a remote server, you could add the following command to a custom script deployment on the branch you want to deploy.
-
Make sure your remote directory does not end with a slash unless you want your copy to live in a subdirectory called clone.
-
Also make sure your remote directory already exists before trying your first deployment.
lftp -c "open -u $FTP_USER,$FTP_PASSWORD ftp.yoursite.com; set ssl:verify-certificate no; mirror -R ~/clone/ /path/on/remote/server"
LFTP is installed by default, but if you need a more current version you can install it in your build with the following script:
curl -sSL https://raw.githubusercontent.com/codeship/scripts/master/packages/lftp.sh | bash -s
For more information on using LFTP please see the LFTP man page.