Skip to content
This repository has been archived by the owner on Dec 8, 2024. It is now read-only.

Commit

Permalink
Merge pull request #20 from LimaoC/deploy-script
Browse files Browse the repository at this point in the history
Deploy script
  • Loading branch information
leadnaut authored Aug 19, 2024
2 parents 7281b5d + f146446 commit 8eab099
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 0 deletions.
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ To run a specific test, say `test_dummy.py`, use
poetry run pytest tests/test_dummy.py
```

## Deployment
To deploy a build to the Raspberry Pi use the `deploy.sh` script. This script will create a tarball of file listed in a text file, transfer it to
a specified hostname and untar it there.

To use the script execute it in the project's root directory with,
```bash
./deploy.sh [pathfile] [username]@[hostname]
```
For example, to deploy the files listed in `deploypaths.txt` to `testpi` (using username raspberry) the command would be
```bash
./deploy.sh deploypaths.txt raspberry@testpi
```
The pathname file should contain a path to a file or directory on each line. If a directory is listed `deploy.sh` will copy the entire contents over.
You can use the `#` character at the start of a line to leave comments.

## Code Styling

We use [black](https://black.readthedocs.io/en/stable/) for automated code formatting. To run Black, run this command from the root of the repo:
Expand Down
84 changes: 84 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/bin/bash


WARN="[\033[1;33mWARN\033[0m]"
INFO="[\033[1;32mINFO\033[0m]"
ERROR="[\033[1;31mERROR\033[0m]"

PATHFILE=$1
TEMPDIRPATH='package_temp'

[ -d $TEMPDIRPATH ]
TEMPDIRCHECK=$?

# Make temp dir if it doesn't exist
if [ $TEMPDIRCHECK == 1 ]; then
mkdir $TEMPDIRPATH
else
echo -e "$INFO Temp directory was pre-existing. I promise not to delete it."
fi

cleanup () {
# Do not delete the temp dir if it was pre-existing
echo -e "$INFO Cleaning up"
if [ $TEMPDIRCHECK == 1 ]; then
rm -r $TEMPDIRPATH
fi
}

BUILDPATH="${TEMPDIRPATH}/build"
mkdir $BUILDPATH

echo -e "$INFO Copying Files"

while read path; do
if [[ $path == \#* ]]; then
true
elif [ -d $path ]; then
#path is a directory
cp -r --parents $path $BUILDPATH
elif [ -e $path ]; then
#path is just a file
cp --parents $path ${BUILDPATH}
else
echo -e "${WARN}: $path not found"
fi
done <$PATHFILE

# Hashing directory line from https://stackoverflow.com/questions/545387/linux-compute-a-single-hash-for-a-given-folder-contents
HASH=$( find ${BUILDPATH} -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum )
TARNAME="build-${HASH:0:8}.tar" # Truncate the hash for a nicer file names

# Create tarball
echo -e "$INFO Creating Tarball"
if ! tar cf $TARNAME -C $TEMPDIRPATH "./build"; then
echo -e "$ERROR Tarball creation failed"
cleanup
exit 1
fi

SSHTARGET=$2
# Check if we can find target
if ! nc -z $SSHTARGET 22 2>/dev/null; then
echo -e "$ERROR Host unreachable";
cleanup
exit 1
fi

echo -e "$INFO Copying Tarball - destination's password may be needed"
if ! scp -q $TARNAME $SSHTARGET:~/; then
echo -e "$ERROR Copy unsuccessful"
cleanup
exit 1
fi

echo -e "$INFO Extracting Build - the password may be needed again"
if ! ssh $SSHTARGET "tar xf $TARNAME; rm $TARNAME"; then
echo -e "$ERROR Remote extraction failed"
cleanup
exit 1
fi

echo -e "$INFO Deployed Successfully"
cleanup
exit 0
3 changes: 3 additions & 0 deletions deploypaths.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Enter paths of files and directories to be bundled and sent to the pi
# deploy.sh will preserve the source directory layout so imports between files
# should still work if all files are copied in

0 comments on commit 8eab099

Please sign in to comment.