commit d9ee6a4ff98f701ff1b49f58b3930033a7e60a1d Author: h7x4 Date: Wed May 1 13:32:38 2024 +0200 Initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b8ffb51 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 h7x4 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +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 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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cb7e0a8 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Rsync action + +This action sends the contents of a directory to a remote server using [rsync][rsync]. + +## Usage + +Basic usage: + +```yaml +- name: Transfer files + uses: https://git.pvv.ntnu.no/oysteikt/rsync-action@v1 + with: + source: ./path/to/directory/ + target: /path/at/remote/ + username: username + host: hostname + ssh-key: ${{ secrets.SSH_KEY }} +``` + +Advanced usage: + +```yaml +- name: Transfer files + uses: https://git.pvv.ntnu.no/oysteikt/rsync-action@v1 + with: + source: ./path/to/directory/ + target: /path/at/remote/ + username: username + host: hostname + port: 2222 + ssh-key: ${{ secrets.SSH_KEY }} + args: -avz --mkpath --exclude 'node_modules' --delete + known-hosts: "[hostname]:2222 ssh-ed25519 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +``` + +[rsync]: https://rsync.samba.org/ \ No newline at end of file diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..e4e24c7 --- /dev/null +++ b/action.yml @@ -0,0 +1,108 @@ +name: 'Rsync SSH transfer' +description: 'Transfer files to another location' +inputs: + username: + description: "Username to be used for login" + required: true + ssh-key: + description: "private SSH key to use for logging int" + required: false + host: + description: "Host to log in at" + required: true + port: + description: "Port to connect to" + required: true + default: "22" + known-hosts: + description: "Content to add to the known_hosts file, to verify the authenticity of the remote" + required: false + source: + description: "Which files to copy" + required: true + target: + description: "Where on the host to copy the files" + required: true + args: + description: "Command line args to pass to rsync" + required: true + default: "--archive --compress --verbose --mkpath" + +runs: + using: "composite" + steps: + - name: Install rsync + run: | + if ! command -v apt-get &> /dev/null + then + echo "Only apt is supported" + exit 1 + fi + + if command -v rsync &> /dev/null + then + echo "rsync is already installed" + else + echo "Updating package index" + apt-get update + echo "Installing rsync" + apt-get install -y rsync + fi + shell: bash + + - name: Create SSH directory + run: | + echo "Creating ~/.ssh" + mkdir -p ~/.ssh + shell: bash + + - name: Install SSH config + run: | + echo "Installing SSH config" + cat < ~/.ssh/config + Host targethost + User ${{ inputs.username }} + HostName ${{ inputs.host }} + Port ${{ inputs.port }} + IdentityFile ~/.ssh/key + ForwardAgent no + ForwardX11 no + PasswordAuthentication no + EOF + chmod 600 ~/.ssh/config + shell: bash + + - name: Install SSH known_hosts + run: | + echo "Installing known_hosts" + echo "${{ inputs.known-hosts }}" > ~/.ssh/known_hosts + echo " StrictHostKeyChecking yes" >> ~/.ssh/config + shell: bash + if: ${{ inputs.known-hosts != null }} + + - name: Disable SSH host key checking + run: | + echo "Disabling host key checking" + echo " StrictHostKeyChecking no" >> ~/.ssh/config + shell: bash + if: ${{ inputs.known-hosts == null }} + + - name: Install SSH key + run: | + echo "Installing SSH key" + echo "${{ inputs.ssh-key }}" > ~/.ssh/key + chmod 600 ~/.ssh/key + shell: bash + if: ${{ inputs.ssh-key != null }} + + - name: Transfer files + run: | + echo "Transferring files" + rsync ${{ inputs.args }} "${{ inputs.source }}" "targethost:${{ inputs.target }}" + shell: bash + + - name: Cleanup + run: | + echo "Cleaning up" + rm -f ~/.ssh/{config,key,known_hosts} || true + shell: bash \ No newline at end of file