Skip to content

Build for release

Build for release #24

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_REF#refs/tags/}
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/[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_REF#refs/tags/}
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_REF#refs/tags/}
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/[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 = $env:GITHUB_REF -replace "refs/tags/"
} 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/[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_REF#refs/tags/}
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_REF#refs/tags/}
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:
needs: [macOS-arm64, macOS-x86_64]
runs-on: ubuntu-latest
steps:
- name: Generate file name
id: get_name
run: |
if [ "${{ github.event_name }}" = "release" ]; then
VERSION=${GITHUB_REF#refs/tags/}
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: Output artifact id
run: echo 'Artifact ID is ${{ steps.upload.outputs.artifact-id }}'