diff --git a/.github/workflows/Build for release.yml b/.github/workflows/Build for release.yml index e2ac86e..c45ec3f 100644 --- a/.github/workflows/Build for release.yml +++ b/.github/workflows/Build for release.yml @@ -16,19 +16,401 @@ env: Executable: mockgpt jobs: - publish: - if: github.event_name == 'release' + FreeBSD-x86_64-static: + runs-on: ubuntu-latest + steps: + - name: Download source + uses: actions/checkout@v4 + + - name: Build in FreeBSD-vm + id: build + uses: vmactions/freebsd-vm@v1 + with: + usesh: true + prepare: | + pkg install -y crystal shards + run: | + freebsd-version + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug --static + + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + FILE_NAME="${{ env.Executable }}-$VERSION-freebsd-x86_64" + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv bin/${{ env.Executable }} . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + Linux-arm64-static: + runs-on: ubuntu-latest + steps: + - name: Download source + uses: actions/checkout@v4 + + - uses: jirutka/setup-alpine@v1.2.0 + with: + branch: edge + arch: aarch64 + shell-name: alpine-aarch64.sh + packages: > + crystal + shards + libressl-dev + zlib-static + + - name: Build in Alpine + id: build + run: | + cat /etc/os-release + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug --static + shell: alpine-aarch64.sh {0} + + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + FILE_NAME="${{ env.Executable }}-$VERSION-linux-arm64" + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv bin/${{ env.Executable }} . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + Linux-x86_64-static: + runs-on: ubuntu-latest + container: + image: crystallang/crystal:latest-alpine + steps: + - name: Download source + uses: actions/checkout@v4 + + - name: Build in container + run: | + cat /etc/os-release + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug --static + + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + FILE_NAME="${{ env.Executable }}-$VERSION-linux-x86_64" + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv bin/${{ env.Executable }} . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + Windows-x86_64-static: + runs-on: windows-latest + steps: + - name: Download source + uses: actions/checkout@v4 + + - name: Install Crystal + uses: crystal-lang/install-crystal@v1.8.2 + with: + crystal: latest + + - name: Build + run: | + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug --static + + - name: Generate file name + id: get_name + run: | + if ("${{ github.event_name }}" -eq "release") { + $VERSION = "${{ github.event.release.tag_name }}" + } else { + $VERSION = Get-Date -Format "yyyyMMdd" + } + $FILE_NAME = "${{ env.Executable }}-$VERSION-windows-x86_64-msvc" + Add-Content -Path $env:GITHUB_OUTPUT -Value "FILE_NAME=$FILE_NAME" + Write-Host "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv "bin/${{ env.Executable }}.exe" . + $sourcePath = "${{ env.Executable }}.exe", "LICENSE", "README.md", "README_zh.md" + $destinationPath = "${{ steps.get_name.outputs.FILE_NAME }}.zip" + Compress-Archive -CompressionLevel "Optimal" -Path $sourcePath -DestinationPath $destinationPath + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.zip + retention-days: 31 + compression-level: 9 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + macOS-arm64: + runs-on: macos-latest + steps: + - name: Download source + uses: actions/checkout@v4 + + - name: Install Crystal + uses: crystal-lang/install-crystal@v1.8.2 + with: + crystal: latest + + - name: Build + run: | + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug + + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + FILE_NAME="${{ env.Executable }}-$VERSION-macos-arm64" + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv bin/${{ env.Executable }} . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + macOS-x86_64: + runs-on: macos-13 + steps: + - name: Download source + uses: actions/checkout@v4 + + - name: Install Crystal + uses: crystal-lang/install-crystal@v1.8.2 + with: + crystal: latest + + - name: Build + run: | + crystal version + shards install + crystal spec --order=random + shards build --production --release --no-debug + + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + FILE_NAME="${{ env.Executable }}-$VERSION-macos-x86_64" + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Collect assets + run: | + mv bin/${{ env.Executable }} . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 + + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" + + macOS-universal: runs-on: ubuntu-latest + needs: [macOS-arm64, macOS-x86_64] steps: - - name: Create file1.txt - run: echo "This is file 1" > file1.txt + - name: Generate file name + id: get_name + run: | + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + ARM_NAME="${{ env.Executable }}-$VERSION-macos-arm64" + AMD_NAME="${{ env.Executable }}-$VERSION-macos-x86_64" + FILE_NAME="${{ env.Executable }}-$VERSION-macos-universal" + echo "ARM_NAME=$ARM_NAME" >> $GITHUB_OUTPUT + echo "AMD_NAME=$AMD_NAME" >> $GITHUB_OUTPUT + echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT + echo "Generated file name: $FILE_NAME" + + - name: Download artifact from macOS-arm64 + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.ARM_NAME }} + path: arm64 + + - name: Download artifact from macOS-x86_64 + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.AMD_NAME }} + path: amd64 + + - name: Extract artifacts + run: | + tar -xvzf arm64/${{ steps.get_name.outputs.ARM_NAME }}.tgz -C arm64 + tar -xvzf amd64/${{ steps.get_name.outputs.AMD_NAME }}.tgz -C amd64 + + - name: Create universal binary + run: | + sudo curl -L -o /usr/bin/lipo https://github.com/konoui/lipo/releases/latest/download/lipo_Linux_amd64 + sudo chmod +x /usr/bin/lipo + lipo -create arm64/${{ env.Executable }} amd64/${{ env.Executable }} -output ${{ env.Executable }} + + - name: Collect assets + run: | + mv amd64/LICENSE amd64/README.md amd64/README_zh.md . + tar -cvzf ${{ steps.get_name.outputs.FILE_NAME }}.tgz ${{ env.Executable }} LICENSE README.md README_zh.md + + - name: Upload artifact + uses: actions/upload-artifact@v4 + id: upload + with: + name: ${{ steps.get_name.outputs.FILE_NAME }} + path: ${{ steps.get_name.outputs.FILE_NAME }}.tgz + retention-days: 31 - - name: Create file2.txt - run: echo "This is file 2" > file2.txt + - name: Output artifact id + run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}" - - name: Show assets + publish: + if: github.event_name == "release" + runs-on: ubuntu-latest + needs: [FreeBSD-x86_64-static, Linux-arm64-static, Linux-x86_64-static, Windows-x86_64-static, macOS-universal] + steps: + - name: Generate file name + id: get_name run: | - ls + if [ ${{ github.event_name }} = "release" ]; then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=$(date +"%Y%m%d") + fi + BSD_AMD="${{ env.Executable }}-$VERSION-freebsd-x86_64" + LINUX_ARM="${{ env.Executable }}-$VERSION-linux-arm64" + LINUX_AMD="${{ env.Executable }}-$VERSION-linux-x86_64" + WIN_AMD="${{ env.Executable }}-$VERSION-windows-x86_64-msvc" + MAC_NAME="${{ env.Executable }}-$VERSION-macos-universal" + echo "BSD_AMD=$BSD_AMD" >> $GITHUB_OUTPUT + echo "LINUX_ARM=$LINUX_ARM" >> $GITHUB_OUTPUT + echo "LINUX_AMD=$LINUX_AMD" >> $GITHUB_OUTPUT + echo "WIN_AMD=$WIN_AMD" >> $GITHUB_OUTPUT + echo "MAC_NAME=$MAC_NAME" >> $GITHUB_OUTPUT + + - name: Download artifact from FreeBSD-x86_64 + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.BSD_AMD }} + + - name: Download artifact from Linux-arm64-static + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.LINUX_ARM }} + + - name: Download artifact from Linux-x86_64-static + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.LINUX_AMD }} + + - name: Download artifact from Windows-x86_64-static + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.WIN_AMD }} + + - name: Download artifact from macOS-universal + uses: actions/download-artifact@v4 + with: + name: ${{ steps.get_name.outputs.MAC_NAME }} - name: Publish to Releases uses: ncipollo/release-action@v1 @@ -36,8 +418,7 @@ jobs: name: "MockGPT v${{ github.event.release.tag_name }}" allowUpdates: true artifactErrorsFailBuild: false - artifacts: "file1.txt,file2.txt" + artifacts: "${{ steps.get_name.outputs.BSD_AMD }}.tgz,${{ steps.get_name.outputs.LINUX_ARM }}.tgz,${{ steps.get_name.outputs.LINUX_AMD }}.tgz,${{ steps.get_name.outputs.WIN_AMD }}.zip,${{ steps.get_name.outputs.MAC_NAME }}.tgz" omitNameDuringUpdate: true omitBodyDuringUpdate: true omitPrereleaseDuringUpdate: true - token: ${{ secrets.GITHUB_TOKEN }}