[PORTER]nginx:latest #13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: docker image mirror | |
on: | |
issues: | |
types: [opened] | |
env: | |
RED: \033[1;31m | |
GREEN: \033[1;32m | |
YELLOW: \033[1;33m | |
BLUE: \033[1;34m | |
PURPLE: \033[1;35m | |
CYAN: \033[1;36m | |
BLANK: \033[0m | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
outputs: | |
DOCKER_IMAGE: ${{ steps.pullIssuesPorter.outputs.DOCKER_IMAGE }} | |
SUCCESS: ${{ steps.successCheck.outputs.SUCCESS }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Get porter issues | |
id: pullIssuesPorter | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
script: | | |
// 使用 title 获取镜像名和tag | |
const title = context?.payload?.issue?.title; | |
// 使用 body 获取其它参数 | |
const body = context?.payload?.issue?.body || ''; | |
const reg = new RegExp("\\[PORTER\\]", "g"); | |
let docker_image = title.replace(reg, "").trim(); | |
const issues_author = context?.payload?.issue?.user?.login; | |
// 为了防止 image 不带tag,自动添加 latest | |
if(!docker_image.includes(":")) { | |
docker_image = `${docker_image}:latest` | |
} | |
let comment_body = ''; | |
let is_error = false; | |
if( docker_image.includes("@")){ | |
is_error = true; | |
comment_body = '@' + issues_author +' 拉取镜像不支持带摘要信息,请去除 @部分' | |
}else{ | |
comment_body = `构建进展,详见 [构建任务](https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${{github.run_id}})` | |
} | |
const issuesComment = await github.rest.issues.createComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
body: comment_body | |
}); | |
console.log("create issues comment resp:", issuesComment["status"]); | |
if(is_error){ | |
core.setFailed("Error"); | |
}else if (!docker_image){ | |
core.setFailed("No Images"); | |
} | |
core.setOutput('DOCKER_IMAGE', docker_image); | |
core.setOutput('BUILD_ARGS', body); | |
- name: Retrieve transfer image name | |
id: transferImage | |
run: | | |
echo "${{ steps.pullIssuesPorter.outputs.DOCKER_IMAGE }}" > docker_images.list | |
- name: Sync image | |
id: syncImage | |
env: | |
DEST_HARBOR_URL: ${{ vars.DEST_HARBOR_URL }} | |
shell: bash | |
run: | | |
bash jenkins_sync_docker_images.sh docker_images.list | |
originalImageUrl="${{ steps.pullIssuesPorter.outputs.DOCKER_IMAGE }}" | |
# 计算原始镜像URL中 '/' 的数量 | |
slashCount=$(grep -o "/" <<< "$originalImageUrl" | wc -l) | |
# 根据 '/' 的数量提取镜像名称和标签 | |
if [ $slashCount -gt 1 ]; then | |
imageNameWithTag=$(echo $originalImageUrl | awk -F/ '{print $NF}') | |
else | |
imageNameWithTag=$originalImageUrl | |
fi | |
# 构建新的镜像URL | |
newImageUrl="$DEST_HARBOR_URL/library/$imageNameWithTag" | |
echo "New Image URL: $newImageUrl" | |
# 将新的镜像URL设置为GitHub Actions环境变量 | |
echo "NEW_IMAGE_URL=$newImageUrl" >> $GITHUB_ENV | |
- name: Success check | |
id: successCheck | |
uses: actions/github-script@v7 | |
if: ${{ success() }} | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
script: | | |
core.setOutput('SUCCESS', true); | |
- name: Close Porter Issues | |
id: closePorterIssues | |
uses: actions/github-script@v7 | |
if: ${{ always() }} | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
script: | | |
const issuesResponse = await github.rest.issues.update({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
state: 'closed' | |
}); | |
console.log("update issues resp:", issuesResponse["status"] == 200 ? "success" : "failed" ); | |
let comment_body = `转换失败,详见 [构建任务](https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${{github.run_id}})`; | |
let success = String(${{ steps.successCheck.outputs.SUCCESS }}).toLowerCase() == "true"; | |
console.log("is success?", success); | |
let labels = []; | |
if(success){ | |
comment_body = "转换完成 <br/>\n```bash \n#原镜像\n${{ steps.pullIssuesPorter.outputs.DOCKER_IMAGE }}\n\n\n#转换后镜像\n${{ env.NEW_IMAGE_URL }}\n\n\n```" | |
labels=['success'] | |
}else{ | |
const jobsResponse = await github.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/actions/runs/${{github.run_id}}/jobs`, { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
run_id: ${{ github.run_id }} | |
}); | |
console.log("jobs",jobsResponse['data']); | |
comment_body += "\n\n 日志:\n\n"; | |
for(let job of jobsResponse['data']['jobs']){ | |
comment_body += "- [" + job.name + "](" + job.html_url +")"; | |
} | |
labels = ['failure']; | |
} | |
// 创建 issues comment | |
const issuesComment = await github.rest.issues.createComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
body: comment_body | |
}); | |
console.log("create issues comment resp:", issuesComment["status"] == 201 ? "success" : "failed" ); | |
// 更新 issues label | |
if(labels){ | |
await github.rest.issues.addLabels({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: context.issue.number, | |
labels: labels | |
}); | |
} |