Skip to content

Build for release

Build for release #90

name: Build for release
on:
push:
paths:
- ".github/workflows/Build for release.yml"
pull_request:
paths:
- ".github/workflows/Build for release.yml"
release:
types: [published]
schedule:
- cron: "0 0 1 * *" # 1st of every month at 8 AM CST
env:
Executable: mockgpt
jobs:
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"
cp bin/${{ env.Executable }} ${{ env.Executable }}-freebsd-x86_64
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-freebsd-x86_64"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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 }}"
OpenBSD-x86_64-static:
runs-on: ubuntu-latest
steps:
- name: Download source
uses: actions/checkout@v4
- name: Build in OpenBSD-vm
id: build
uses: vmactions/openbsd-vm@v1
with:
release: "7.3"
usesh: true
prepare: |
pkg_add crystal git
run: |
awk '/github: grip-framework\/grip/ {print; print " version: 2.0.1"; next}1' shard.yml > temp.yml
mv temp.yml shard.yml
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-openbsd-x86_64"
echo "FILE_NAME=$FILE_NAME" >> $GITHUB_OUTPUT
echo "Generated file name: $FILE_NAME"
cp bin/${{ env.Executable }} ${{ env.Executable }}-openbsd-x86_64
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-openbsd-x86_64"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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/[email protected]
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"
cp bin/${{ env.Executable }} ${{ env.Executable }}-linux-arm64
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-linux-arm64"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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"
cp bin/${{ env.Executable }} ${{ env.Executable }}-linux-x86_64
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-linux-x86_64"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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/[email protected]
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"
Copy-Item "bin/${{ env.Executable }}.exe" "${{ env.Executable }}-windows-x86_64.exe"
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-windows-x86_64.exe"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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/[email protected]
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/[email protected]
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: 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 }}
cp ${{ env.Executable }} ${{ env.Executable }}-macos-universal
- name: Publish to Releases
if: github.event_name == 'release'
uses: ncipollo/release-action@v1
with:
name: "Latest Executables"
tag: "latest"
allowUpdates: true
artifacts: "${{ env.Executable }}-macos-universal"
artifactErrorsFailBuild: false
omitNameDuringUpdate: true
omitBodyDuringUpdate: true
omitPrereleaseDuringUpdate: true
- 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: Output artifact id
run: echo "Artifact ID is ${{ steps.upload.outputs.artifact-id }}"
Publish:
name: Publish to Releases
if: github.event_name == 'release'
runs-on: ubuntu-latest
needs:
[
FreeBSD-x86_64-static,
OpenBSD-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: |
VERSION=${{ github.event.release.tag_name }}
FREEBSD_AMD="${{ env.Executable }}-$VERSION-freebsd-x86_64"
OPENBSD_AMD="${{ env.Executable }}-$VERSION-openbsd-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 "FREEBSD_AMD=$FREEBSD_AMD" >> $GITHUB_OUTPUT
echo "OPENBSD_AMD=$OPENBSD_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-static
uses: actions/download-artifact@v4
with:
name: ${{ steps.get_name.outputs.FREEBSD_AMD }}
- name: Download artifact from OpenBSD-x86_64-static
uses: actions/download-artifact@v4
with:
name: ${{ steps.get_name.outputs.OPENBSD_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
with:
name: "MockGPT v${{ github.event.release.tag_name }}"
allowUpdates: true
artifactErrorsFailBuild: false
artifacts: "${{ steps.get_name.outputs.FREEBSD_AMD }}.tgz,${{ steps.get_name.outputs.OPENBSD_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