Skip to content

Commit e75a0c2

Browse files
authored
feat: Add GitHub Action for Dockerfile release update and slack notification (#38)
* first commit, added workflow for check release * test check release * test check release * test check release * test check release with changelog * test with some fix * test with some fix 2 * test with some fix 3 * test with some fix 4 * test with some fix 5 * test with some fix 6 * test with some fix 7 * test minor * test new dockerfile change * test new dockerfile change 2 * test new dockerfile change 3 * test new dockerfile change 4 * test new dockerfile change 5 * test new dockerfile change 6 * test new dockerfile change 7 * test new dockerfile change 8 * test new dockerfile change 9 * test new dockerfile change 10 * test new dockerfile change 11 * test new dockerfile change 12 * test new dockerfile change 13 * test new dockerfile change 14 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 15 * test new dockerfile change 16 * test new dockerfile change 17 * test new dockerfile change 17 * test new dockerfile change 18 * test new dockerfile change 19 * test new dockerfile change 19 * test new dockerfile change 19 * test branch creation * test branch creation 2 * test branch creation 3 * test branch creation 4 * test slack notification * test slack notification and new branch version * test slack notification * test branch creation * test sha * test sha arch * fixed form and sha * added new PR action end gitignore update * removed on push trigger * minor * minor * edit actions/github-script to use sha * replaced PR creation with git commands * fixed branch exist check * test GH commands for variables * added new slack action * edit action name * test token * test token * re enabled branch creation, PR and slack notification * removed release.json * removed duplicate env, updated ubuntu ref and added environment * test env variable set * restore * branch exist var fixed * fix: re added release.json check - test no file * fix: re added release.json check - test 2 no file * fix: re added release.json check - test branch exist * fix: re added release.json check - test file exist not updated * fix: re added release.json check - test file exist updated * fix: removed env configuration and GH PAT secret call * fix: minor * fix: Update Dockerfile to latest * fix: removed old vars
1 parent b585052 commit e75a0c2

File tree

5 files changed

+210
-1
lines changed

5 files changed

+210
-1
lines changed

.github/workflows/check-release.yml

+202
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
name: Check Release and Update Dockerfile
2+
3+
on:
4+
workflow_dispatch:
5+
schedule:
6+
- cron: '0 9 * * *' # Execute everyday at 9 AM
7+
8+
jobs:
9+
check-release:
10+
runs-on: ubuntu-22.04
11+
environment: prod
12+
permissions:
13+
id-token: write
14+
contents: write
15+
pull-requests: write
16+
env:
17+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18+
steps:
19+
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
20+
name: Checkout
21+
22+
- name: Get latest release from another repo
23+
id: get_release
24+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
25+
with:
26+
script: |
27+
const latestRelease = await github.rest.repos.getLatestRelease({
28+
owner: 'actions',
29+
repo: 'runner'
30+
});
31+
const releaseInfo = {
32+
tag_name: latestRelease.data.tag_name,
33+
sha: latestRelease.data.target_commitish,
34+
};
35+
console.log(JSON.stringify(releaseInfo));
36+
return JSON.stringify(releaseInfo);
37+
38+
- name: Define release outputs
39+
id: release_outputs
40+
run: |
41+
release_info="${{ steps.get_release.outputs.result }}"
42+
tag_name=$(echo "$release_info" | jq -r '.tag_name')
43+
sha=$(echo "$release_info" | jq -r '.sha')
44+
short_tag_name=$(echo "$tag_name" | sed 's/^v//')
45+
46+
echo "tag_name=$tag_name" >> "$GITHUB_OUTPUT"
47+
echo "sha=$sha" >> "$GITHUB_OUTPUT"
48+
echo "short_tag_name=$short_tag_name" >> "$GITHUB_OUTPUT"
49+
50+
# Check if the release has changed
51+
# if release.json file exist and the current tag and sha are the same as the latest release, then no changes have been made
52+
# if release.json file does not exist or exist but the current tag and sha are different, then the release will be considered as changed
53+
54+
- name: Check if release has changed
55+
id: check_release_changes
56+
run: |
57+
new_tag=${{ steps.release_outputs.outputs.tag_name }}
58+
new_sha=${{ steps.release_outputs.outputs.sha }}
59+
60+
if [ -f release.json ]; then
61+
current_tag=$(jq -r '.current_tag' release.json)
62+
current_sha=$(jq -r '.current_sha' release.json)
63+
64+
if [[ "$current_tag" == "$new_tag" && "$current_sha" == "$new_sha" ]]; then
65+
echo "No changes in release."
66+
echo "release_changed=false" >> "$GITHUB_OUTPUT"
67+
else
68+
echo "Release has changed."
69+
echo "release_changed=true" >> "$GITHUB_OUTPUT"
70+
71+
# Update release.json
72+
jq -n --arg new_tag "$new_tag" --arg new_sha "$new_sha" \
73+
'{current_tag: $new_tag, current_sha: $new_sha}' > release.json
74+
cat release.json
75+
fi
76+
else
77+
echo "Release is changed, file release.json does not exist."
78+
echo "release_changed=true" >> "$GITHUB_OUTPUT"
79+
80+
# Create release.json
81+
jq -n --arg new_tag "$new_tag" --arg new_sha "$new_sha" \
82+
'{current_tag: $new_tag, current_sha: $new_sha}' > release.json
83+
84+
cat release.json
85+
fi
86+
87+
# Retrieve the SHA of the latest release for the linux/amd64 architecture.
88+
# To accomplish this, we fetch all versions and identify the 5th version, which corresponds to the latest release with that specific architecture.
89+
# Reference: https://docs.github.com/en/rest/packages/packages?apiVersion=2022-11-28#list-package-versions-for-a-package-owned-by-an-organization
90+
## NOTE: The SHA obtained in this step differs from the previous one, as it represents the branch commit SHA used for change verification.
91+
92+
- name: Get Docker image digests
93+
if: steps.check_release_changes.outputs.release_changed == 'true'
94+
id: get_digests
95+
run: |
96+
digests=$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" /orgs/actions/packages/container/actions-runner/versions)
97+
latest_digest=$(echo "$digests" | jq -r '.[] | select(.metadata.container.tags | index("latest")) | .name')
98+
echo $latest_digest
99+
echo "arch_sha_name=$latest_digest" >> "$GITHUB_OUTPUT"
100+
101+
- name: Get changelog file
102+
id: changelog
103+
run: |
104+
if [ ! -f CHANGELOG.md ]; then
105+
echo "Changelog file does not exist. Creating one..."
106+
touch CHANGELOG.md
107+
fi
108+
109+
- name: Update Changelog
110+
if: steps.check_release_changes.outputs.release_changed == 'true'
111+
id: update_changelog
112+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
113+
with:
114+
script: |
115+
const fs = require('fs');
116+
const changelogPath = 'CHANGELOG.md';
117+
const dockerImage = `docker pull ghcr.io/actions/runner:${{ steps.release_outputs.outputs.tag_name }}@${{ steps.get_digests.outputs.arch_sha_name }}`;
118+
119+
const changelogEntry = `## ${{ steps.release_outputs.outputs.tag_name }}\n- Docker Image: \`${dockerImage}\`\n`;
120+
121+
const changelogContent = fs.readFileSync(changelogPath, 'utf8');
122+
fs.writeFileSync(changelogPath, `${changelogEntry}\n${changelogContent}`);
123+
124+
- name: Update Dockerfile
125+
if: steps.check_release_changes.outputs.release_changed == 'true'
126+
id: update_dockerfile
127+
run: |
128+
echo "Updating Dockerfile..."
129+
130+
# Construct the new FROM statement
131+
new_from="FROM ghcr.io/actions/actions-runner:${{ steps.release_outputs.outputs.short_tag_name }}@${{ steps.get_digests.outputs.arch_sha_name }} AS base"
132+
133+
# Replace the first line with the new FROM statement
134+
sed -i "1s|.*|$new_from|" Dockerfile
135+
136+
echo "Dockerfile updated."
137+
138+
- name: Set up Git
139+
if: steps.check_release_changes.outputs.release_changed == 'true'
140+
id: git_setup
141+
run: |
142+
git config --global user.email "[email protected]"
143+
git config --global user.name "GitHub Action"
144+
145+
echo "branch_name=update-release-to-${{ steps.release_outputs.outputs.tag_name }}" >> $GITHUB_OUTPUT
146+
147+
- name: Create branch
148+
if: steps.check_release_changes.outputs.release_changed == 'true'
149+
id: create_branch
150+
run: |
151+
if git ls-remote --exit-code --heads origin ${{ steps.git_setup.outputs.branch_name }}; then
152+
echo "Branch ${{ steps.git_setup.outputs.branch_name }} already exists"
153+
echo "branch_exist=true" >> "$GITHUB_OUTPUT"
154+
else
155+
git checkout -b ${{ steps.git_setup.outputs.branch_name }}
156+
git add release.json
157+
git add Dockerfile
158+
git add CHANGELOG.md
159+
git commit -m "Update release to ${{ steps.release_outputs.outputs.tag_name }}"
160+
git push origin ${{ steps.git_setup.outputs.branch_name }}
161+
echo "branch_exist=false" >> "$GITHUB_OUTPUT"
162+
fi
163+
164+
- name: Create PR
165+
if: ${{ steps.check_release_changes.outputs.release_changed == 'true' && steps.create_branch.outputs.branch_exist == 'false' }}
166+
run: |
167+
gh pr create --title 'fix: Update Dockerfile image Release to ${{ steps.release_outputs.outputs.tag_name }}' --body 'Update Dockerfile image release to ${{ steps.release_outputs.outputs.tag_name }} with sha ${{ steps.get_digests.outputs.arch_sha_name }}' --base main --head ${{ steps.git_setup.outputs.branch_name }}
168+
169+
- name: Slack Notification
170+
if: ${{ always() && (env.SLACK_WEBHOOK_URL) && steps.check_release_changes.outputs.release_changed == 'true' }}
171+
uses: slackapi/slack-github-action@70cd7be8e40a46e8b0eced40b0de447bdb42f68e #v1.26.0
172+
with:
173+
payload: |
174+
{
175+
"text":"${{ job.status }}",
176+
"blocks":[
177+
{
178+
"type":"section",
179+
"text":{
180+
"type":"mrkdwn",
181+
"text":":white_check_mark: New Release identified [${{ steps.release_outputs.outputs.tag_name }}]"
182+
}
183+
},
184+
{
185+
"type":"section",
186+
"text":{
187+
"type":"mrkdwn",
188+
"text":"*Check for New Release and Update Dockerfile* - Release:\n - Tag: ${{ steps.release_outputs.outputs.tag_name }}\n - Branch SHA: ${{ steps.release_outputs.outputs.sha }}\n - Release URL: https://github.com/actions/runner/releases/tag/${{ steps.release_outputs.outputs.tag_name }}\n"
189+
}
190+
},
191+
{
192+
"type":"section",
193+
"text":{
194+
"type":"mrkdwn",
195+
"text":"*Linked Repo*: <https://github.com/${{github.repository}}|${{github.repository}}>\n"
196+
}
197+
}
198+
]
199+
}
200+
env:
201+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
202+
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
.tmp
2+
.secrets

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
## v2.318.0
2+
- Docker Image: `docker pull ghcr.io/actions/runner:v2.318.0@sha256:b05be064f0b30ac9d1ec0526f9429f7df2da45379b0cf50f1fda97793e1bd416`

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM ghcr.io/actions/actions-runner:2.317.0@sha256:95db6fbb020b9f734e8a00389291dae766f0e6ad3d1171ae2d68e9ad8ac4a985 AS base
1+
FROM ghcr.io/actions/actions-runner:2.318.0@sha256:b05be064f0b30ac9d1ec0526f9429f7df2da45379b0cf50f1fda97793e1bd416 AS base
22

33
USER root
44

release.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"current_tag": "v2.318.0",
3+
"current_sha": "5e57957c98c80bcdcc357fd42472349826cd76ad"
4+
}

0 commit comments

Comments
 (0)