Skip to content

try optimize

try optimize #491

name: Build Container
on:
push:
branches:
- main
- dev
- feature/**
paths:
- 'src/BE/**'
- 'src/FE/**'
- '.github/workflows/build-container.yml'
workflow_dispatch:
permissions:
contents: write
jobs:
build-fe:
runs-on: ubuntu-latest
outputs:
is_release: ${{ steps.set_is_release.outputs.is_release }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Cache FE build output
id: fe_build_cache
uses: actions/cache@v4
with:
path: ./src/FE/out
key: ${{ runner.os }}-fe-build-${{ hashFiles('src/FE/**/*.json', 'src/FE/**/*.tsx', 'src/FE/**/*.ts', 'src/FE/**/*.svg', 'src/FE/**/*.png', 'src/FE/**/*.css') }}
- name: Cache node_modules
id: node_modules_cache
if: steps.fe_build_cache.outputs.cache-hit != 'true'
uses: actions/cache@v4
with:
path: ./src/FE/node_modules
key: ${{ runner.os }}-fe-node_modules-${{ hashFiles('src/FE/package-lock.json') }}
- name: Install npm dependencies
if: steps.fe_build_cache.outputs.cache-hit != 'true' && steps.node_modules_cache.outputs.cache-hit != 'true'
working-directory: ./src/FE
run: npm i
- name: Build frontend
if: steps.fe_build_cache.outputs.cache-hit != 'true'
working-directory: ./src/FE
run: npm run build
- name: sed version
run: |
# file: ./src/BE/Controllers/Admin/GlobalConfigs/VersionController.cs
# const int buildVersion = 0; -> const int buildVersion = github.run_number;
sed -i "s/const int buildVersion = 0;/const int buildVersion = ${{ github.run_number }};/" ./src/BE/Controllers/Admin/GlobalConfigs/VersionController.cs
- name: Zip FE build artifacts
run: |
zip -r chats-fe.zip ./src/FE/out
- name: Upload FE build artifacts
uses: actions/upload-artifact@v4
with:
name: chats-fe
path: chats-fe.zip
- name: Upload src folder
uses: actions/upload-artifact@v4
with:
name: src
path: ./src
- name: Set IS_RELEASE output
id: set_is_release
run: |
if [[ "${{ github.ref_name }}" == "main" ]]; then
echo "is_release=true" >> $GITHUB_OUTPUT
else
echo "is_release=true" >> $GITHUB_OUTPUT
fi
upload-fe-to-minio:
needs: build-fe
runs-on: ubuntu-latest
steps:
- name: Trigger Sync
run: |
curl -X POST "https://chats-release-webhook.starworks.cc:88/sync/${{ github.run_id }}/chats-fe" -N \
-H "Authorization: Basic $(echo -n "${{ secrets.CHATS_RELEASE_WEBHOOK_CREDENTIAL }}" | openssl base64)"
build-primary-container:
needs: build-fe
runs-on: ubuntu-latest
steps:
- name: Login container
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ vars.DOCKER_USERNAME }} ${{ vars.DOCKER_REGISTRY }} --password-stdin
- name: Download src folder
uses: actions/download-artifact@v4
with:
name: src
- name: Build container
run: |
dotnet publish ./src/BE/Chats.BE.csproj -c Release --os linux --arch x64 /t:PublishContainer /p:ContainerRepository=chats
- name: Tag container with run number
run: |
docker tag chats ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64
- name: Push container
run: |
docker push ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64
build-containers:
if: needs.build-fe.outputs.is_release == 'true'
needs: build-fe
strategy:
matrix:
include:
- tag: r${{ github.run_number }}-nanoserver-1809
runs-on: windows-latest
os: win
arch: x64
args: /p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809
- tag: r${{ github.run_number }}-nanoserver-ltsc2022
runs-on: windows-latest
os: win
arch: x64
args: /p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2022
- tag: r${{ github.run_number }}-linux-arm64
runs-on: ubuntu-latest
os: linux
arch: arm64
runs-on: ${{ matrix.runs-on }}
steps:
- name: Login container
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ vars.DOCKER_USERNAME }} ${{ vars.DOCKER_REGISTRY }} --password-stdin
- name: Download src folder
uses: actions/download-artifact@v4
with:
name: src
- name: Build container
run: |
dotnet publish ./src/BE/Chats.BE.csproj -c Release --os ${{ matrix.os }} --arch ${{ matrix.arch }} /t:PublishContainer /p:ContainerRepository=chats ${{ matrix.args }}
- name: Tag container with run number
run: |
docker tag chats ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:${{ matrix.tag }}
- name: Push container
run: |
docker push ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:${{ matrix.tag }}
docker-manifest:
if: needs.build-fe.outputs.is_release == 'true'
needs: [build-primary-container, build-containers]
runs-on: ubuntu-latest
steps:
- name: Login container
run: echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ vars.DOCKER_USERNAME }} ${{ vars.DOCKER_REGISTRY }} --password-stdin
- name: Create manifest
run: |
docker manifest create --amend ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }} \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-arm64 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-1809 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2022
- name: Annotation
run: |
docker manifest annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }} ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-1809 --os-version 10.0.17763.6532
docker manifest annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }} ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2022 --os-version 10.0.20348.2849
docker manifest inspect ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}
- name: Create latest manifest
run: |
docker manifest create --amend ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-arm64 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-1809 \
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2022
- name: Annotate latest manifest
run: |
docker manifest annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-1809 --os-version 10.0.17763.6532
docker manifest annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2022 --os-version 10.0.20348.2849
- name: Push manifest
run: |
docker manifest push ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}
docker manifest push ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest
build-binaries:
if: needs.build-fe.outputs.is_release == 'true'
needs: build-fe
strategy:
matrix:
include:
- id: chats
- id: chats-win-x64
args: -r win-x64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-linux-x64
args: -r linux-x64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-linux-arm64
args: -r linux-arm64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-linux-musl-x64
args: -r linux-musl-x64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-linux-musl-arm64
args: -r linux-musl-arm64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-osx-arm64
args: -r osx-arm64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
- id: chats-osx-x64
args: -r osx-x64 --self-contained true /p:PublishReadyToRun=true /p:PublishSingleFile=true
runs-on: ubuntu-latest
steps:
- name: Download src folder
uses: actions/download-artifact@v4
with:
name: src
- name: build binary
run: |
dotnet publish ./src/BE/Chats.BE.csproj -c Release -o ./Publish ${{ matrix.args }} /p:DeleteExistingFiles=True
- name: zip binary
run: |
zip -r ${{ matrix.id }}.zip ./Publish/*
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.id }}
path: ${{ matrix.id }}.zip
- name: Upload to Minio
run: |
curl -X POST "https://chats-release-webhook.starworks.cc:88/sync/${{ github.run_id }}/${{ matrix.id }}" -N \
-H "Authorization: Basic $(echo -n "${{ secrets.CHATS_RELEASE_WEBHOOK_CREDENTIAL }}" | openssl base64)"
create-release:
if: needs.build-fe.outputs.is_release == 'true'
needs: [build-binaries, build-primary-container]
runs-on: ubuntu-latest
outputs:
release_id: ${{ steps.create_release.outputs.release_id }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download artifacts
uses: actions/download-artifact@v4
- name: sha256sum
run: |
sha256sum chats*.zip > sha256sum.txt
- name: Get changes
run: |
CURRENT_REV=$(git rev-parse HEAD)
PREVIOUS_REV=$(curl --silent "https://api.github.com/repos/${{ github.repository }}/releases/latest" | jq -r ".tag_name")
cat <<END >> RELEASE.md
<details>
### Docker
| Description | Docker Image |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------ |
| r${{ github.run_number }} | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }} |
| Linux x64 | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64 |
| Linux ARM64 | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-arm64 |
| Windows Nano Server 1809 | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-1809 |
| Windows Nano Server LTSC 2022 | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2022 |
| Latest | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest |
### Alternative binaries download links that may faster than GitHub(for China users)
| Artifact | Download Link |
| ------------------------- | ------------------------------------------------------------------------------- |
| chats-win-x64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-win-x64.7z |
| chats-linux-x64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-linux-x64.7z |
| chats-linux-arm64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-linux-arm64.7z |
| chats-linux-musl-x64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-linux-musl-x64.7z |
| chats-linux-musl-arm64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-linux-musl-arm64.7z |
| chats-osx-arm64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-osx-arm64.7z |
| chats-osx-x64.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-osx-x64.7z |
| chats-fe.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats-fe.7z |
| chats.7z | ${{ vars.MINIO_URL }}/chats/r${{ github.run_number }}/chats.7z |
**NOTE**:
Replace \`r${{ github.run_number }}\` with \`latest\` in the download link to get the latest version, for example: \`${{ vars.MINIO_URL }}/chats/latest/chats-win-x64.7z\`
</details>
### Full Changelogs
https://github.com/sdcb/chats/compare/$PREVIOUS_REV...r-${{ github.run_number }}
Commits between \`$PREVIOUS_REV\` and \`$CURRENT_REV\`:
END
git log ${PREVIOUS_REV}..${CURRENT_REV} --pretty=format:'* [%s](https://github.com/${{ github.repository }}/commit/%H)' >> RELEASE.md
ls
- name: Publish Release
uses: ncipollo/release-action@v1
with:
bodyFile: RELEASE.md
token: ${{ secrets.GITHUB_TOKEN }}
name: r-${{ github.run_number }}
tag: r-${{ github.run_number }}
artifacts: "chats*.zip, sha256sum.txt"
draft: true
upload-minio-latest:
if: needs.build-fe.outputs.is_release == 'true'
needs: [build-binaries, upload-fe-to-minio]
runs-on: ubuntu-latest
steps:
- name: Update latest files
run: |
curl -X POST "https://chats-release-webhook.starworks.cc:88/sync/latest/${{ github.run_number }}" -N \
-H "Authorization: Basic $(echo -n "${{ secrets.CHATS_RELEASE_WEBHOOK_CREDENTIAL }}" | openssl base64)"
deploy:
runs-on: ubuntu-latest
needs: build-primary-container
steps:
- uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: deploy dev/stg or feature
run: |
ssh -o StrictHostKeyChecking=no -p 22 ${{ secrets.SSH_TARGET }} << 'EOF'
docker pull ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-linux-x64
cd chats
if [[ "${{ github.ref_name }}" == feature/* ]]; then
echo "Deploying feature branch: ${{ github.ref_name }}"
sed -i "s/^TAG=.*/TAG=r${{ github.run_number }}-linux-x64/" ~/chats/feature.env
docker compose --env-file=./feature.env --project-name chats-feature up -d --remove-orphans
else
echo "Deploying non-feature branch: ${{ github.ref_name }}"
sed -i "s/^TAG=.*/TAG=r${{ github.run_number }}-linux-x64/" ~/chats/dev.env
sed -i "s/^TAG=.*/TAG=r${{ github.run_number }}-linux-x64/" ~/chats/stg.env
docker compose --env-file=./dev.env --project-name chats-dev up -d --remove-orphans
docker compose --env-file=./stg.env --project-name chats-stg up -d --remove-orphans
fi
EOF