@@ -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
1644runs :
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
0 commit comments