Skip to content

MediaWarp Build and Release #4

MediaWarp Build and Release

MediaWarp Build and Release #4

Workflow file for this run

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 }}