CI: frontend ci improve. #2159
Workflow file for this run
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: 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 }}' |