only wait 10s in webhook #500
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 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: ${{ github.ref_name == 'main' && 'true' || 'true' }} | |
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: Copy FE build artifacts | |
run: | | |
mkdir -p ./src/BE/wwwroot | |
cp -r ./src/FE/out/* ./src/BE/wwwroot | |
- name: Upload FE build artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: chats-fe | |
path: ./src/FE/out | |
- name: Upload BE src folder | |
uses: actions/upload-artifact@v4 | |
with: | |
name: be-src | |
path: | | |
./src/BE | |
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 BE src folder | |
uses: actions/download-artifact@v4 | |
with: | |
name: be-src | |
path: ./be-src | |
- name: Build container | |
run: | | |
dotnet publish ./be-src/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 }}-nanoserver-ltsc2025 | |
runs-on: windows-latest | |
os: win | |
arch: x64 | |
args: /p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2025 | |
- 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 BE src folder | |
uses: actions/download-artifact@v4 | |
with: | |
name: be-src | |
path: ./be-src | |
- name: Build container | |
run: | | |
dotnet publish ./be-src/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 \ | |
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2025 | |
- 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 annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }} ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2025 --os-version 10.0.26100.3194 | |
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 \ | |
${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2025 | |
- 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 | |
docker manifest annotate ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:latest ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2025 --os-version 10.0.26100.3194 | |
- 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=false /p:PublishSingleFile=false | |
- id: chats-linux-x64 | |
args: -r linux-x64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
- id: chats-linux-arm64 | |
args: -r linux-arm64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
- id: chats-linux-musl-x64 | |
args: -r linux-musl-x64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
- id: chats-linux-musl-arm64 | |
args: -r linux-musl-arm64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
- id: chats-osx-arm64 | |
args: -r osx-arm64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
- id: chats-osx-x64 | |
args: -r osx-x64 --self-contained true /p:PublishReadyToRun=false /p:PublishSingleFile=false | |
runs-on: ubuntu-latest | |
steps: | |
- name: Download BE src folder | |
uses: actions/download-artifact@v4 | |
with: | |
name: be-src | |
path: ./be-src | |
- name: build binary | |
run: | | |
dotnet publish ./be-src/Chats.BE.csproj -c Release -o ./Publish ${{ matrix.args }} /p:DeleteExistingFiles=True | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.id }} | |
path: ./Publish | |
- name: Upload to Minio | |
run: | | |
OUTPUT_LOG="curl_output.log" | |
echo "Triggering webhook, running in the background..." | |
nohup bash -c "curl -X POST \"https://chats-release-webhook.starworks.cc:88/sync/${GITHUB_RUN_ID}/${MATRIX_ID}\" -N -H \"Authorization: Basic \$(echo -n '${CREDENTIAL}' | openssl base64)\" | tee -a ${OUTPUT_LOG}" & | |
CURL_PID=$! | |
# Wait for a maximum of 10 seconds to detect a response | |
RESPONSE_OK=0 | |
for i in $(seq 1 10); do | |
echo "Waiting for response... (${i}/10)" | |
if grep -q "开始同步..." "$OUTPUT_LOG"; then | |
echo "Response detected, assuming status code is 200. Exiting wait." | |
RESPONSE_OK=1 | |
break | |
fi | |
sleep 1 | |
done | |
if [ $RESPONSE_OK -ne 1 ]; then | |
echo "Timeout: Did not detect expected response within 10 seconds." | |
exit 1 | |
fi | |
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 all artifacts as zip | |
run: | | |
API_URL="https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" | |
echo "Fetching artifacts from: ${API_URL}" | |
curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "${API_URL}" | \ | |
jq -c '.artifacts[]' | while read artifact; do | |
ID=$(echo "$artifact" | jq -r '.id') | |
NAME=$(echo "$artifact" | jq -r '.name') | |
echo "Downloading artifact '${NAME}' (ID: ${ID})" | |
curl -L -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ | |
-o "${NAME}.zip" "https://api.github.com/repos/${{ github.repository }}/actions/artifacts/${ID}/zip?archive_format=zip" | |
done | |
ls -lh *.zip | |
- name: sha256sum | |
run: | | |
sha256sum *.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 | | |
| Windows Nano Server LTSC 2025 | ${{ vars.DOCKER_REGISTRY }}/${{ vars.DOCKER_NAMESPACE }}/chats:r${{ github.run_number }}-nanoserver-ltsc2025 | | |
| 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...$CURRENT_REV | |
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 |