From 685646f88ea6ced3867741744b7099007edd596f Mon Sep 17 00:00:00 2001 From: siujamo Date: Fri, 28 Aug 2026 11:14:15 +0800 Subject: [PATCH] ci(github): add release workflows for server/web - add github workflow for server release build and publish - add github workflow for web release package and deploy - adapt release metadata from gitea context to github context - upload release assets via github release action --- .github/workflows/server-build-and-deploy.yml | 95 +++++++++++++++ .github/workflows/web-build-and-deploy.yml | 109 ++++++++++++++++++ 2 files changed, 204 insertions(+) create mode 100644 .github/workflows/server-build-and-deploy.yml create mode 100644 .github/workflows/web-build-and-deploy.yml diff --git a/.github/workflows/server-build-and-deploy.yml b/.github/workflows/server-build-and-deploy.yml new file mode 100644 index 0000000..04bf611 --- /dev/null +++ b/.github/workflows/server-build-and-deploy.yml @@ -0,0 +1,95 @@ +name: Server Build and Deploy + +on: + release: + types: [published] + +permissions: + contents: write + +env: + APP_NAME: ahsarah-guide-server + +jobs: + build-and-release: + runs-on: ubuntu-latest + defaults: + run: + working-directory: server + steps: + - uses: actions/checkout@v4 + + - name: Set up JDK 21 (Corretto) + uses: actions/setup-java@v4 + with: + java-version: 21 + distribution: corretto + cache: gradle + + - name: Build with Gradle + run: > + ./gradlew bootJar -x test + -PartefactVersion="${{ github.event.release.tag_name }}" + -PbuildChannel=stable + -Pvendor=${{ vars.VENDOR }} + + - name: Resolve JAR file path + id: jar + run: | + JAR_PATH=$(find build/libs -name '*.jar' | head -1) + echo "file=$JAR_PATH" >> "$GITHUB_OUTPUT" + + - name: Prepare release asset + id: asset + run: | + TAG="${{ github.event.release.tag_name }}" + FILE="${{ steps.jar.outputs.file }}" + ASSET_NAME="${APP_NAME}-${TAG}.jar" + cp "${FILE}" "../${ASSET_NAME}" + echo "path=${ASSET_NAME}" >> "$GITHUB_OUTPUT" + + - name: Upload JAR to GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: ${{ steps.asset.outputs.path }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_TOKEN }} + + - name: Generate image tags + id: meta + run: | + DOCKERHUB_USER="${{ vars.DOCKER_HUB_USERNAME }}" + echo "tag_version=${DOCKERHUB_USER}/${APP_NAME}:${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT" + echo "tag_latest=${DOCKERHUB_USER}/${APP_NAME}:latest" >> "$GITHUB_OUTPUT" + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: server + file: server/Dockerfile.ci + build-args: | + JAR_FILE=${{ steps.jar.outputs.file }} + IMAGE_VERSION=${{ github.event.release.tag_name }} + IMAGE_VENDOR=${{ vars.VENDOR }} + BUILD_DATE=${{ github.event.release.published_at }} + push: true + tags: | + ${{ steps.meta.outputs.tag_version }} + ${{ steps.meta.outputs.tag_latest }} + + - name: Push README to Docker Hub + uses: christian-korneck/update-container-description-action@v1 + env: + DOCKER_USER: ${{ vars.DOCKER_HUB_USERNAME }} + DOCKER_PASS: ${{ secrets.DOCKER_HUB_TOKEN }} + with: + destination_container_repo: ${{ vars.DOCKER_HUB_USERNAME }}/${{ env.APP_NAME }} + provider: dockerhub + readme_file: server/README.md diff --git a/.github/workflows/web-build-and-deploy.yml b/.github/workflows/web-build-and-deploy.yml new file mode 100644 index 0000000..ff7d205 --- /dev/null +++ b/.github/workflows/web-build-and-deploy.yml @@ -0,0 +1,109 @@ +name: Web Build and Deploy + +on: + release: + types: [published] + +jobs: + build: + name: Build release archive + runs-on: ubuntu-latest + defaults: + run: + working-directory: web + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 24 + cache: pnpm + cache-dependency-path: web/pnpm-lock.yaml + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 11 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build release archive + run: pnpm build:tar + + - name: Clean up previous build artefacts on server + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ vars.DEPLOY_HOST }} + username: ${{ vars.DEPLOY_USER }} + port: ${{ vars.DEPLOY_PORT }} + key: ${{ secrets.DEPLOY_SSH_KEY }} + command: rm -rf /tmp/dist.tar.gz /tmp/dist.tar.gz/ + + - name: Upload artefact to server + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ vars.DEPLOY_HOST }} + username: ${{ vars.DEPLOY_USER }} + port: ${{ vars.DEPLOY_PORT }} + key: ${{ secrets.DEPLOY_SSH_KEY }} + source: "dist.tar.gz" + target: "/tmp/" + + upload-release-asset: + name: Upload to GitHub Release + needs: build + runs-on: ubuntu-latest + + steps: + - name: Download artefact from server + env: + DEPLOY_HOST: ${{ vars.DEPLOY_HOST }} + DEPLOY_USER: ${{ vars.DEPLOY_USER }} + DEPLOY_PORT: ${{ vars.DEPLOY_PORT }} + DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + run: | + set -e + SSH_DIR="${RUNNER_TEMP}/ssh" + mkdir -p "$SSH_DIR" + chmod 700 "$SSH_DIR" + printf '%s\n' "$DEPLOY_SSH_KEY" > "$SSH_DIR/key" + chmod 600 "$SSH_DIR/key" + scp -i "$SSH_DIR/key" \ + -P "$DEPLOY_PORT" \ + -o StrictHostKeyChecking=accept-new \ + -o UserKnownHostsFile="$SSH_DIR/known_hosts" \ + "${DEPLOY_USER}@${DEPLOY_HOST}:/tmp/dist.tar.gz" \ + ./dist.tar.gz + rm -rf "$SSH_DIR" + + - name: Upload release asset to GitHub + uses: softprops/action-gh-release@v2 + with: + files: dist.tar.gz + + deploy-to-server: + name: Deploy to onixbyte.cn + needs: [build, upload-release-asset] + runs-on: ubuntu-latest + + steps: + - name: Extract archive and deploy + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ vars.DEPLOY_HOST }} + username: ${{ vars.DEPLOY_USER }} + port: ${{ vars.DEPLOY_PORT }} + key: ${{ secrets.DEPLOY_SSH_KEY }} + script_stop: true + script: | + set -e + DEPLOY_PATH="${{ vars.DEPLOY_PATH }}" + mkdir -p "$DEPLOY_PATH" + rm -rf "$DEPLOY_PATH"/* + tar -xzf /tmp/dist.tar.gz -C "$DEPLOY_PATH" --strip-components=1 + chown -R caddy:caddy "$DEPLOY_PATH" + rm -f /tmp/dist.tar.gz