Skip to content

CI: frontend ci improve. #2159

CI: frontend ci improve.

CI: frontend ci improve. #2159

Workflow file for this run

name: Build Frontend Image
on:
create:
tags:
workflow_call:
inputs:
push_image:
description: 'Push image'
required: false
type: boolean
default: false
push_image_tag:
description: 'Push image tag'
default: 'latest'
required: false
type: string
workflow_dispatch:
inputs:
push_image:
description: 'Push image'
required: false
type: boolean
default: false
push_image_tag:
description: 'Push image tag'
default: 'latest'
required: false
type: string
push:
branches: ['main']
paths:
- 'frontend/desktop/**'
- 'frontend/providers/**'
- '.github/workflows/frontend.yml'
- '!**/*.md'
- '!**/*.yaml'
pull_request:
branches: ['*']
paths:
- 'frontend/desktop/**'
- 'frontend/providers/**'
- '.github/workflows/frontend.yml'
- '!**/*.md'
- '!**/*.yaml'
env:
# Common versions
GO_VERSION: '1.20'
DEFAULT_OWNER: 'labring'
jobs:
determine-changes:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
has_changes: ${{ steps.set-matrix.outputs.has_changes }}
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v35
- name: Set matrix
id: set-matrix
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" || "${{ github.event_name }}" == "workflow_call" ]]; then
MODULES=$(find frontend -maxdepth 2 \( -name desktop -o -path '*/providers/*' \) -type d | sed 's|frontend/||' | jq -R -s -c 'split("\n")[:-1]')
elif echo '${{ steps.changed-files.outputs.all_modified_files }}' | grep -q '^frontend/package/'; then
MODULES=$(find frontend -maxdepth 2 \( -name desktop -o -path '*/providers/*' \) -type d | sed 's|frontend/||' | jq -R -s -c 'split("\n")[:-1]')
else
echo 'changed files'
echo '${{ steps.changed-files.outputs.all_modified_files }}'
MODULES=$(echo '${{ steps.changed-files.outputs.all_modified_files }}' | tr ' ' '\n' | grep -E '^frontend/(desktop|providers/[^/]+)/' | sed 's|frontend/||' | awk -F'/' '{if($1=="desktop") print $1; else if($1=="providers") print $1"/"$2}' | sort -u | jq -R -s -c 'split("\n")[:-1]')
fi
echo "matrix=${MODULES}"
echo "matrix=${MODULES}" >> $GITHUB_OUTPUT
if [[ "${MODULES}" == "[]" ]]; then
echo "has_changes=false" >> $GITHUB_OUTPUT
else
echo "has_changes=true" >> $GITHUB_OUTPUT
fi
image-build:
needs:
- determine-changes
if: needs.determine-changes.outputs.has_changes == 'true'
runs-on: ubuntu-latest
strategy:
matrix:
module: ${{ fromJson(needs.determine-changes.outputs.matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Expose git commit data
uses: rlespinasse/git-commit-data-action@v1
- name: Check if tag
id: check_tag
run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "isTag=true" >> "$GITHUB_OUTPUT"
else
echo "isTag=false" >> "$GITHUB_OUTPUT"
fi
- name: Prepare
id: prepare
run: |
bash ./scripts/resolve-tag-image.sh "${{ inputs.push_image }}" "${{ steps.check_tag.outputs.isTag }}" "${{ inputs.push_image_tag }}"
- name: Extract module name
id: module_name
run: |
MODULE_NAME=$(basename ${{ matrix.module }})
echo "MODULE_NAME=${MODULE_NAME}" >> $GITHUB_ENV
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
ghcr.io/${{ github.repository_owner }}/sealos-${{ env.MODULE_NAME }}-frontend
tags: |
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'main') }}
type=raw,value=${{ steps.prepare.outputs.tag_name }},enable=true
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Github Container Hub
if: ${{ (github.event_name == 'push') ||(github.event_name == 'create') || (inputs.push_image == true) }}
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GH_PAT }}
- name: Cache pnpm-store
uses: actions/cache@v3
with:
path: pnpm-store
key: pnpm-store-${{ hashFiles('Dockerfile') }}
- name: inject pnpm-store into docker
uses: reproducible-containers/[email protected]
with:
cache-source: pnpm-store
- name: Build And Push
uses: docker/build-push-action@v4
with:
context: ./frontend
file: ./frontend/Dockerfile
platforms: linux/amd64,linux/arm64
build-args: |
name=${{ env.MODULE_NAME }}
path=${{ matrix.module }}
# Push if it's a push event or if push_image is true
push: ${{ (github.event_name == 'push') ||(github.event_name == 'create') || (inputs.push_image == true) }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
save-sealos:
uses: ./.github/workflows/import-save-sealos.yml
cluster-image-build:
if: ${{ (github.event_name == 'push') ||(github.event_name == 'create') || (inputs.push_image == true) }}
needs:
- image-build
- save-sealos
- determine-changes
runs-on: ubuntu-latest
strategy:
matrix:
module: ${{ fromJson(needs.determine-changes.outputs.matrix) }}
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Extract module name
id: module_name
run: |
MODULE_NAME=$(basename ${{ matrix.module }})
echo "MODULE_NAME=${MODULE_NAME}" >> $GITHUB_ENV
- name: Expose git commit data
uses: rlespinasse/git-commit-data-action@v1
- name: Check if tag
id: check_tag
run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "isTag=true" >> "$GITHUB_OUTPUT"
else
echo "isTag=false" >> "$GITHUB_OUTPUT"
fi
- name: Prepare
id: prepare
run: |
tag_name=$(bash ./scripts/resolve-tag-image.sh "${{ inputs.push_image }}" "${{ steps.check_tag.outputs.isTag }}" "${{ inputs.push_image_tag }}")
echo old_docker_repo=ghcr.io/labring/sealos-${{ env.MODULE_NAME }}-frontend >> $GITHUB_OUTPUT
echo old_docker_image=ghcr.io/labring/sealos-${{ env.MODULE_NAME }}-frontend:latest >> $GITHUB_OUTPUT
echo new_docker_repo=ghcr.io/${{ github.repository_owner }}/sealos-${{ env.MODULE_NAME }}-frontend >> $GITHUB_OUTPUT
echo new_docker_image=ghcr.io/${{ github.repository_owner }}/sealos-${{ env.MODULE_NAME }}-frontend:${tag_name} >> $GITHUB_OUTPUT
echo cluster_repo=ghcr.io/${{ github.repository_owner }}/sealos-cloud-${{ env.MODULE_NAME }}-frontend >> $GITHUB_OUTPUT
echo cluster_image=ghcr.io/${{ github.repository_owner }}/sealos-cloud-${{ env.MODULE_NAME }}-frontend:${tag_name} >> $GITHUB_OUTPUT
echo latest_cluster_image=ghcr.io/${{ github.repository_owner }}/sealos-cloud-${{ env.MODULE_NAME }}-frontend:latest >> $GITHUB_OUTPUT
- name: Download sealos
uses: actions/download-artifact@v3
with:
name: sealos
path: /tmp/
- name: Verify sealos
run: |
sudo chmod a+x /tmp/sealos
sudo mv /tmp/sealos /usr/bin/sealos
sudo sealos version
- name: Sealos login to ghcr.io
run: |
sudo sealos login -u ${{ github.repository_owner }} -p ${{ secrets.GH_PAT }} --debug ghcr.io
- name: Build ${{ env.MODULE_NAME }}-frontend cluster image
working-directory: frontend/${{ matrix.module }}/deploy
run: |
sudo sed -i "s;${{ steps.prepare.outputs.old_docker_image }};${{ steps.prepare.outputs.new_docker_image }};" manifests/*
sudo sealos build -t ${{ steps.prepare.outputs.cluster_image }}-amd64 --platform linux/amd64 -f Kubefile
sudo sealos build -t ${{ steps.prepare.outputs.latest_cluster_image }}-amd64 --platform linux/amd64 -f Kubefile
# delete old registry cache
sudo rm -rf registry
sudo sealos build -t ${{ steps.prepare.outputs.cluster_image }}-arm64 --platform linux/arm64 -f Kubefile
sudo sealos build -t ${{ steps.prepare.outputs.latest_cluster_image }}-arm64 --platform linux/arm64 -f Kubefile
- name: Manifest Cluster Images
run: |
sudo sealos images
bash docker/patch/manifest-cluster-images.sh ${{ steps.prepare.outputs.cluster_image }}
bash docker/patch/manifest-cluster-images.sh ${{ steps.prepare.outputs.latest_cluster_image }}
env:
OWNER: ${{ github.repository_owner }}
- name: Renew issue and Sync Images for ${{ steps.prepare.outputs.cluster_image }}
uses: labring/[email protected]
if: ${{ github.repository_owner == env.DEFAULT_OWNER }}
with:
version: v0.0.8-rc1
env:
GH_TOKEN: '${{ secrets.GH_PAT }}'
SEALOS_TYPE: 'issue_renew'
SEALOS_ISSUE_TITLE: '[DaylyReport] Auto build for sealos'
SEALOS_ISSUE_BODYFILE: 'scripts/ISSUE_RENEW.md'
SEALOS_ISSUE_LABEL: 'dayly-report'
SEALOS_ISSUE_TYPE: 'day'
SEALOS_ISSUE_REPO: 'labring-actions/cluster-image'
SEALOS_COMMENT_BODY: '/imagesync ${{ steps.prepare.outputs.cluster_image }}'
- name: Renew issue and Sync Images for ${{ steps.prepare.outputs.latest_cluster_image }}
uses: labring/[email protected]
if: ${{ github.repository_owner == env.DEFAULT_OWNER }}
with:
version: v0.0.8-rc1
env:
GH_TOKEN: '${{ secrets.GH_PAT }}'
SEALOS_TYPE: 'issue_renew'
SEALOS_ISSUE_TITLE: '[DaylyReport] Auto build for sealos'
SEALOS_ISSUE_BODYFILE: 'scripts/ISSUE_RENEW.md'
SEALOS_ISSUE_LABEL: 'dayly-report'
SEALOS_ISSUE_TYPE: 'day'
SEALOS_ISSUE_REPO: 'labring-actions/cluster-image'
SEALOS_COMMENT_BODY: '/imagesync ${{ steps.prepare.outputs.latest_cluster_image }}'