SamKirkland / web-deploy

Deploy your website automatically for free
MIT License
192 stars 30 forks source link

Web-deploy keeps deleting manually created files and folders #15

Open sammyskills opened 1 year ago

sammyskills commented 1 year ago

Bug Description Whenever I run the web-deploy action in my server, all files and folders that does not exist in the git repo are automatically deleted from the server.

For example, I have a file .env and this file is not included in the github repo, but whenever I run the deploy script, it is automatically deleted from the server. Same goes for folders which are created manually in the server.

My Action Config

on:
    push:
        branches:
            - production
name: ๐Ÿš€ Deploy files to the production server on push to production branch
jobs:
    deploy:
        name: ๐ŸŽ‰ Deploy files
        runs-on: ubuntu-latest
        steps:
            - name: ๐Ÿšš Get latest code
              uses: actions/checkout@v4

            - name: Setup PHP ๐Ÿ˜
              uses: shivammathur/setup-php@v2
              with:
                php-version: 8.2

            - name: Cache Composer Packages ๐Ÿ“ฆ
              id: composer-cache
              uses: actions/cache@v3
              with:
                path: vendor
                key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
                restore-keys: |
                    ${{ runner.os }}-php-

            - name: Install Dependencies ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ
              run: composer install --no-progress --no-interaction --prefer-dist --optimize-autoloader

            - name: ๐Ÿ“‚ Sync files
              uses: SamKirkland/web-deploy@v1
              with:
                target-server: example.com
                remote-user: ${{ secrets.do_sftp_username }}
                private-ssh-key: ${{ secrets.do_application_ssh_key }}
                destination-path: ~/public_html/
                source-path: ./
                ssh-port: 22
                rsync-options: --archive --verbose --compress --delete-after --human-readable --exclude=.git* --exclude=.git/ --exclude=README.md --exclude=readme.md --exclude=.gitignore --exclude "misc/" --exclude "src/" --exclude "*.txt"

What could be the problem?

AryaSvitkona commented 1 year ago

Looks like the rsync-option: ... --delete-after is doing that. That will delete every file, which is not part of the Repository like the .env file. I'm not sure how rsync handles that if you still use --delete-after with the --exclude=.env, but I'm pretty sure you should give it a try without the --delete-after parameter.

See https://man7.org/linux/man-pages/man1/rsync.1.html ( Search: "--delete-after")

Update: I just did a test with the "vendor" folder (since it's common in PHP projects), which shouldn't be deleted after rsync (just for that case). If I add the --exclude=vendor parameter to the existing parameter list (based on your example), the folder still persist after sync.

sammyskills commented 1 year ago

Thanks @AryaSvitkona.

If I add the --exclude=vendor parameter to the existing parameter list (based on your example), the folder still persist after sync.

Did you include the --delete-after option?

AryaSvitkona commented 1 year ago

Yes, exactly. See an example below which works for us.

`jobs: web-deploy: name: ๐ŸŽ‰ Deploy website runs-on: ubuntu-latest

to change

if: github.ref == 'refs/heads/main'
steps:
- name: ๐Ÿšš Get latest code
  uses: actions/checkout@v3

- name: ๐Ÿ“‚ Sync Files
  uses: SamKirkland/web-deploy@v1
  with:
    target-server: ...
    remote-user: ...
    private-ssh-key: ...
    source-path: ./
    destination-path: ~/www/foobar/foobar/wp-content/plugins/pluginname/
    rsync-options:  --archive --verbose --compress --human-readable --progress --delete-after --exclude=vendor`