perfect: 优化图像缓存中间件逻辑,简化条件判断 #7
This file contains hidden or 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: MediaWarp Build and Release | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| tags: | |
| - v* | |
| paths: | |
| - "**.go" | |
| - "go.mod" | |
| - "go.sum" | |
| permissions: | |
| contents: write | |
| packages: write | |
| actions: write | |
| jobs: | |
| release: | |
| runs-on: ubuntu-latest | |
| env: | |
| IS_RELEASE: ${{ startsWith(github.ref, 'refs/tags/') }} | |
| PRE_RELEASE_TAG: pre-release | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: true | |
| fetch-depth: 0 | |
| - name: Set up Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version-file: "go.mod" # 使用 go.mod 文件中的 golang 版本 | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to DockerHub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Run GoReleaser (tag release) | |
| if: ${{ env.IS_RELEASE == 'true' }} | |
| uses: goreleaser/goreleaser-action@v6 | |
| with: | |
| distribution: goreleaser | |
| version: "~> v2" | |
| args: release --clean --verbose | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Run GoReleaser (pre-release for branch push) | |
| if: ${{ env.IS_RELEASE != 'true' }} | |
| uses: goreleaser/goreleaser-action@v6 | |
| with: | |
| distribution: goreleaser | |
| version: "~> v2" | |
| args: release --clean --verbose --snapshot | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Prepare pre-release metadata | |
| if: ${{ env.IS_RELEASE != 'true' }} | |
| id: prerelease_meta | |
| run: | | |
| test -f dist/metadata.json | |
| version="$(jq -r '.version' dist/metadata.json)" | |
| commit="$(jq -r '.commit' dist/metadata.json)" | |
| date="$(jq -r '.date' dist/metadata.json)" | |
| if [ -z "$version" ] || [ "$version" = "null" ]; then | |
| echo "dist/metadata.json missing .version" >&2 | |
| exit 1 | |
| fi | |
| if [ -z "$commit" ] || [ "$commit" = "null" ]; then | |
| echo "dist/metadata.json missing .commit" >&2 | |
| exit 1 | |
| fi | |
| if [ -z "$date" ] || [ "$date" = "null" ]; then | |
| echo "dist/metadata.json missing .date" >&2 | |
| exit 1 | |
| fi | |
| short_commit="${commit::7}" | |
| echo "version=$version" >> $GITHUB_OUTPUT | |
| echo "commit=$commit" >> $GITHUB_OUTPUT | |
| echo "short_commit=$short_commit" >> $GITHUB_OUTPUT | |
| echo "date=$date" >> $GITHUB_OUTPUT | |
| - name: Push Docker images from GoReleaser artifacts | |
| if: ${{ env.IS_RELEASE != 'true' }} | |
| run: | | |
| test -f dist/artifacts.json | |
| mapfile -t image_refs < <(jq -r '.[] | select(.type=="Docker Image") | .name' dist/artifacts.json) | |
| if [ "${#image_refs[@]}" -eq 0 ]; then | |
| echo "No Docker images found in dist/artifacts.json" >&2 | |
| exit 1 | |
| fi | |
| for ref in "${image_refs[@]}"; do | |
| docker image inspect "$ref" >/dev/null 2>&1 || { | |
| echo "Local docker image not found: $ref" >&2 | |
| exit 1 | |
| } | |
| docker push "$ref" | |
| done | |
| docker buildx imagetools create \ | |
| -t "akimio/mediawarp:${{ steps.prerelease_meta.outputs.version }}" \ | |
| "${image_refs[@]}" | |
| docker buildx imagetools create \ | |
| -t "akimio/mediawarp:prerelease-latest" \ | |
| "${image_refs[@]}" | |
| - name: Cleanup existing pre-releases | |
| if: ${{ env.IS_RELEASE != 'true' }} | |
| uses: actions/github-script@v7 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| const owner = context.repo.owner; | |
| const repo = context.repo.repo; | |
| const releases = await github.paginate(github.rest.repos.listReleases, { | |
| owner, | |
| repo, | |
| per_page: 100, | |
| }); | |
| const prereleases = releases.filter((r) => r.prerelease); | |
| core.info(`Found ${prereleases.length} existing prerelease(s)`); | |
| for (const rel of prereleases) { | |
| core.info(`Deleting prerelease id=${rel.id} tag=${rel.tag_name}`); | |
| await github.rest.repos.deleteRelease({ owner, repo, release_id: rel.id }); | |
| try { | |
| await github.rest.git.deleteRef({ owner, repo, ref: `tags/${rel.tag_name}` }); | |
| core.info(`Deleted tag refs/tags/${rel.tag_name}`); | |
| } catch (error) { | |
| if (error.status !== 404) throw error; | |
| core.info(`Tag refs/tags/${rel.tag_name} already absent`); | |
| } | |
| } | |
| - name: Create GitHub pre-release and upload artifacts | |
| if: ${{ env.IS_RELEASE != 'true' }} | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ env.PRE_RELEASE_TAG }} | |
| target_commitish: ${{ steps.prerelease_meta.outputs.commit }} | |
| name: ${{ steps.prerelease_meta.outputs.version }} | |
| prerelease: true | |
| generate_release_notes: true | |
| files: | | |
| dist/*.tar.gz | |
| dist/*.zip | |
| dist/*checksums*.txt | |
| dist/config.yaml | |
| LICENSE | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |