Skip to content

Commit 05922da

Browse files
added more options
1 parent abebfc4 commit 05922da

File tree

2 files changed

+147
-43
lines changed

2 files changed

+147
-43
lines changed

action.yml

Lines changed: 143 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,97 +12,199 @@ inputs:
1212
ssh_private_key:
1313
description: 'SSH Server private key'
1414
required: true
15+
source_path:
16+
description: 'Path to the repository checkout.'
17+
required: false
18+
default: '.'
19+
deployment_dest:
20+
description: 'Path to a specific directory to deploy instead of the entire repository, leave blank for whole repository deployment.'
21+
required: false
22+
default: '.'
23+
post_deploy_commands:
24+
description: 'Commands to execute on the server after the deployment is complete.'
25+
required: false
26+
default: ''
27+
cleanup_deleted_files:
28+
description: 'Delete files from the server that have been removed from the repository.'
29+
type: choice
30+
required: false
31+
default: true
32+
options:
33+
- "yes"
34+
- "no"
35+
enable_health_check:
36+
description: 'Check WordPress health after deployment and roll back if it fails. Disable to skip this step.'
37+
type: choice
38+
required: false
39+
default: "yes"
40+
options:
41+
- "yes"
42+
- "no"
1543

1644
runs:
1745
using: 'composite'
1846
steps:
19-
- name: Config action
47+
- name: Create Env variables
2048
id: config
2149
shell: bash
2250
run: |
2351
sudo apt-get update -q && sudo apt-get install -y rsync sshpass
52+
53+
OUTPUT_DIR="output"
54+
SSH_ROOT_DIR="html"
55+
TEMP_KEY_FILE="private_key"
56+
ACTION_DIR="action_dir"
57+
IGNORE_FILES="$ACTION_DIR/files_to_ignore.txt"
58+
SYNC_FILES="$OUTPUT_DIR/files_to_sync.txt"
59+
REMOTE_DIR="$SSH_ROOT_DIR/deployer"
60+
SSH_AUTH="-i $TEMP_KEY_FILE -o StrictHostKeyChecking=no"
61+
TAR_NAME="repository_$(openssl rand -hex 4).tar.gz"
2462
25-
mkdir -p ~/.ssh output
26-
ssh-keyscan -H "${{ inputs.remote_host }}" >> ~/.ssh/known_hosts
27-
63+
CHECKOUT_DIR=${{ inputs.source_path }}
64+
CHECKOUT_DIR="${CHECKOUT_DIR#/}" # Remove leading slash
65+
CHECKOUT_DIR="${CHECKOUT_DIR%/}" # Remove trailing slash
66+
echo "CHECKOUT_DIR=$CHECKOUT_DIR" >> $GITHUB_ENV
67+
68+
DEST_DIR=${{ inputs.deployment_dest }}
69+
DEST_DIR="${DEST_DIR#/}" # Remove leading slash
70+
DEST_DIR="${DEST_DIR%/}" # Remove trailing slash
71+
echo "DEST_DIR=$DEST_DIR" >> $GITHUB_ENV
72+
2873
ACTION_PATH="${{ github.action_path }}"
2974
TAG_NAME=$(basename "$ACTION_PATH")
3075
echo "ACTION_TAG=$TAG_NAME" >> $GITHUB_ENV
31-
echo "Tag name: $TAG_NAME"
32-
3376
echo "::set-output name=ACTION_TAG::$TAG_NAME"
34-
echo "CHECKOUT_DIR=git_checkout" >> $GITHUB_ENV
35-
echo "ACTION_DIR=action_dir" >> $GITHUB_ENV
36-
echo "IGNORE_FILE=action_dir/ignore_files.txt" >> $GITHUB_ENV
37-
echo "OUTPUT_DIR=output" >> $GITHUB_ENV
38-
echo "SYNC_FILE_LIST=output/files_to_sync.txt" >> $GITHUB_ENV
39-
echo "REMOTE_DIR=/html/deployer" >> $GITHUB_ENV
77+
78+
echo "ACTION_DIR=$ACTION_DIR" >> $GITHUB_ENV
79+
echo "IGNORE_FILES=$IGNORE_FILES" >> $GITHUB_ENV
80+
echo "OUTPUT_DIR=$OUTPUT_DIR" >> $GITHUB_ENV
81+
echo "SYNC_FILES=$SYNC_FILES" >> $GITHUB_ENV
82+
echo "DEL_FILE_LIST=$CHECKOUT_DIR/deleted_files.txt" >> $GITHUB_ENV
83+
echo "REMOTE_DIR=$REMOTE_DIR" >> $GITHUB_ENV
84+
echo "SSH_ROOT_DIR=$SSH_ROOT_DIR" >> $GITHUB_ENV
4085
echo "SSH_USER=${{ inputs.ssh_user }}" >> $GITHUB_ENV
4186
echo "SSH_HOST=${{ inputs.remote_host }}" >> $GITHUB_ENV
42-
43-
TAR_NAME="repository_$(openssl rand -hex 4).tar.gz"
87+
echo "SSH_AUTH=$SSH_AUTH" >> $GITHUB_ENV
88+
echo "CLEAN_UP=${{ inputs.cleanup_deleted_files }}" >> $GITHUB_ENV
4489
echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV
45-
echo "TAR_FILE=output/$TAR_NAME" >> $GITHUB_ENV
46-
47-
TEMP_KEY_FILE="private_key"
90+
echo "TAR_FILE=$OUTPUT_DIR/$TAR_NAME" >> $GITHUB_ENV
91+
92+
mkdir -p ~/.ssh $OUTPUT_DIR
93+
ssh-keyscan -H "${{ inputs.remote_host }}" >> ~/.ssh/known_hosts
4894
echo "${{ inputs.ssh_private_key }}" > "$TEMP_KEY_FILE"
4995
chmod 600 "$TEMP_KEY_FILE"
5096
echo "TEMP_KEY_FILE=$TEMP_KEY_FILE" >> $GITHUB_ENV
51-
52-
- name: Checkout repository
53-
with:
54-
path: git_checkout
55-
uses: actions/checkout@v3
56-
57-
- name: Checkout Action
97+
- name: Validate inputs
98+
shell: bash
99+
run: |
100+
if [ ! -d "$CHECKOUT_DIR" ]; then
101+
echo "The source directory does not exists."
102+
exit 1
103+
fi
104+
105+
if [[ "$DEST_DIR" != "." ]]; then
106+
if ! ssh "$SSH_AUTH" "$SSH_USER@$SSH_HOST" "[ -d '/$SSH_ROOT_DIR/$DEST_DIR' ]"; then
107+
echo "Error: Directory '/$SSH_ROOT_DIR/$DEST_DIR' does not exist on the server."
108+
exit 1
109+
fi
110+
fi
111+
112+
- name: Checkout action repo
58113
with:
59114
path: action_dir
60-
repository: narethiya-godaddy/git-deploy-poc
115+
repository: narethiya-godaddy/git-deploy-poc # TODO: Change this on prod
61116
ref: ${{ steps.config.outputs.ACTION_TAG }}
62117
uses: actions/checkout@v3
63118

64-
- name: Create tar file
119+
- name: Prepare changed and deleted files lists
65120
shell: bash
66121
run: |
67122
EXCLUDE_ARGS=""
68123
while IFS= read -r line; do
69124
EXCLUDE_ARGS+="--exclude=$line "
70-
done < "$IGNORE_FILE"
71-
125+
done < "$IGNORE_FILES"
126+
127+
echo "ignore list: $EXCLUDE_ARGS"
72128
echo "Preparing a changed file list..."
73-
rsync -av --dry-run --checksum -e "ssh -i $TEMP_KEY_FILE -o StrictHostKeyChecking=no" $EXCLUDE_ARGS $CHECKOUT_DIR/ "$SSH_USER@$SSH_HOST:/html/" | grep -v '/$' > $SYNC_FILE_LIST
74-
sed -i '1d;N;$!P;$!D;$d;$d' "$SYNC_FILE_LIST"
75-
129+
echo "Source: $CHECKOUT_DIR/"
130+
echo "Destination: /$SSH_ROOT_DIR/$DEST_DIR/"
131+
echo "current dir: $(pwd)"
132+
ls -lha
133+
echo "rsync command: "
134+
echo "rsync -av --dry-run --checksum -e ssh $SSH_AUTH $CHECKOUT_DIR/ $SSH_USER@$SSH_HOST:/$SSH_ROOT_DIR/$DEST_DIR/"
135+
136+
rsync -av --dry-run --checksum $EXCLUDE_ARGS \
137+
-e "ssh $SSH_AUTH" \
138+
$CHECKOUT_DIR/ "$SSH_USER@$SSH_HOST:/$SSH_ROOT_DIR/$DEST_DIR/" \
139+
| grep -v '/$' > $SYNC_FILES
140+
141+
if [[ $? -ne 0 ]]; then
142+
echo "Error: Failed to prepare the list of changed files."
143+
exit 1
144+
fi
145+
146+
sed -i '1d;N;$!P;$!D;$d;$d' "$SYNC_FILES"
76147
echo "Files to be synchronized:"
77-
cat "$SYNC_FILE_LIST"
78-
echo "End of list."
148+
cat "$SYNC_FILES"
149+
echo "--------End of list--------"
150+
151+
if [ "$CLEAN_UP" = "yes" ]; then
152+
touch $DEL_FILE_LIST
153+
echo "Preparing a deleted file list..."
154+
echo "rsync -av --dry-run --delete --ignore-existing -e 'ssh $SSH_AUTH' $CHECKOUT_DIR/ '$SSH_USER@$SSH_HOST:/$SSH_ROOT_DIR/$DEST_DIR/' | grep '^deleting ' | awk '{print $2}' | grep -v '/$' > $DEL_FILE_LIST"
155+
156+
rsync -av --dry-run --delete --ignore-existing $EXCLUDE_ARGS \
157+
-e "ssh $SSH_AUTH" \
158+
$CHECKOUT_DIR/ "$SSH_USER@$SSH_HOST:/$SSH_ROOT_DIR/$DEST_DIR/" \
159+
| grep '^deleting ' | awk '{print $2}' | grep -v '/$' > $DEL_FILE_LIST
160+
161+
if [[ $? -ne 0 ]]; then
162+
echo "Error: Failed to prepare the list of files to delete."
163+
exit 1
164+
fi
165+
166+
echo $(basename "$DEL_FILE_LIST") >> "$SYNC_FILES"
167+
echo "Files to be DELETED:"
168+
cat "$DEL_FILE_LIST"
169+
echo "--------End of deleted file list--------"
170+
fi
79171
172+
- name: Create tar file
173+
shell: bash
174+
run: |
175+
BASE_DIR=$(pwd)
80176
cd $CHECKOUT_DIR
81177
echo "Creating tar file: $TAR_FILE"
82-
tar -czvf "../$TAR_FILE" -T "../$SYNC_FILE_LIST"
83-
cd ../
178+
tar -czvf "$BASE_DIR/$TAR_FILE" -T "$BASE_DIR/$SYNC_FILES"
179+
cd $BASE_DIR
84180
echo "Tar file created successfully."
85181
86182
- name: Upload tar file to server
87183
shell: bash
88184
run: |
89185
echo "Creating remote directory: $REMOTE_DIR"
90-
ssh -i $TEMP_KEY_FILE -o StrictHostKeyChecking=no "$SSH_USER@$SSH_HOST" "mkdir -p '$REMOTE_DIR' || exit 1"
91-
echo "Uploading tar file to $REMOTE_DIR"
186+
ssh $SSH_AUTH "$SSH_USER@$SSH_HOST" "mkdir -p '/$REMOTE_DIR' || exit 1"
92187
93-
rsync -avz --delete -e "ssh -i $TEMP_KEY_FILE -o StrictHostKeyChecking=no" $TAR_FILE "$SSH_USER@$SSH_HOST:$REMOTE_DIR/"
188+
echo "Uploading tar file to $REMOTE_DIR"
189+
rsync -avz -e "ssh $SSH_AUTH" $TAR_FILE "$SSH_USER@$SSH_HOST:/$REMOTE_DIR/"
94190
echo "Tar file uploaded successfully."
95191
96192
- name: Clean up
97193
shell: bash
98194
run: |
99195
echo "Cleaning up temporary files..."
100-
rm -rf $OUTPUT_DIR $CHECKOUT_DIR $ACTION_DIR
196+
rm -rf $OUTPUT_DIR $ACTION_DIR
101197
echo "Temporary files cleaned up successfully."
102198
103-
- name: Run Deployer
199+
- name: Execute Deployment script
104200
shell: bash
105201
run: |
106202
echo "Run Server deployer"
107-
ssh -i $TEMP_KEY_FILE -o StrictHostKeyChecking=no "$SSH_USER@$SSH_HOST" "/html/deployer.sh $TAR_NAME || exit 1"
203+
POST_COMMAND=${{inputs.post_deploy_commands}}
204+
HEALTH_CHECK=${{inputs.enable_health_check}}
205+
DEPLOYER_SH="/$SSH_ROOT_DIR/deployer.sh"
206+
207+
ssh $SSH_AUTH "$SSH_USER@$SSH_HOST" \
208+
$DEPLOYER_SH $TAR_NAME $DEST_DIR $HEALTH_CHECK $POST_COMMAND
209+
108210
rm -f $TEMP_KEY_FILE

ignore_files.txt renamed to files_to_ignore.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ Thumbs.db
55
.htaccess
66
readme.md
77
.gitignore
8+
output
9+
private_key
10+
action_dir
811
index.php
912
plat-cron.php
1013
wp-activate.php
@@ -24,5 +27,4 @@ wp-admin/
2427
wp-includes/
2528
wp-content/mu-plugins/
2629
wp-content/object-cache.php
27-
wp-content/uploads/
28-
*.log
30+
wp-content/uploads/

0 commit comments

Comments
 (0)