mirror of
https://github.com/SamKirkland/FTP-Deploy-Action.git
synced 2026-04-10 12:32:17 +02:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c4e4646b8 | ||
|
|
67f266cff8 | ||
|
|
f8a41d35d1 | ||
|
|
8bbce4e262 | ||
|
|
3e99626730 | ||
|
|
b4e9e0afae | ||
|
|
24ffd9c7f3 | ||
|
|
e60ff92ee6 | ||
|
|
851cc8a897 | ||
|
|
aa0baf9dc1 | ||
|
|
bef03c32a5 | ||
|
|
0fae300950 | ||
|
|
f00166c73a | ||
|
|
2c3915c100 | ||
|
|
25b4cb7043 | ||
|
|
fe67ba0caa | ||
|
|
d6a63fd397 | ||
|
|
dc0ff7b167 |
@@ -1,4 +1,4 @@
|
|||||||
FROM alpine:latest
|
FROM alpine:3.10
|
||||||
|
|
||||||
LABEL version="1.0.0"
|
LABEL version="1.0.0"
|
||||||
LABEL repository="https://github.com/SamKirkland/FTP-Deploy-Action"
|
LABEL repository="https://github.com/SamKirkland/FTP-Deploy-Action"
|
||||||
@@ -10,7 +10,8 @@ LABEL "com.github.actions.description"="Deploy your website via FTP"
|
|||||||
LABEL "com.github.actions.icon"="upload-cloud"
|
LABEL "com.github.actions.icon"="upload-cloud"
|
||||||
LABEL "com.github.actions.color"="orange"
|
LABEL "com.github.actions.color"="orange"
|
||||||
|
|
||||||
RUN apk add lftp
|
RUN apk update
|
||||||
|
RUN apk add openssh sshpass lftp
|
||||||
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod 777 entrypoint.sh
|
RUN chmod 777 entrypoint.sh
|
||||||
|
|||||||
207
README.md
207
README.md
@@ -1,50 +1,175 @@
|
|||||||
# FTP Deploy for GitHub Actions
|
# FTP Deploy GitHub Action
|
||||||
|
|
||||||
Automate deploying websites and more with this GitHub action.
|
Automate deploying websites and more with this GitHub action.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Usage
|
### Usage Example (Your_Project/.github/workflows/main.yml)
|
||||||
```
|
```yml
|
||||||
action "FTP-Deploy-Action" {
|
on: push
|
||||||
uses = "SamKirkland/FTP-Deploy-Action@master"
|
name: Publish Website
|
||||||
secrets = ["FTP_USERNAME", "FTP_PASSWORD", "FTP_SERVER"]
|
jobs:
|
||||||
}
|
FTP-Deploy-Action:
|
||||||
|
name: FTP-Deploy-Action
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: FTP-Deploy-Action
|
||||||
|
uses: SamKirkland/FTP-Deploy-Action@2.0.0
|
||||||
|
env:
|
||||||
|
FTP_SERVER: ftp.samkirkland.com
|
||||||
|
FTP_USERNAME: myFtpUserName
|
||||||
|
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
|
||||||
|
ARGS: --delete
|
||||||
|
# --delete arg will delete files on the server if you've deleted them in git
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Select the repository you want to add the action to
|
1. Select the repository you want to add the action to
|
||||||
2. Select the actions tab `(currently only for beta testers)`
|
2. Select the actions tab `(currently only for beta testers)`
|
||||||
3. Select `Create a new workflow`
|
3. Select `Blank workflow file` or `Set up a workflow yourself`, if you don't see these options manually create a yaml file `Your_Project/.github/workflows/main.yml`
|
||||||
4. Select `Edit new file`
|
4. Paste the above code into your file and save
|
||||||
5. Paste the above code into the bottom of the file
|
7. Now you need to add a key to the `secrets` section in your project. To add a `secret` go to the `Settings` tab in your project then select `Secrets`. Add a new `Secret` for `FTP_PASSWORD`
|
||||||
6. Go back to the `Visual editor`
|
|
||||||
7. Click edit on the `FTP-Deploy-Action`
|
|
||||||
8. In the `secrets` section add the required params
|
|
||||||
* FTP_USERNAME
|
|
||||||
* FTP_PASSWORD
|
|
||||||
* FTP_SERVER
|
|
||||||
* (see optional settings below)
|
|
||||||
|
|
||||||
### Settings
|
### Settings
|
||||||
- Options
|
Keys can be added directly to your .yml config file or referenced from your project `Secrets` storage.
|
||||||
- __FTP Username__: ${FTP_USERNAME}
|
|
||||||
- __FTP Password__: ${FTP_PASSWORD}
|
To add a `secret` go to the `Settings` tab in your project then select `Secrets`.
|
||||||
- __FTP Server__: ${FTP_SERVER}
|
I recommend you store your FTP_PASSWORD as a secret.
|
||||||
- __(Optional) Local Dir__: ${LOCAL_DIR}
|
|
||||||
- __(Optional) Remote Dir__: ${REMOTE_DIR}
|
| Key Name | Required? | Example | Default | Description |
|
||||||
- Set actions by editing the action then adding them in the `secrets` section:
|
|----------------|-----------|----------------------------|-----------------|----------------------------------------------------------|
|
||||||
- 
|
| `FTP_SERVER` | Yes | ftp.samkirkland.com | N/A | FTP server name (you may need to specify a port) |
|
||||||
|
| `FTP_USERNAME` | Yes | git-action@samkirkland.com | N/A | FTP account username |
|
||||||
|
| `FTP_PASSWORD` | Yes | CrazyUniquePassword&%123 | N/A | FTP account password |
|
||||||
|
| `METHOD` | No | ftp | ftp | Protocol used to deploy (ftp or sftp) |
|
||||||
|
| `PORT` | No | 21 | ftp=21, sftp=22 | The port used to connect to server |
|
||||||
|
| `LOCAL_DIR` | No | build | . (root project folder) | The local folder to copy, defaults to root project folder. Do NOT include slashes for folders. |
|
||||||
|
| `REMOTE_DIR` | No | serverFolder | . (root FTP folder) | The remote folder to copy to, deafults to root FTP folder (I recommend you configure this on your server side instead of here). Do NOT include slashes for folders. |
|
||||||
|
| `ARGS` | No | See `ARGS` section below | N/A | Custom lftp arguments, this field is passed through directly into the lftp script. |
|
||||||
|
|
||||||
|
#### ARGS
|
||||||
|
Custom lftp arguments, this field is passed through directly into the lftp script. See [lftp's website](https://lftp.yar.ru/lftp-man.html) for all options.
|
||||||
|
You can use as many arguments as you want, seperate them with a space
|
||||||
|
|
||||||
|
Below is an incomplete list of commonly used ARGS:
|
||||||
|
|
||||||
|
| Argument | Description |
|
||||||
|
|------------------------|------------------------------------------------------------------------------------------------------|
|
||||||
|
| `--verbose` | Outputs which files are being modified, useful for debugging |
|
||||||
|
| `--delete` | Delete files not present at the source |
|
||||||
|
| `--transfer-all` | Transfer all files, even seemingly the same as the target site |
|
||||||
|
| `--dry-run` | Ouputs files that will be modified without making any actual changes |
|
||||||
|
| `--include=File.txt` | Include matching files, you can add multiple `--include` |
|
||||||
|
| `--exclude=File.txt` | Exclude matching files, you can add multiple `--exclude` |
|
||||||
|
| `--include-glob=*.zip` | Include matching files, you can add multiple `--include-glob` |
|
||||||
|
| `--exclude-glob=*.zip` | Exclude matching files, you can add multiple `--exclude-glob` |
|
||||||
|
| `--delete-excluded` | Deletes any items you've marked as excluded if they exist on the server |
|
||||||
|
| `--no-empty-dirs` | Don't create empty directories |
|
||||||
|
| `--parallel=X` | Uploads X files at a time in parallel |
|
||||||
|
| `-L` | Upload symbolic links as files (FTP doesn't have a way of creating actual symbolic links) |
|
||||||
|
|
||||||
|
|
||||||
### Explination of steps
|
## Common Examples
|
||||||
- This action is triggered by a `event` on your repo
|
### Build and Publish React/Angular/Vue/Node Website
|
||||||
- A docker image based on `mwienk/docker-lftp` is spun up on github servers
|
Make sure you have an npm script named 'build'. This config should work for most node built websites
|
||||||
- The docker container compresses your code into a tar.gz file
|
```yml
|
||||||
- The file is then uploaded to the remote server
|
on: push
|
||||||
- The file is then un-zipped
|
name: Build and Publish Front End Framework Website
|
||||||
|
jobs:
|
||||||
|
FTP-Deploy-Action:
|
||||||
|
name: FTP-Deploy-Action
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
|
||||||
|
- name: Use Node.js 12.x
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: '12.x'
|
||||||
|
|
||||||
|
- name: Build Project
|
||||||
|
run: |
|
||||||
|
npm install
|
||||||
|
npm run build --if-present
|
||||||
|
|
||||||
|
- name: List output files
|
||||||
|
run: ls
|
||||||
|
|
||||||
|
- name: FTP-Deploy-Action
|
||||||
|
uses: SamKirkland/FTP-Deploy-Action@2.0.0
|
||||||
|
env:
|
||||||
|
FTP_SERVER: ftp.samkirkland.com
|
||||||
|
FTP_USERNAME: myFTPUsername
|
||||||
|
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
|
||||||
|
LOCAL_DIR: build
|
||||||
|
ARGS: --delete
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## SFTP Example
|
||||||
|
```yml
|
||||||
|
on: push
|
||||||
|
name: Publish Website over SFTP
|
||||||
|
jobs:
|
||||||
|
FTP-Deploy-Action:
|
||||||
|
name: FTP-Deploy-Action
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
|
||||||
|
- name: FTP-Deploy-Action
|
||||||
|
uses: SamKirkland/FTP-Deploy-Action@2.0.0
|
||||||
|
env:
|
||||||
|
FTP_SERVER: ftp.samkirkland.com
|
||||||
|
FTP_USERNAME: mySFTPUsername
|
||||||
|
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
|
||||||
|
METHOD: sftp
|
||||||
|
PORT: 7280
|
||||||
|
ARGS: --delete
|
||||||
|
```
|
||||||
|
|
||||||
|
### Log only dry run: Use this mode for testing
|
||||||
|
Ouputs a list of files that will be created/modified to sync your source without making any actual changes
|
||||||
|
```yml
|
||||||
|
on: push
|
||||||
|
name: Publish Website Dry Run
|
||||||
|
jobs:
|
||||||
|
FTP-Deploy-Action:
|
||||||
|
name: FTP-Deploy-Action
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: FTP-Deploy-Action
|
||||||
|
uses: SamKirkland/FTP-Deploy-Action@2.0.0
|
||||||
|
env:
|
||||||
|
FTP_SERVER: ftp.samkirkland.com
|
||||||
|
FTP_USERNAME: myFTPUsername
|
||||||
|
FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
|
||||||
|
ARGS: --delete --dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Want another example? Let me know by creating a github issue
|
||||||
|
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
1. `rm: Access failed: 553 Prohibited file name: ./.ftpquota`
|
||||||
|
* The `.ftpquota` file is created by some FTP Servers and cannot be modified by the user
|
||||||
|
* **Fix:** Add `--exclude=.ftpquota` to your ARGS
|
||||||
|
2. How to exclude .git files from the publish
|
||||||
|
* **Fix:** Add `--exclude-glob=.git*/** --exclude-glob=.git**` to your ARGS
|
||||||
|
* Note: If you've already published these files you will need to manually delete them on the server or add the `--delete-excluded` option to ARGS
|
||||||
|
* Note: This will exclude all folders and files that start with `.git` no matter the folder they're in
|
||||||
|
|
||||||
|
#### Deprecated main.workflow config (used for beta/legacy apps that haven't been migrated to .yaml workflows yet)
|
||||||
|
```workflow
|
||||||
|
action "FTP-Deploy-Action" {
|
||||||
|
uses = "SamKirkland/FTP-Deploy-Action@1.0.0"
|
||||||
|
secrets = ["FTP_USERNAME", "FTP_PASSWORD", "FTP_SERVER"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Debugging locally
|
### Debugging locally
|
||||||
###### Instructions for windows
|
##### Instructions for debugging on windows
|
||||||
- Install docker for windows
|
- Install docker for windows
|
||||||
- Open powershell
|
- Open powershell
|
||||||
- Navigate to the repo folder
|
- Navigate to the repo folder
|
||||||
@@ -55,19 +180,11 @@ action "FTP-Deploy-Action" {
|
|||||||
- Run this command every time you modify entrypoint.sh `.\dos2unix.exe "{FULL_PATH_TO_REPO\entrypoint.sh}"`
|
- Run this command every time you modify entrypoint.sh `.\dos2unix.exe "{FULL_PATH_TO_REPO\entrypoint.sh}"`
|
||||||
- Run `docker run action`
|
- Run `docker run action`
|
||||||
|
|
||||||
###### Instructions for linux
|
##### Instructions for debugging on linux
|
||||||
- Please submit a PR for linux instructions :)
|
- Please submit a PR for linux instructions :)
|
||||||
|
|
||||||
|
|
||||||
### ToDo
|
#### ToDo
|
||||||
- More config options
|
- More examples
|
||||||
- Deploy Mode: ${DEPLOY_MODE} `full`|`diffs`
|
|
||||||
- SSH support
|
|
||||||
- Switch from lftp to git
|
|
||||||
|
|
||||||
Pull Requests Welcome!
|
#### Pull Requests Welcome!
|
||||||
|
|
||||||
### License
|
|
||||||
----
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|||||||
46
action.yml
Normal file
46
action.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: 'FTP Deploy'
|
||||||
|
description: 'Syncs files via FTP/SFTP to a remote server'
|
||||||
|
inputs:
|
||||||
|
ftp_server:
|
||||||
|
description: 'FTP server name (you may need to specify a port)'
|
||||||
|
required: true
|
||||||
|
ftp_username:
|
||||||
|
description: 'FTP account username'
|
||||||
|
required: true
|
||||||
|
ftp_password:
|
||||||
|
description: 'FTP account password'
|
||||||
|
required: true
|
||||||
|
method:
|
||||||
|
description: 'Protocol used to deploy (ftp or sftp)'
|
||||||
|
required: false
|
||||||
|
default: "ftp"
|
||||||
|
port:
|
||||||
|
description: 'The port used to connect to server'
|
||||||
|
required: false
|
||||||
|
default: "21"
|
||||||
|
local_dir:
|
||||||
|
description: 'The local folder to copy, defaults to root project folder'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
remote_dir:
|
||||||
|
description: 'The remote folder to copy to, deafults to root FTP folder (I recommend you configure this on your server side instead of here)'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
ARGS:
|
||||||
|
description: 'Passes through options into lftp'
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
runs:
|
||||||
|
using: 'docker'
|
||||||
|
image: 'Dockerfile'
|
||||||
|
args:
|
||||||
|
- ${{ inputs.ftp_server }}
|
||||||
|
- ${{ inputs.ftp_username }}
|
||||||
|
- ${{ inputs.ftp_password }}
|
||||||
|
- ${{ inputs.method }}
|
||||||
|
- ${{ inputs.port }}
|
||||||
|
- ${{ inputs.local_dir }}
|
||||||
|
- ${{ inputs.remote_dir }}
|
||||||
|
branding:
|
||||||
|
icon: 'upload-cloud'
|
||||||
|
color: 'orange'
|
||||||
@@ -4,12 +4,25 @@
|
|||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
echo "Starting FTP Deploy"
|
echo "Starting FTP Deploy"
|
||||||
echo "Uploading files..."
|
|
||||||
|
|
||||||
WDEFAULT_LOCAL_DIR=${LOCAL_DIR:-"."}
|
WDEFAULT_LOCAL_DIR=${LOCAL_DIR:-"."}
|
||||||
WDEFAULT_REMOTE_DIR=${REMOTE_DIR:-"."}
|
WDEFAULT_REMOTE_DIR=${REMOTE_DIR:-"."}
|
||||||
|
WDEFAULT_ARGS=${ARGS:-""}
|
||||||
|
WDEFAULT_METHOD=${METHOD:-"ftp"}
|
||||||
|
|
||||||
lftp $FTP_SERVER -u $FTP_USERNAME,$FTP_PASSWORD -e "set ftp:ssl-allow no; mirror -R $WDEFAULT_LOCAL_DIR $WDEFAULT_REMOTE_DIR; quit"
|
if [ $WDEFAULT_METHOD = "sftp" ]; then
|
||||||
|
WDEFAULT_PORT=${PORT:-"22"}
|
||||||
|
echo "Establishing SFTP connection..."
|
||||||
|
sshpass -p $FTP_PASSWORD sftp -o StrictHostKeyChecking=no -P $WDEFAULT_PORT $FTP_USERNAME@$FTP_SERVER
|
||||||
|
echo "Connection established"
|
||||||
|
else
|
||||||
|
WDEFAULT_PORT=${PORT:-"21"}
|
||||||
|
fi;
|
||||||
|
|
||||||
|
echo "Using $WDEFAULT_METHOD to connect to port $WDEFAULT_PORT"
|
||||||
|
|
||||||
|
echo "Uploading files..."
|
||||||
|
lftp $WDEFAULT_METHOD://$FTP_SERVER:$WDEFAULT_PORT -u $FTP_USERNAME,$FTP_PASSWORD -e "set ftp:ssl-allow no; mirror $WDEFAULT_ARGS -R $WDEFAULT_LOCAL_DIR $WDEFAULT_REMOTE_DIR; quit"
|
||||||
|
|
||||||
echo "FTP Deploy Complete"
|
echo "FTP Deploy Complete"
|
||||||
exit 0
|
exit 0
|
||||||
BIN
images/action-preview.gif
Normal file
BIN
images/action-preview.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 168 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB |
BIN
images/env.png
BIN
images/env.png
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
Reference in New Issue
Block a user