-
Notifications
You must be signed in to change notification settings - Fork 4
137 lines (118 loc) · 4.67 KB
/
preview.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
name: PR Docker Image Workflow
on:
pull_request:
types: [opened, synchronize, reopened, closed]
jobs:
# Build and push Docker image, then comment on PR
build-and-comment:
if: github.event.action != 'closed'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Lowercase repository name
id: repo-name
run: |
echo "REPO_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
tags: ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}/pr-${{ github.event.pull_request.number }}:latest
- name: Comment on PR
uses: actions/github-script@v7
with:
script: |
const imageName = `ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}/pr-${context.issue.number}:latest`;
const commentBody = `📦 Docker image for this PR is available at: \`${imageName}\`
You can pull it with:
\`\`\`
docker pull ${imageName}
docker run ${imageName}
\`\`\``;
// Get all comments on the PR
const comments = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number
});
// Look for an existing Docker image comment
const dockerComment = comments.data.find(comment =>
comment.body.includes('📦 Docker image for this PR is available at:')
);
if (dockerComment) {
// Update existing comment
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: dockerComment.id,
body: commentBody
});
} else {
// Create new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: commentBody
});
}
# Delete Docker image when PR is closed/merged
delete-image:
if: github.event.action == 'closed'
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Lowercase repository name
id: repo-name
run: |
echo "OWNER=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
echo "REPO=$(echo '${{ github.repository }}' | cut -d '/' -f 2 | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
- name: Delete Docker image
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = '${{ steps.repo-name.outputs.OWNER }}';
const repo = '${{ steps.repo-name.outputs.REPO }}';
const package_name = `${repo}/pr-${context.issue.number}`;
console.log(`Attempting to delete package: ${package_name}`);
try {
// For organization repos
await github.rest.packages.deletePackageForOrg({
package_type: 'container',
package_name: package_name,
org: owner
});
console.log('Package deleted successfully via org API');
} catch (orgError) {
console.log(`Error deleting via org API: ${orgError.message}`);
try {
// For user repos
await github.rest.packages.deletePackageForUser({
package_type: 'container',
package_name: package_name,
username: owner
});
console.log('Package deleted successfully via user API');
} catch (userError) {
console.log(`Error deleting via user API: ${userError.message}`);
}
}