1+ name : Docker Tag Monitor
2+
3+ on :
4+ schedule :
5+ # Run every hour to check for missing Docker images
6+ - cron : ' 0 * * * *'
7+ workflow_dispatch :
8+ inputs :
9+ reason :
10+ description : ' Reason for manual check'
11+ required : false
12+ default : ' Manual monitoring check'
13+
14+ jobs :
15+ monitor-docker-tags :
16+ name : Monitor Docker Tags
17+ runs-on : ubuntu-latest
18+ steps :
19+ - name : Checkout code
20+ uses : actions/checkout@v4
21+ with :
22+ fetch-depth : 0
23+
24+ - name : Check Docker Tags vs Git Tags
25+ id : check
26+ run : |
27+ echo "🔍 Checking Docker images for Git tags..."
28+
29+ # Get all version tags (v*.*.*)
30+ git_tags=$(git tag -l "v*.*.*" | grep -v "-" | sort -V | tail -10)
31+ missing_tags=()
32+
33+ for tag in $git_tags; do
34+ echo "Checking tag: $tag"
35+
36+ # Check if Docker image exists on Docker Hub
37+ response=$(curl -s -o /dev/null -w "%{http_code}" "https://hub.docker.com/v2/repositories/johandevl/export-trakt-4-letterboxd/tags/${tag}/")
38+
39+ if [ "$response" != "200" ]; then
40+ echo "❌ Missing Docker image for tag: $tag"
41+ missing_tags+=("$tag")
42+ else
43+ echo "✅ Docker image exists for tag: $tag"
44+ fi
45+
46+ # Small delay to avoid rate limiting
47+ sleep 1
48+ done
49+
50+ # Check if latest tag is up to date
51+ latest_git_tag=$(echo "$git_tags" | tail -1)
52+ echo "Latest git tag: $latest_git_tag"
53+
54+ # Get the tag that Docker's 'latest' currently points to
55+ latest_docker_response=$(curl -s "https://hub.docker.com/v2/repositories/johandevl/export-trakt-4-letterboxd/tags/latest/")
56+
57+ if [ ${#missing_tags[@]} -gt 0 ]; then
58+ echo "found_missing=true" >> $GITHUB_OUTPUT
59+ echo "missing_tags=${missing_tags[*]}" >> $GITHUB_OUTPUT
60+ echo "📊 Summary: Found ${#missing_tags[@]} missing Docker images"
61+ else
62+ echo "found_missing=false" >> $GITHUB_OUTPUT
63+ echo "📊 Summary: All recent tags have Docker images ✅"
64+ fi
65+
66+ - name : Trigger CI/CD for Missing Tags
67+ if : steps.check.outputs.found_missing == 'true'
68+ uses : actions/github-script@v7
69+ with :
70+ github-token : ${{ secrets.PAT_TOKEN || secrets.GITHUB_TOKEN }}
71+ script : |
72+ const missingTags = '${{ steps.check.outputs.missing_tags }}'.split(' ');
73+
74+ for (const tag of missingTags) {
75+ if (tag.trim()) {
76+ console.log(`🚀 Triggering CI/CD for missing tag: ${tag}`);
77+
78+ try {
79+ const response = await github.rest.actions.createWorkflowDispatch({
80+ owner: context.repo.owner,
81+ repo: context.repo.repo,
82+ workflow_id: 'ci-cd.yml',
83+ ref: tag,
84+ inputs: {
85+ reason: `Auto-triggered by monitor for missing Docker image: ${tag}`
86+ }
87+ });
88+
89+ console.log(`✅ Successfully triggered workflow for ${tag}`);
90+ } catch (error) {
91+ console.error(`❌ Failed to trigger workflow for ${tag}:`, error.message);
92+
93+ // If workflow_dispatch fails, we might need to retag
94+ console.log(`🔄 Attempting to retag ${tag} to trigger build...`);
95+
96+ // This would require push permissions and might create a new commit
97+ // For now, just log the issue
98+ core.setFailed(`Failed to trigger build for ${tag}. Manual intervention required.`);
99+ }
100+ }
101+ }
102+
103+ - name : Create Issue for Missing Tags
104+ if : steps.check.outputs.found_missing == 'true'
105+ uses : actions/github-script@v7
106+ with :
107+ github-token : ${{ secrets.PAT_TOKEN || secrets.GITHUB_TOKEN }}
108+ script : |
109+ const missingTags = '${{ steps.check.outputs.missing_tags }}'.split(' ').filter(tag => tag.trim());
110+
111+ if (missingTags.length > 0) {
112+ const issueTitle = `🐳 Missing Docker Images for Git Tags`;
113+ const issueBody = `## Missing Docker Images
114+
115+ The following Git tags do not have corresponding Docker images on Docker Hub :
116+
117+ ${missingTags.map(tag => `- \`${tag}\``).join('\n')}
118+
119+ # ## Possible Causes:
120+ 1. **Workflow Trigger Issue** : The CI/CD workflow was not triggered when these tags were created
121+ 2. **Build Failure** : The Docker build failed for these tags
122+ 3. **Token Permissions** : The auto-tag workflow lacks permissions to trigger CI/CD
123+
124+ # ## Recommended Actions:
125+ 1. Check the CI/CD workflow runs for these tags
126+ 2. Manually trigger the CI/CD workflow if needed :
127+ \`\`\`bash
128+ gh workflow run ci-cd.yml --ref TAG_NAME -f reason="Manual trigger for missing Docker image"
129+ \`\`\`
130+ 3. Verify that PAT_TOKEN secret has proper permissions
131+
132+ # ## Auto-Resolution:
133+ This monitor has already attempted to trigger CI/CD workflows for the missing tags.
134+
135+ ---
136+ *This issue was automatically created by the Docker Tag Monitor workflow.*
137+ *Last check: ${new Date().toISOString()}*`;
138+
139+ // Check if similar issue already exists
140+ const existingIssues = await github.rest.issues.listForRepo({
141+ owner : context.repo.owner,
142+ repo : context.repo.repo,
143+ labels : ['docker', 'automation'],
144+ state : ' open'
145+ });
146+
147+ const existingIssue = existingIssues.data.find(issue =>
148+ issue.title.includes('Missing Docker Images')
149+ );
150+
151+ if (existingIssue) {
152+ // Update existing issue
153+ await github.rest.issues.createComment({
154+ owner : context.repo.owner,
155+ repo : context.repo.repo,
156+ issue_number : existingIssue.number,
157+ body : ` ## Update: ${new Date().toISOString()}
158+
159+ New missing Docker images detected:
160+ ${missingTags.map(tag => ` - \`${tag}\``).join('\n')}
161+
162+ Auto-resolution attempted by triggering CI/CD workflows.`
163+ });
164+
165+ console.log(`Updated existing issue # ${existingIssue.number}`);
166+ } else {
167+ // Create new issue
168+ const newIssue = await github.rest.issues.create({
169+ owner : context.repo.owner,
170+ repo : context.repo.repo,
171+ title : issueTitle,
172+ body : issueBody,
173+ labels : ['docker', 'automation', 'bug']
174+ });
175+
176+ console.log(`Created new issue # ${newIssue.data.number}`);
177+ }
178+ }
179+
180+ - name : Summary
181+ run : |
182+ echo "## 🐳 Docker Tag Monitor Summary" >> $GITHUB_STEP_SUMMARY
183+ echo "" >> $GITHUB_STEP_SUMMARY
184+ echo "### Status" >> $GITHUB_STEP_SUMMARY
185+
186+ if [ "${{ steps.check.outputs.found_missing }}" == "true" ]; then
187+ echo "❌ **Found missing Docker images**" >> $GITHUB_STEP_SUMMARY
188+ echo "" >> $GITHUB_STEP_SUMMARY
189+ echo "### Missing Tags" >> $GITHUB_STEP_SUMMARY
190+ echo "${{ steps.check.outputs.missing_tags }}" | tr ' ' '\n' | sed 's/^/- /' >> $GITHUB_STEP_SUMMARY
191+ echo "" >> $GITHUB_STEP_SUMMARY
192+ echo "### Actions Taken" >> $GITHUB_STEP_SUMMARY
193+ echo "- 🚀 Triggered CI/CD workflows for missing tags" >> $GITHUB_STEP_SUMMARY
194+ echo "- 📝 Created/updated GitHub issue for tracking" >> $GITHUB_STEP_SUMMARY
195+ else
196+ echo "✅ **All recent tags have Docker images**" >> $GITHUB_STEP_SUMMARY
197+ fi
198+
199+ echo "" >> $GITHUB_STEP_SUMMARY
200+ echo "### Next Steps" >> $GITHUB_STEP_SUMMARY
201+ echo "- Monitor CI/CD workflow runs" >> $GITHUB_STEP_SUMMARY
202+ echo "- Verify Docker images are created successfully" >> $GITHUB_STEP_SUMMARY
203+ echo "- Check that \`latest\` tag points to the most recent release" >> $GITHUB_STEP_SUMMARY
0 commit comments