mirror of
https://github.com/SamKirkland/FTP-Deploy-Action.git
synced 2025-08-14 22:15:05 +00:00
Compare commits
No commits in common. "master" and "v2.0.0" have entirely different histories.
@ -1,2 +0,0 @@
|
||||
dist/
|
||||
node_modules/
|
@ -1,56 +0,0 @@
|
||||
{
|
||||
"plugins": [
|
||||
"jest",
|
||||
"@typescript-eslint"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 8,
|
||||
"sourceType": "module",
|
||||
"project": "./tsconfig.json"
|
||||
},
|
||||
"rules": {
|
||||
"eslint-comments/no-use": "off",
|
||||
"import/no-namespace": "off",
|
||||
"no-unused-vars": "off",
|
||||
"@typescript-eslint/no-unused-vars": "error",
|
||||
"@typescript-eslint/explicit-member-accessibility": [
|
||||
"error",
|
||||
{
|
||||
"accessibility": "no-public"
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/no-require-imports": "error",
|
||||
"@typescript-eslint/array-type": "error",
|
||||
"@typescript-eslint/await-thenable": "error",
|
||||
"@typescript-eslint/func-call-spacing": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"@typescript-eslint/no-array-constructor": "error",
|
||||
"@typescript-eslint/no-empty-interface": "error",
|
||||
"@typescript-eslint/no-extraneous-class": "error",
|
||||
"@typescript-eslint/no-for-in-array": "error",
|
||||
"@typescript-eslint/no-inferrable-types": "error",
|
||||
"@typescript-eslint/no-misused-new": "error",
|
||||
"@typescript-eslint/no-namespace": "error",
|
||||
"@typescript-eslint/no-non-null-assertion": "warn",
|
||||
"@typescript-eslint/no-unnecessary-qualifier": "error",
|
||||
"@typescript-eslint/no-unnecessary-type-assertion": "error",
|
||||
"@typescript-eslint/no-useless-constructor": "error",
|
||||
"@typescript-eslint/no-var-requires": "error",
|
||||
"@typescript-eslint/prefer-for-of": "warn",
|
||||
"@typescript-eslint/prefer-function-type": "warn",
|
||||
"@typescript-eslint/prefer-includes": "error",
|
||||
"@typescript-eslint/prefer-string-starts-ends-with": "error",
|
||||
"@typescript-eslint/promise-function-async": "error",
|
||||
"@typescript-eslint/require-array-sort-compare": "error",
|
||||
"@typescript-eslint/restrict-plus-operands": "error",
|
||||
"@typescript-eslint/type-annotation-spacing": "error"
|
||||
},
|
||||
"env": {
|
||||
"node": true,
|
||||
"es6": true,
|
||||
"jest/globals": true
|
||||
}
|
||||
}
|
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,27 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Bug Description**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**My Action Config**
|
||||
```yaml
|
||||
on: push
|
||||
name: Publish Website
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🚀 Deploy website every commit
|
||||
# !!!!!!! TODO Fill Out !!!!!!!
|
||||
```
|
||||
|
||||
**My Action Log**
|
||||
```
|
||||
# Paste Log here
|
||||
# you may want enable verbose logging with log-level: verbose
|
||||
```
|
20
.github/workflows/ftp.yml
vendored
20
.github/workflows/ftp.yml
vendored
@ -1,20 +0,0 @@
|
||||
name: FTP Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: 🚀 Deploy website every commit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: ./
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: test@samkirkland.com
|
||||
password: ${{ secrets.ftp_password }}
|
21
.github/workflows/ftps.yml
vendored
21
.github/workflows/ftps.yml
vendored
@ -1,21 +0,0 @@
|
||||
name: FTPS Test
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
name: 🚀 Deploy website every commit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: ./
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: test@samkirkland.com
|
||||
password: ${{ secrets.ftp_password }}
|
||||
protocol: ftps
|
95
.gitignore
vendored
95
.gitignore
vendored
@ -1,95 +0,0 @@
|
||||
# Dependency directory
|
||||
node_modules
|
||||
|
||||
# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# next.js build output
|
||||
.next
|
||||
|
||||
# nuxt.js build output
|
||||
.nuxt
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# OS metadata
|
||||
.DS_Store
|
||||
Thumbs.db
|
18
Dockerfile
Normal file
18
Dockerfile
Normal file
@ -0,0 +1,18 @@
|
||||
FROM alpine:3.10
|
||||
|
||||
LABEL version="1.0.0"
|
||||
LABEL repository="https://github.com/SamKirkland/FTP-Deploy-Action"
|
||||
LABEL homepage="https://github.com/SamKirkland/FTP-Deploy-Action"
|
||||
LABEL maintainer="Sam Kirkland <FTP-Deploy-Action@samkirkland.com>"
|
||||
|
||||
LABEL "com.github.actions.name"="FTP Deploy Action"
|
||||
LABEL "com.github.actions.description"="Deploy your website via FTP"
|
||||
LABEL "com.github.actions.icon"="upload-cloud"
|
||||
LABEL "com.github.actions.color"="orange"
|
||||
|
||||
RUN apk update
|
||||
RUN apk add openssh sshpass lftp
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod 777 entrypoint.sh
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
13
LICENSE
13
LICENSE
@ -1,7 +1,6 @@
|
||||
MIT License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 GitHub, Inc. and contributors
|
||||
Copyright (c) 2019 SamKirkland
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@ -10,13 +9,13 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
360
README.md
360
README.md
@ -1,286 +1,190 @@
|
||||
<p align="center">
|
||||
<img alt="FTP Deploy Action - Continuous integration for everyone" src="images/ftp-deploy-logo-small.png">
|
||||
</p>
|
||||
# FTP Deploy GitHub Action
|
||||
|
||||
Automate deploying websites and more with this GitHub action. **It's free!**
|
||||
Automate deploying websites and more with this GitHub action.
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
---
|
||||
|
||||
### Usage Example
|
||||
Place the following in `/.github/workflows/main.yml`
|
||||
### Usage Example (Your_Project/.github/workflows/main.yml)
|
||||
```yml
|
||||
on: push
|
||||
name: 🚀 Deploy website on push
|
||||
name: Publish Website
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🎉 Deploy
|
||||
FTP-Deploy-Action:
|
||||
name: FTP-Deploy-Action
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: myFtpUserName
|
||||
password: ${{ secrets.ftp_password }}
|
||||
- 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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Requirements
|
||||
- You must have ftp access to your server. If your host allows or requires ssh please use my [web-deploy](https://github.com/SamKirkland/web-deploy) action
|
||||
- Some web hosts change the default port (21), check with your host for your port number
|
||||
|
||||
---
|
||||
|
||||
### Setup Steps
|
||||
1. Select the repository you want to add the action to
|
||||
2. Select the `Actions` tab
|
||||
2. Select the actions tab `(currently only for beta testers)`
|
||||
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. Paste the example above into your yaml file and save
|
||||
5. 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 `password`
|
||||
6. Update your yaml file settings
|
||||
7. If you appreciate this github action give it a :star: or show off with one of the [badges below](#badge).
|
||||
|
||||
---
|
||||
4. Paste the above code into your file and save
|
||||
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`
|
||||
|
||||
### Settings
|
||||
Keys can be added directly to your .yml config file or referenced from your project `Secrets` storage.
|
||||
|
||||
To add a `secret` go to the `Settings` tab in your project then select `Secrets`.
|
||||
I strongly recommend you store your `password` as a secret.
|
||||
I recommend you store your FTP_PASSWORD as a secret.
|
||||
|
||||
| Key Name | Required | Example | Default Value | Description |
|
||||
|-------------------------|----------|-------------------------------|-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `server` | Yes | `ftp.samkirkland.com` | | Deployment destination server |
|
||||
| `username` | Yes | `username@samkirkland.com` | | FTP user name |
|
||||
| `password` | Yes | `CrazyUniquePassword&%123` | | FTP password, be sure to escape quotes and spaces |
|
||||
| `port` | No | `990` | `21` | Server port to connect to (read your web hosts docs) |
|
||||
| `protocol` | No | `ftps` | `ftp` | `ftp`: provides no encryption, `ftps`: full encryption newest standard (aka "explicit" ftps), `ftps-legacy`: full encryption legacy standard (aka "implicit" ftps) |
|
||||
| `local-dir` | No | `./myFolderToPublish/` | `./` | Folder to upload from, must end with trailing slash `/` |
|
||||
| `server-dir` | No | `public_html/www/` | `./` | Folder to upload to (on the server), must end with trailing slash `/` |
|
||||
| `state-name` | No | `folder/.sync-state.json` | `.ftp-deploy-sync-state.json` | Path and name of the state file - this file is used to track which files have been deployed |
|
||||
| `dry-run` | No | `true` | `false` | Prints which modifications will be made with current config options, but doesn't actually make any changes |
|
||||
| `dangerous-clean-slate` | No | `true` | `false` | Deletes ALL contents of server-dir, even items in excluded with 'exclude' argument |
|
||||
| `exclude` | No | [See Example](#exclude-files) | [See Example](#exclude-files) | An array of glob patterns, these files will not be included in the publish/delete process. [List MUST be in this format](#exclude-files). You can use [a glob tester](https://www.digitalocean.com/community/tools/glob?comments=true&glob=%2A%2A%2F.git%2A%2F%2A%2A&matches=false&tests=test%2Fsam&tests=.git%2F%0D&tests=.github%2F%0D&tests=.git%2Ftest%0D&tests=.gitattributes%0D&tests=.gitignore%0D&tests=.git%2Fconfig%0D&tests=.git%2Ftest%2Ftest&tests=.github%2Fworkflows%2Fmain.yml&tests=node_modules%2Ffolder%2F%0D&tests=node_modules%2Fotherfolder%2F%0D&tests=subfolder%2Fnode_modules%2F) to test your pattern(s). |
|
||||
| `log-level` | No | `minimal` | `standard` | `minimal`: only important info, `standard`: important info and basic file changes, `verbose`: print everything the script is doing |
|
||||
| `security` | No | `strict` | `loose` | `strict`: Reject any connection which is not authorized with the list of supplied CAs. `loose`: Allow connection even when the domain is not certificate |
|
||||
| `timeout` | No | `60000` | `30000` | Timeout in milliseconds for FTP operations |
|
||||
| Key Name | Required? | Example | Default | Description |
|
||||
|----------------|-----------|----------------------------|-----------------|----------------------------------------------------------|
|
||||
| `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) |
|
||||
|
||||
|
||||
# Common Examples
|
||||
#### Build and Publish React/Angular/Vue Website
|
||||
Make sure you have an npm script named 'build'. This config should work for most node built websites.
|
||||
|
||||
## Common Examples
|
||||
### Build and Publish React/Angular/Vue/Node Website
|
||||
Make sure you have an npm script named 'build'. This config should work for most node built websites
|
||||
```yml
|
||||
on: push
|
||||
name: 🚀 Deploy website on push
|
||||
name: Build and Publish Front End Framework Website
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🎉 Deploy
|
||||
FTP-Deploy-Action:
|
||||
name: FTP-Deploy-Action
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/checkout@master
|
||||
|
||||
- name: Use Node.js 16
|
||||
uses: actions/setup-node@v2
|
||||
- name: Use Node.js 12.x
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '12.x'
|
||||
|
||||
- name: 🔨 Build Project
|
||||
- name: Build Project
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
npm run build --if-present
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: myFtpUserName
|
||||
password: ${{ secrets.password }}
|
||||
- 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
|
||||
```
|
||||
|
||||
#### FTPS
|
||||
|
||||
## SFTP Example
|
||||
```yml
|
||||
on: push
|
||||
name: 🚀 Deploy website on push
|
||||
name: Publish Website over SFTP
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🎉 Deploy
|
||||
FTP-Deploy-Action:
|
||||
name: FTP-Deploy-Action
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
- uses: actions/checkout@master
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: myFtpUserName
|
||||
password: ${{ secrets.password }}
|
||||
protocol: ftps
|
||||
port: 1234 # todo replace with your web hosts ftps port
|
||||
- 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 option for testing
|
||||
### 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: 🚀 Deploy website on push
|
||||
name: Publish Website Dry Run
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🎉 Deploy
|
||||
FTP-Deploy-Action:
|
||||
name: FTP-Deploy-Action
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: myFtpUserName
|
||||
password: ${{ secrets.password }}
|
||||
dry-run: true
|
||||
- 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
|
||||
```
|
||||
|
||||
#### Exclude files
|
||||
Excludes files
|
||||
```yml
|
||||
on: push
|
||||
name: 🚀 Deploy website on push
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: 🎉 Deploy
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚚 Get latest code
|
||||
uses: actions/checkout@v4
|
||||
##### Want another example? Let me know by creating a github issue
|
||||
|
||||
- name: 📂 Sync files
|
||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
||||
with:
|
||||
server: ftp.samkirkland.com
|
||||
username: myFtpUserName
|
||||
password: ${{ secrets.password }}
|
||||
exclude: |
|
||||
**/.git*
|
||||
**/.git*/**
|
||||
**/node_modules/**
|
||||
fileToExclude.txt
|
||||
```
|
||||
|
||||
`exclude` has the following default value
|
||||
```yml
|
||||
exclude: |
|
||||
**/.git*
|
||||
**/.git*/**
|
||||
**/node_modules/**
|
||||
```
|
||||
if you overwrite the default value you will probably want to respecify them
|
||||
|
||||
|
||||
---
|
||||
|
||||
_Want another example? Let me know by creating a [github issue](https://github.com/SamKirkland/FTP-Deploy-Action/issues/new)_
|
||||
|
||||
---
|
||||
|
||||
## Badge
|
||||
|
||||
If you appreciate this github action give it a :star: or show off with one of the badges below. Feel free to edit the text or color.
|
||||
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=0077b6">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=0077b6">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=2b9348">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=2b9348">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=d00000">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Deployed with FTP Deploy Action" src="https://img.shields.io/badge/Deployed With-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=d00000">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=297FA9">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=297FA9">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=2b9348">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=2b9348">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=d00000">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
|
||||
```md
|
||||
[<img alt="Website Deployed for Free with FTP Deploy Action" src="https://img.shields.io/badge/Website deployed for free with-FTP DEPLOY ACTION-%3CCOLOR%3E?style=for-the-badge&color=d00000">](https://github.com/SamKirkland/FTP-Deploy-Action)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
<details>
|
||||
<summary>How to exclude .git files from the publish</summary>
|
||||
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
|
||||
|
||||
Git files are excluded by default! If you customize the `exclude` option make sure you re-add the default options.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>How to exclude a specific file or folder</summary>
|
||||
|
||||
You can use the `exclude` option to ignore specific files/folders from the publish. Keep in mind you will need to re-add the default exclude options if you want to keep them. For example the below option excludes all `.txt` files.
|
||||
|
||||
```yml
|
||||
exclude:
|
||||
- *.txt
|
||||
#### 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"]
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
### Debugging locally
|
||||
##### Instructions for debugging on windows
|
||||
- Install docker for windows
|
||||
- Open powershell
|
||||
- Navigate to the repo folder
|
||||
- Run `docker build --tag action .`
|
||||
- (Optional) This step is only required when editing entrypoint.sh due to windows editors saving the file with windows line breaks instead of linux line breaks
|
||||
- Download http://dos2unix.sourceforge.net/
|
||||
- In another powershell window nagivate to the dos2unix folder /bin
|
||||
- Run this command every time you modify entrypoint.sh `.\dos2unix.exe "{FULL_PATH_TO_REPO\entrypoint.sh}"`
|
||||
- Run `docker run action`
|
||||
|
||||
##### Instructions for debugging on linux
|
||||
- Please submit a PR for linux instructions :)
|
||||
|
||||
|
||||
<details>
|
||||
<summary>How do I set a upload timeout?</summary>
|
||||
#### ToDo
|
||||
- More examples
|
||||
|
||||
github has a built-in `timeout-minutes` option, see customized example below
|
||||
|
||||
```yaml
|
||||
on: push
|
||||
name: Publish Website
|
||||
jobs:
|
||||
web-deploy:
|
||||
name: web-deploy
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15 # time out after 15 minutes (default is 360 minutes)
|
||||
steps:
|
||||
....
|
||||
```
|
||||
</details>
|
||||
|
||||
## Debugging your config locally
|
||||
This action is a basic wrapper around my `@samkirkland/ftp-deploy` npm package. To test your config you can install [@samkirkland/ftp-deploy](https://github.com/SamKirkland/ftp-deploy) and then convert your config to a yml action. Settings are one-to-one, this action is only a wrapper.
|
||||
|
||||
## Contributing to this project
|
||||
To test this action locally you will need to setup **docker** and **act** to run a environment similar to the one github uses for actions.
|
||||
- Download/install docker for windows, make sure it is running
|
||||
- `choco install act-cli` install [act](https://github.com/nektos/act)
|
||||
- Install the npm package using `npm install --dev-only @samkirkland/ftp-deploy`
|
||||
- Update the `deploy` script in `package.json` with a actual server/username/password
|
||||
- You can run the script using the following command `npm run deploy` (run this in the folder that has the `package.json` file)
|
||||
#### Pull Requests Welcome!
|
||||
|
76
action.yml
76
action.yml
@ -1,52 +1,46 @@
|
||||
name: "FTP Deploy"
|
||||
description: "Automate deploying websites and more with this GitHub action via FTP and FTPS"
|
||||
author: "Sam Kirkland"
|
||||
name: 'FTP Deploy'
|
||||
description: 'Syncs files via FTP/SFTP to a remote server'
|
||||
inputs:
|
||||
server:
|
||||
ftp_server:
|
||||
description: 'FTP server name (you may need to specify a port)'
|
||||
required: true
|
||||
description: "ftp server"
|
||||
username:
|
||||
ftp_username:
|
||||
description: 'FTP account username'
|
||||
required: true
|
||||
description: "ftp username"
|
||||
password:
|
||||
ftp_password:
|
||||
description: 'FTP account password'
|
||||
required: true
|
||||
description: "ftp password"
|
||||
method:
|
||||
description: 'Protocol used to deploy (ftp or sftp)'
|
||||
required: false
|
||||
default: "ftp"
|
||||
port:
|
||||
description: 'The port used to connect to server'
|
||||
required: false
|
||||
description: "Server port to connect to (read your web hosts docs)"
|
||||
protocol:
|
||||
default: "21"
|
||||
local_dir:
|
||||
description: 'The local folder to copy, defaults to root project folder'
|
||||
required: false
|
||||
description: "protocol to deploy with - ftp, ftps, or ftps-legacy"
|
||||
local-dir:
|
||||
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
|
||||
description: "Folder to upload from, must end with trailing slash /"
|
||||
server-dir:
|
||||
default: ""
|
||||
ARGS:
|
||||
description: 'Passes through options into lftp'
|
||||
required: false
|
||||
description: "Path to upload to on the server. Must end with trailing slash /"
|
||||
state-name:
|
||||
required: false
|
||||
description: "Path and name of the state file - this file is used to track which files have been deployed"
|
||||
dry-run:
|
||||
required: false
|
||||
description: "Prints which modifications will be made with current config options, but doesnt actually make any changes"
|
||||
dangerous-clean-slate:
|
||||
required: false
|
||||
description: "Deletes ALL contents of server-dir, even items in excluded with exclude argument"
|
||||
exclude:
|
||||
required: false
|
||||
description: "An array of glob patterns, these files will not be included in the publish/delete process"
|
||||
log-level:
|
||||
required: false
|
||||
description: "How verbose should the information be - minimal, standard, or verbose"
|
||||
security:
|
||||
required: false
|
||||
description: "strict or loose"
|
||||
timeout:
|
||||
required: false
|
||||
description: "Timeout in milliseconds for FTP operations"
|
||||
default: ""
|
||||
runs:
|
||||
using: "node20"
|
||||
main: "dist/index.js"
|
||||
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: "blue"
|
||||
icon: 'upload-cloud'
|
||||
color: 'orange'
|
||||
|
9336
dist/index.js
vendored
9336
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
28
entrypoint.sh
Normal file
28
entrypoint.sh
Normal file
@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
|
||||
# "to avoid continuing when errors or undefined variables are present"
|
||||
set -eu
|
||||
|
||||
echo "Starting FTP Deploy"
|
||||
|
||||
WDEFAULT_LOCAL_DIR=${LOCAL_DIR:-"."}
|
||||
WDEFAULT_REMOTE_DIR=${REMOTE_DIR:-"."}
|
||||
WDEFAULT_ARGS=${ARGS:-""}
|
||||
WDEFAULT_METHOD=${METHOD:-"ftp"}
|
||||
|
||||
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"
|
||||
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: 12 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.9 KiB |
40
migration.md
40
migration.md
@ -1,40 +0,0 @@
|
||||
# How to migrate between versions
|
||||
|
||||
## Migrating from v4.1.0 to v4.2.0
|
||||
|
||||
`v4.2.0` parses the `exclude` option in a more standard way. Going forward the `exclude` option **must** be in the following format:
|
||||
|
||||
```yml
|
||||
exclude: |
|
||||
**/.git*
|
||||
**/.git*/**
|
||||
**/node_modules/**
|
||||
fileToExclude.txt
|
||||
```
|
||||
|
||||
## Migrating from v3 to v4
|
||||
|
||||
Migrating from v3 to v4 should be fairly straightforward. Version 4 was designed with speed and ease of initial setup in mind. Going forward version 4 will be the only supported version.
|
||||
|
||||
### Those who can't upgrade
|
||||
|
||||
Most features have been carried forward and improved upon. However, some features did not make the cut:
|
||||
- **`sftp` is no longer supported**. If you have `sftp` access you are using `ssh`, that means you have access to a much more modern and capable protocol. I plan on releasing a separate github action that will deploy over `sftp`/`ssh` using `rsync`. Until then you can continue using version 3.
|
||||
- The `include` argument has been removed. I didn't see much need for it in the initial release. If you need this feature please create a support ticket.
|
||||
|
||||
### How to upgrade
|
||||
|
||||
1. Remove `with: fetch-depth: 2`. It is no longer needed and removing it will _slightly_ speed up deployments.
|
||||
2. Change the version to `v4.X.X`, for example `SamKirkland/FTP-Deploy-Action@v4.3.5` (please check the [README](https://github.com/SamKirkland/FTP-Deploy-Action/blob/master/README.md) or the [releases page](https://github.com/SamKirkland/FTP-Deploy-Action/releases/latest) for the latest version).
|
||||
3. If you have a `.git-ftp-include` file you should delete it. Version 4 tracks files differently and no longer needs this config file.
|
||||
4. If you have a `.git-ftp-ignore` file, you should transfer the options to the new `exclude` argument. **Note:** version 4 excludes any `.git*` and `node_modules/` files / folders by default.
|
||||
5. Update your arguments to reflect the following changes:
|
||||
- `ftp-server` was split into 4 arguments:
|
||||
- `server`
|
||||
- `port`
|
||||
- `protocol`
|
||||
- `server-dir`
|
||||
- `ftp-username` was renamed to `username`.
|
||||
- `ftp-password` was renamed to `password`.
|
||||
- `local-dir` and `server-dir` now **must** end with `/`.
|
||||
- `git-ftp-args` and `known-hosts` arguments were removed.
|
4941
package-lock.json
generated
4941
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
44
package.json
44
package.json
@ -1,44 +0,0 @@
|
||||
{
|
||||
"name": "ftp-deploy-action",
|
||||
"version": "4.3.5",
|
||||
"private": true,
|
||||
"description": "Automate deploying websites and more with this GitHub action",
|
||||
"main": "dist/index.js",
|
||||
"scripts": {
|
||||
"build": "ncc build src/main.ts --no-cache",
|
||||
"test": "jest",
|
||||
"lint": "eslint src/**/*.ts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/SamKirkland/FTP-Deploy-Action.git"
|
||||
},
|
||||
"keywords": [
|
||||
"ftp",
|
||||
"website deploy",
|
||||
"continuous integration",
|
||||
"ftps"
|
||||
],
|
||||
"author": "Sam Kirkland",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.1",
|
||||
"@samkirkland/ftp-deploy": "^1.2.4",
|
||||
"@types/jest": "^29.4.1",
|
||||
"jest": "^29.5.0",
|
||||
"ts-jest": "^29.0.5",
|
||||
"ts-node-dev": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.11.24",
|
||||
"@typescript-eslint/eslint-plugin": "^5.33.1",
|
||||
"@typescript-eslint/parser": "^5.33.1",
|
||||
"@vercel/ncc": "^0.34.0",
|
||||
"eslint": "^8.22.0",
|
||||
"eslint-plugin-jest": "^26.8.7",
|
||||
"typescript": "^4.7.4"
|
||||
},
|
||||
"jest": {
|
||||
"preset": "ts-jest"
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "."
|
||||
}
|
||||
],
|
||||
"settings": {
|
||||
"files.exclude": {
|
||||
"**/node_modules": true
|
||||
}
|
||||
}
|
||||
}
|
105
src/main.test.ts
105
src/main.test.ts
@ -1,105 +0,0 @@
|
||||
import { optionalBoolean, optionalInt, optionalLogLevel, optionalProtocol, optionalSecurity, optionalString } from "./parse";
|
||||
|
||||
describe("boolean", () => {
|
||||
test("false", () => {
|
||||
expect(optionalBoolean("test", "false")).toBe(false);
|
||||
});
|
||||
|
||||
test("FALSE", () => {
|
||||
expect(optionalBoolean("test", "FALSE")).toBe(false);
|
||||
});
|
||||
|
||||
test("true", () => {
|
||||
expect(optionalBoolean("test", "true")).toBe(true);
|
||||
});
|
||||
|
||||
test("TRUE", () => {
|
||||
expect(optionalBoolean("test", "TRUE")).toBe(true);
|
||||
});
|
||||
|
||||
test("optional", () => {
|
||||
expect(optionalBoolean("test", "")).toBe(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("string", () => {
|
||||
test("empty", () => {
|
||||
expect(optionalString("")).toBe(undefined);
|
||||
});
|
||||
|
||||
test("populated", () => {
|
||||
expect(optionalString("test")).toBe("test");
|
||||
});
|
||||
});
|
||||
|
||||
describe("int", () => {
|
||||
test("empty", () => {
|
||||
expect(optionalInt("test", "")).toBe(undefined);
|
||||
});
|
||||
|
||||
test("0", () => {
|
||||
expect(optionalInt("test", "0")).toBe(0);
|
||||
});
|
||||
|
||||
test("1", () => {
|
||||
expect(optionalInt("test", "1")).toBe(1);
|
||||
});
|
||||
|
||||
test("500", () => {
|
||||
expect(optionalInt("test", "500")).toBe(500);
|
||||
});
|
||||
|
||||
test("non-int", () => {
|
||||
expect(() => optionalInt("test", "12.345")).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("protocol", () => {
|
||||
test("empty", () => {
|
||||
expect(optionalProtocol("test", "")).toBe(undefined);
|
||||
});
|
||||
|
||||
test("ftp", () => {
|
||||
expect(optionalProtocol("test", "ftp")).toBe("ftp");
|
||||
});
|
||||
|
||||
test("ftps", () => {
|
||||
expect(optionalProtocol("test", "ftps")).toBe("ftps");
|
||||
});
|
||||
|
||||
test("ftps-legacy", () => {
|
||||
expect(optionalProtocol("test", "ftps-legacy")).toBe("ftps-legacy");
|
||||
});
|
||||
});
|
||||
|
||||
describe("log level", () => {
|
||||
test("empty", () => {
|
||||
expect(optionalLogLevel("test", "")).toBe(undefined);
|
||||
});
|
||||
|
||||
test("minimal", () => {
|
||||
expect(optionalLogLevel("test", "minimal")).toBe("minimal");
|
||||
});
|
||||
|
||||
test("standard", () => {
|
||||
expect(optionalLogLevel("test", "standard")).toBe("standard");
|
||||
});
|
||||
|
||||
test("verbose", () => {
|
||||
expect(optionalLogLevel("test", "verbose")).toBe("verbose");
|
||||
});
|
||||
});
|
||||
|
||||
describe("security", () => {
|
||||
test("empty", () => {
|
||||
expect(optionalSecurity("test", "")).toBe(undefined);
|
||||
});
|
||||
|
||||
test("loose", () => {
|
||||
expect(optionalSecurity("test", "loose")).toBe("loose");
|
||||
});
|
||||
|
||||
test("strict", () => {
|
||||
expect(optionalSecurity("test", "strict")).toBe("strict");
|
||||
});
|
||||
});
|
32
src/main.ts
32
src/main.ts
@ -1,32 +0,0 @@
|
||||
import * as core from "@actions/core";
|
||||
import { deploy } from "@samkirkland/ftp-deploy";
|
||||
import { IFtpDeployArguments } from "@samkirkland/ftp-deploy/dist/types";
|
||||
import { optionalInt, optionalProtocol, optionalString, optionalBoolean, optionalStringArray, optionalLogLevel, optionalSecurity } from "./parse";
|
||||
|
||||
async function runDeployment() {
|
||||
try {
|
||||
const args: IFtpDeployArguments = {
|
||||
server: core.getInput("server", { required: true }),
|
||||
username: core.getInput("username", { required: true }),
|
||||
password: core.getInput("password", { required: true }),
|
||||
port: optionalInt("port", core.getInput("port")),
|
||||
protocol: optionalProtocol("protocol", core.getInput("protocol")),
|
||||
"local-dir": optionalString(core.getInput("local-dir")),
|
||||
"server-dir": optionalString(core.getInput("server-dir")),
|
||||
"state-name": optionalString(core.getInput("state-name")),
|
||||
"dry-run": optionalBoolean("dry-run", core.getInput("dry-run")),
|
||||
"dangerous-clean-slate": optionalBoolean("dangerous-clean-slate", core.getInput("dangerous-clean-slate")),
|
||||
"exclude": optionalStringArray("exclude", core.getMultilineInput("exclude")),
|
||||
"log-level": optionalLogLevel("log-level", core.getInput("log-level")),
|
||||
"security": optionalSecurity("security", core.getInput("security")),
|
||||
"timeout": optionalInt("timeout", core.getInput("timeout"))
|
||||
};
|
||||
|
||||
await deploy(args);
|
||||
}
|
||||
catch (error: any) {
|
||||
core.setFailed(error);
|
||||
}
|
||||
}
|
||||
|
||||
runDeployment();
|
103
src/parse.ts
103
src/parse.ts
@ -1,103 +0,0 @@
|
||||
export function optionalString(rawValue: string): string | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return rawValue;
|
||||
}
|
||||
|
||||
export function optionalBoolean(argumentName: string, rawValue: string): boolean | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const cleanValue = rawValue.toLowerCase();
|
||||
if (cleanValue === "true") {
|
||||
return true;
|
||||
}
|
||||
if (cleanValue === "false") {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw new Error(`${argumentName}: invalid parameter - please use a boolean, you provided "${rawValue}". Try true or false instead.`);
|
||||
}
|
||||
|
||||
export function optionalProtocol(argumentName: string, rawValue: string): "ftp" | "ftps" | "ftps-legacy" | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const cleanValue = rawValue.toLowerCase();
|
||||
if (cleanValue === "ftp") {
|
||||
return "ftp";
|
||||
}
|
||||
if (cleanValue === "ftps") {
|
||||
return "ftps";
|
||||
}
|
||||
if (cleanValue === "ftps-legacy") {
|
||||
return "ftps-legacy";
|
||||
}
|
||||
|
||||
throw new Error(`${argumentName}: invalid parameter - you provided "${rawValue}". Try "ftp", "ftps", or "ftps-legacy" instead.`);
|
||||
}
|
||||
|
||||
export function optionalLogLevel(argumentName: string, rawValue: string): "minimal" | "standard" | "verbose" | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const cleanValue = rawValue.toLowerCase();
|
||||
if (cleanValue === "minimal") {
|
||||
return "minimal";
|
||||
}
|
||||
if (cleanValue === "standard") {
|
||||
return "standard";
|
||||
}
|
||||
if (cleanValue === "verbose") {
|
||||
return "verbose";
|
||||
}
|
||||
|
||||
throw new Error(`${argumentName}: invalid parameter - you provided "${rawValue}". Try "minimal", "standard", or "verbose" instead.`);
|
||||
}
|
||||
|
||||
export function optionalSecurity(argumentName: string, rawValue: string): "loose" | "strict" | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const cleanValue = rawValue.toLowerCase();
|
||||
if (cleanValue === "loose") {
|
||||
return "loose";
|
||||
}
|
||||
if (cleanValue === "strict") {
|
||||
return "strict";
|
||||
}
|
||||
|
||||
throw new Error(`${argumentName}: invalid parameter - you provided "${rawValue}". Try "loose" or "strict" instead.`);
|
||||
}
|
||||
|
||||
export function optionalInt(argumentName: string, rawValue: string): number | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const valueAsNumber = parseFloat(rawValue);
|
||||
|
||||
if (Number.isInteger(valueAsNumber)) {
|
||||
return valueAsNumber;
|
||||
}
|
||||
|
||||
throw new Error(`${argumentName}: invalid parameter - you provided "${rawValue}". Try a whole number (no decimals) instead like 1234`);
|
||||
}
|
||||
|
||||
export function optionalStringArray(argumentName: string, rawValue: string[]): string[] | undefined {
|
||||
if (rawValue.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (typeof rawValue === "string") {
|
||||
throw new Error(`${argumentName}: invalid parameter - you provided "${rawValue}". This option expects an list in the EXACT format described in the readme`);
|
||||
}
|
||||
|
||||
return rawValue;
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"moduleResolution": "Node",
|
||||
"target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
"outDir": "./dist", /* Redirect output structure to the directory. */
|
||||
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||
"noEmit": true
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"**/.test.ts"
|
||||
]
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user