Skip to content

Commit 18a9870

Browse files
Full Rework Done.
1 parent f728419 commit 18a9870

File tree

1 file changed

+203
-80
lines changed

1 file changed

+203
-80
lines changed

entrypoint.sh

Lines changed: 203 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,235 @@
11
#!/bin/bash
2-
#set -eu
2+
set -e
33

4-
RAW_REPOSITORIES="$INPUT_REPOSITORIES"
5-
RAW_WORKFLOW_FILES="$INPUT_WORKFLOW_FILES"
6-
GITHUB_TOKEN="$INPUT_GITHUB_TOKEN"
7-
DRY_RUN="$INPUT_DRY_RUN"
8-
REPOSITORIES=($RAW_REPOSITORIES)
9-
WORKFLOW_FILES=($RAW_WORKFLOW_FILES)
10-
TEMP_PATH="/gh/"
11-
cd /
12-
mkdir "$TEMP_PATH"
13-
cd "$TEMP_PATH"
4+
source /gh-toolkit/shell.sh
5+
6+
# Validate Input Vars
7+
gh_validate_input "GITHUB_TOKEN" "Github Personal Access Token Is Required To Run This Action !"
8+
gh_validate_input "REPOSITORIES" "REPOSITORIES List is required"
9+
gh_validate_input "WORKFLOW_FILES" "WORKFLOW_FILES List is required"
10+
11+
# Configure Github Details
12+
gh_log
13+
gitconfig "Github Actions Workflow Sync Bot" "[email protected]"
1414
git config --system core.longpaths true
1515
git config --global core.longpaths true
16-
git config --global user.email "[email protected]" && git config --global user.name "GH Actions Workflow Sync Bot"
17-
18-
echo " "
19-
echo "⚙️ Basic Setup"
20-
echo "---------------------------------------------"
21-
echo "DRY_RUN : $DRY_RUN"
22-
echo "Workflow Files : $WORKFLOW_FILES"
23-
echo "Temp Path : $TEMP_PATH"
24-
echo "---------------------------------------------"
25-
echo " "
26-
27-
# Loops All Provided Repos
16+
17+
# Make Temp Work Directory
18+
TEMP_PATH="/workflow-sync/"
19+
mkdir "$TEMP_PATH"
20+
21+
# Fetch Input Vars
22+
RAW_REPOSITORIES=$(gh_input "REPOSITORIES")
23+
RAW_WORKFLOW_FILES=$(gh_input "WORKFLOW_FILES")
24+
DRY_RUN="$(gh_input "DRY_RUN" false)"
25+
GH_TOKEN="$(gh_input "GITHUB_TOKEN")"
26+
AUTO_CREATE_NEW_BRANCH="$(gh_input "AUTO_CREATE_NEW_BRANCH")"
27+
WORKFLOW_FILES_DIR="$(gh_input "WORKFLOW_FILES_DIR")"
28+
COMMIT_EACH_FILE="$(gh_input "COMMIT_EACH_FILE")"
29+
30+
# Convert String Into Array
31+
REPOSITORIES=($RAW_REPOSITORIES)
32+
WORKFLOW_FILES=($RAW_WORKFLOW_FILES)
33+
34+
# Display Basic Information
35+
gh_log " "
36+
gh_log "⚙️ Basic Config"
37+
gh_log "-------------------------------------------------------"
38+
gh_log " * DRY_RUN : $DRY_RUN"
39+
gh_log " * Total Repositories : ${#REPOSITORIES[@]}"
40+
gh_log " * Total Workflow Files : ${#WORKFLOW_FILES[@]}"
41+
gh_log "--------------------------------------------------------"
42+
gh_log " "
43+
44+
# Loop All Repository
2845
for R in "${REPOSITORIES[@]}"; do
29-
echo "###[group] 📓 $R"
30-
31-
REPO_URL="https://x-access-token:${GITHUB_TOKEN}@github.com/${R}.git"
32-
GIT_PATH="${TEMP_PATH}${R}"
33-
LOCAL_PATH="${GIT_PATH}/.github/workflows/"
34-
DEST_STATUS="Updated"
35-
echo "---------------------------------------------"
36-
echo "Github URL : $REPO_URL"
37-
echo "Clone To : $GIT_PATH"
38-
echo "---------------------------------------------"
39-
git clone --quiet --no-hardlinks --no-tags --depth 1 $REPO_URL ${R}
40-
echo " "
41-
42-
if [ ! -d "$LOCAL_PATH" ]; then
43-
mkdir -p $LOCAL_PATH
44-
DEST_STATUS="Created"
46+
gh_log_group_start "📓 ${R}"
47+
cd "${TEMP_PATH}"
48+
# Basic Repository Config
49+
REPO_DATA=($(echo ${R} | tr "@" "\n"))
50+
REPOSITORY_ID_DATA=($(echo ${REPO_DATA[0]} | tr "/" "\n"))
51+
REPOSITORY_OWNER="${REPOSITORY_ID_DATA[0]}"
52+
REPOSITORY_ID="${REPOSITORY_OWNER}/${REPOSITORY_ID_DATA[1]}"
53+
IS_BRANCH_CREATED=false
54+
BRANCH="$(is_empty_var "${REPO_DATA[1]}" "default")"
55+
GIT_PATH="${TEMP_PATH}${REPOSITORY_ID}/${BRANCH}"
56+
GIT_URL="https://x-access-token:${GH_TOKEN}@github.com/${REPOSITORY_ID}.git"
57+
58+
# Log Basic Config Info
59+
gh_log "$(log_purple "⚙️ Repository Config")"
60+
gh_log " Slug : ${REPOSITORY_ID}"
61+
gh_log " Branch : ${BRANCH}"
62+
gh_log " Url : ${GIT_URL}"
63+
gh_log " Local Path : ${GIT_PATH}"
64+
gh_log
65+
66+
if [ "$BRANCH" != "default" ]; then
67+
(git clone --quiet --no-hardlinks --no-tags --branch "${BRANCH}" --depth 1 $GIT_URL $GIT_PATH >/dev/null 2>&1) || echo "Failed" >/dev/null 2>&1
68+
69+
if [ ! -d "$GIT_PATH" ]; then
70+
if [ "$AUTO_CREATE_NEW_BRANCH" = true ]; then
71+
#gh_log "$(log_yellow "${BRANCH} Not Found !")"
72+
git clone --quiet --no-hardlinks --no-tags $GIT_URL $GIT_PATH >/dev/null 2>&1
73+
cd "$GIT_PATH"
74+
git checkout -b $BRANCH >/dev/null 2>&1
75+
gh_log "$(log_blue "✔️ ${BRANCH} Branch Created")"
76+
IS_BRANCH_CREATED=true
77+
fi
78+
fi
4579
else
46-
DEST_STATUS="Updated"
80+
git clone --quiet --no-hardlinks --no-tags --depth 1 $GIT_URL "${GIT_PATH}"
81+
fi
82+
83+
if [ -d "$GIT_PATH" ]; then
84+
if [ "$BRANCH" != "default" ]; then
85+
gh_log "$(log_green "✔️ Repositry Branch ${BRANCH} Cloned")"
86+
else
87+
gh_log "$(log_green "✔️ Repository Cloned")"
88+
fi
89+
else
90+
if [ "$BRANCH" != "default" ]; then
91+
gh_log_error "${BRANCH} Dose Not Exists. Failed To Sync Files !"
92+
else
93+
gh_log_error "Repository Dose Not Exists. Failed To Sync Files !"
94+
fi
95+
exit
96+
fi
97+
98+
gh_log
99+
cd "$GIT_PATH"
100+
101+
if [ "$IS_BRANCH_CREATED" = false ]; then
102+
git pull >/dev/null 2>&1
47103
fi
48104

49-
cd $GIT_PATH
50-
# Loops All Provided Workflows
51-
for WOF in "${WORKFLOW_FILES[@]}"; do
52-
WORKFLOW_FILE=($(echo $WOF | tr "=" "\n"))
105+
# Loop All Workflow Files
106+
for FILE in "${WORKFLOW_FILES[@]}"; do
107+
WORKFLOW_FILE=($(echo $FILE | tr "=" "\n"))
53108
SRC_FILE=${WORKFLOW_FILE[0]}
54-
SRC_FULL_PATH=""
55109
SRC_FILE_NAME=$(basename "$SRC_FILE")
56-
SRC_FILE_EXT="${SRC_FILE_NAME##*.}"
57-
DEST_FILE="${SRC_FILE_NAME}"
110+
SRC_FULL_PATH=""
111+
SRC_RELATIVE_PATH=""
112+
#SRC_FILE_EXT="${SRC_FILE_NAME##*.}"
113+
DEST_FILE=""
114+
DEST_FILE_TYPE='general'
115+
116+
gh_log "$(log_cyan "${SRC_FILE}")"
58117

59-
if [ "$SRC_FILE_EXT" != "yml" ]; then
60-
echo "⚠️ ${SRC_FILE} Is Not A Valid Github Actions Workflow File"
118+
#if [ "${SRC_FILE_EXT}" != "" ]; then
119+
# 1. Location : repo-owner/repo-id/workflows/src-file
120+
# 2. Location : repo-owner/workflows/src-file
121+
# 3. Location : common-workflow-dir/src-file
122+
# 4. Location : .github/workflows/src-file
123+
# 5. Location : repo-owner/repo-id/src-file
124+
# 6. Location : repo-owner/src-file
125+
# 7. Location : src-file
126+
127+
if [ -f "${GITHUB_WORKSPACE}/${REPOSITORY_ID}/workflows/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${REPOSITORY_ID}/workflows/${SRC_FILE}" ]; then
128+
SRC_RELATIVE_PATH="${REPOSITORY_ID}/workflows/${SRC_FILE}"
129+
DEST_FILE_TYPE='workflow'
130+
elif [ -f "${GITHUB_WORKSPACE}/${REPOSITORY_OWNER}/workflows/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${REPOSITORY_OWNER}/workflows/${SRC_FILE}" ]; then
131+
SRC_RELATIVE_PATH="${REPOSITORY_OWNER}/workflows/${SRC_FILE}"
132+
DEST_FILE_TYPE='workflow'
133+
elif [ -f "${GITHUB_WORKSPACE}/${WORKFLOW_FILES_DIR}/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${WORKFLOW_FILES_DIR}/${SRC_FILE}" ]; then
134+
SRC_RELATIVE_PATH="${WORKFLOW_FILES_DIR}/${SRC_FILE}"
135+
DEST_FILE_TYPE='workflow'
136+
elif [ -f "$GITHUB_WORKSPACE/.github/workflows/$SRC_FILE" ] || [ -d "$GITHUB_WORKSPACE/.github/workflows/$SRC_FILE" ]; then
137+
SRC_RELATIVE_PATH=".github/workflows/$SRC_FILE"
138+
DEST_FILE_TYPE='workflow'
139+
elif [ -f "${GITHUB_WORKSPACE}/${REPOSITORY_ID}/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${REPOSITORY_ID}/${SRC_FILE}" ]; then
140+
SRC_RELATIVE_PATH="${REPOSITORY_ID}/${SRC_FILE}"
141+
elif [ -f "${GITHUB_WORKSPACE}/${REPOSITORY_OWNER}/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${REPOSITORY_OWNER}/${SRC_FILE}" ]; then
142+
SRC_RELATIVE_PATH="${REPOSITORY_OWNER}/${SRC_FILE}"
143+
elif [ -f "${GITHUB_WORKSPACE}/${SRC_FILE}" ] || [ -d "${GITHUB_WORKSPACE}/${SRC_FILE}" ]; then
144+
SRC_RELATIVE_PATH="${SRC_FILE}"
61145
else
146+
gh_log_error "${SRC_FILE} Not Found !"
147+
SRC_RELATIVE_PATH=""
148+
gh_log
149+
fi
150+
151+
# Proceed To Copy & Commit Only If Source File / Folder Exists
152+
if [ "$SRC_RELATIVE_PATH" != "" ]; then
153+
# Checks if Custom Dest Path is given
62154
if [ ${WORKFLOW_FILE[1]+yes} ]; then
63-
DEST_FILE="${WORKFLOW_FILE[1]}"
155+
if [ "${DEST_FILE_TYPE}" = "workflow" ]; then
156+
DEST_FILE=".github/workflows/${WORKFLOW_FILE[1]}"
157+
else
158+
DEST_FILE="${WORKFLOW_FILE[1]}"
159+
fi
160+
else
161+
if [ "${DEST_FILE_TYPE}" = "workflow" ]; then
162+
DEST_FILE=".github/workflows/${SRC_FILE}"
163+
else
164+
DEST_FILE="${SRC_FILE}"
165+
fi
64166
fi
65167

66-
if [ -f "$GITHUB_WORKSPACE/.github/workflows/$SRC_FILE" ]; then
67-
SRC_FULL_PATH="${GITHUB_WORKSPACE}/.github/workflows/${SRC_FILE}"
68-
elif [ -f "${GITHUB_WORKSPACE}/${SRC_FILE}" ]; then
69-
SRC_FULL_PATH="${GITHUB_WORKSPACE}/${SRC_FILE}"
168+
SRC_FULL_PATH="${GITHUB_WORKSPACE}/${SRC_RELATIVE_PATH}"
169+
170+
gh_log " ${SRC_RELATIVE_PATH} => ${DEST_FILE}"
171+
172+
DEST_FOLDER_PATH=$(dirname "${GIT_PATH}/${DEST_FILE}")
173+
174+
if [ ! -d "$DEST_FOLDER_PATH" ]; then
175+
gh_log " Creating [$DEST_FOLDER_PATH]"
176+
mkdir -p $DEST_FOLDER_PATH
70177
fi
71178

72-
if [ "$SRC_FULL_PATH" != "" ]; then
73-
echo "Copying : $SRC_FULL_PATH --> ${LOCAL_PATH}${DEST_FILE}"
74-
cp "$SRC_FULL_PATH" "${LOCAL_PATH}${DEST_FILE}"
75-
git add "${LOCAL_PATH}${DEST_FILE}" -f
179+
# Checks if current src is a dir if yes then copy files based on it.
180+
if [ -d "${SRC_FULL_PATH}" ]; then
181+
if [ ! -d "${GIT_PATH}/${DEST_FILE}" ]; then
182+
mkdir -p "${GIT_PATH}/${DEST_FILE}"
183+
fi
184+
cp -rf "${SRC_FULL_PATH}/." "${GIT_PATH}/${DEST_FILE}"
185+
else
186+
cp -rf "${SRC_FULL_PATH}" "${GIT_PATH}/${DEST_FILE}"
187+
fi
76188

189+
git add "${GIT_PATH}/${DEST_FILE}" -f
190+
if [ "$COMMIT_EACH_FILE" = true ]; then
77191
if [ "$(git status --porcelain)" != "" ]; then
78-
git commit -m "💬 #${GITHUB_RUN_NUMBER} - Workflow File ${DEST_STATUS} / ⚡ Triggered By ${GITHUB_REPOSITORY}@${GITHUB_SHA}"
192+
git commit -m "💬 - Files Synced | Github Action Runner : ${GITHUB_RUN_NUMBER} | ⚡ Triggered By ${GITHUB_REPOSITORY}@${GITHUB_SHA}"
79193
else
80-
echo "✅ Nothing Changed For Workflow : ${SRC_FILE}"
194+
gh_log " ✅ No Changes Are Done : ${SRC_FILE}"
81195
fi
82-
else
83-
echo "🛑 ${SRC_FILE} Not Found In ${GITHUB_REPOSITORY}
84-
Searched In Below Locations
85-
1. $GITHUB_WORKSPACE/.github/workflows/$SRC_FILE
86-
2. ${GITHUB_WORKSPACE}/${SRC_FILE}
87-
"
88196
fi
89197
fi
90-
91-
echo " "
92198
done
93199

94-
echo "--------------------------------------"
95-
echo "Workflow Files Inside ${LOCAL_PATH}"
96-
cd ${LOCAL_PATH}
97-
ls -lah
98-
cd ${GIT_PATH}
99-
echo "--------------------------------------"
100-
101200
if [ -z "$DRY_RUN" ]; then
102-
echo "⚠️ No changes will be pushed to ${R}"
201+
gh_log_warning "No Changes Are Pushed"
202+
gh_log
203+
gh_log "Git Status"
103204
git status
205+
gh_log
104206
elif [ "$DRY_RUN" = true ]; then
105-
echo "⚠️ No changes will be pushed to ${R}"
207+
gh_log_warning "No Changes Are Pushed"
208+
gh_log
209+
gh_log "Git Status"
106210
git status
211+
gh_log
107212
else
108-
git push $REPO_URL
213+
gh_log
214+
if [ "$COMMIT_EACH_FILE" = false ]; then
215+
gh_log "$(log_green "Git Commit & Push Log")"
216+
else
217+
gh_log "$(log_green "Git Push Log")"
218+
fi
219+
gh_log "---------------------------------------------------"
220+
if [ "$COMMIT_EACH_FILE" = false ]; then
221+
if [ "$(git status --porcelain)" != "" ]; then
222+
git commit -m "💬 - Files Synced | Github Action Runner : ${GITHUB_RUN_NUMBER} | ⚡ Triggered By ${GITHUB_REPOSITORY}@${GITHUB_SHA}"
223+
else
224+
gh_log " ✅ No Files Changed"
225+
fi
226+
fi
227+
git push $GIT_URL
228+
gh_log "---------------------------------------------------"
229+
gh_log
109230
fi
110-
echo "###[endgroup]"
111-
cd $TEMP_PATH
231+
232+
gh_log_group_end
233+
cd "${TEMP_PATH}"
234+
rm -rf "${GIT_PATH}"
112235
done

0 commit comments

Comments
 (0)