diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..a0ecd38 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,138 @@ +name: Build and deploy Aseprite + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' + push: + branches: + - master + + +env: + BUILD_TYPE: Release + ACTIONS_ALLOW_UNSECURE_COMMANDS: true + +jobs: + check-version: + name: Check latest Aseprite release + runs-on: ubuntu-latest + outputs: + download_url: ${{ steps.version_info.outputs.download_url }} + latest_tag: ${{ steps.version_info.outputs.latest_tag }} + should_build: ${{ steps.should_build.outputs.should_build }} + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - name: Get latest version info + id: version_info + run: | + data=$(curl -sL https://api.github.com/repos/aseprite/aseprite/releases/latest) + LATEST_TAG=$(echo "${data}" | jq -r '.tag_name') + DOWNLOAD_URL=$(echo "${data}" | jq -r '.assets[].browser_download_url') + VERSION_INFO=$(echo "${data}" | jq -r '.body') + + echo "${LATEST_TAG}" > ${LATEST_TAG}.txt + echo "::set-output name=latest_tag::${LATEST_TAG}" + echo "::set-output name=download_url::${DOWNLOAD_URL}" + echo "::set-output name=version_info::${VERSION_INFO}" + - name: Load version from cache + id: version_check + uses: actions/cache@v2 + with: + path: ${{ steps.version_info.outputs.latest_tag }}.txt + key: cached_version + - name: Should we start new build? + id: should_build + if: steps.version_check.outputs.cache-hit != 'true' + run: echo "::set-output name=should_build::true" + - name: Create Release + id: create_release + if: steps.should_build.outputs.should_build + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.version_info.outputs.latest_tag }} + release_name: Release Aseprite ${{ steps.version_info.outputs.latest_tag }} + body: | + ${{ steps.version_info.outputs.version_info }} + draft: false + prerelease: false + + build-aseprite: + name: Build Aseprite + needs: check-version + if: ${{ needs.check-version.outputs.should_build }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macOS-latest] + fail-fast: false + steps: + - name: (Windows) Install dependencies + if: matrix.os == 'windows-latest' + uses: seanmiddleditch/gha-setup-ninja@v1 + - name: (Ubuntu) Install dependencies + if: matrix.os == 'ubuntu-latest' + run: sudo apt install -y cmake ninja-build libxcursor-dev libxi-dev libgl1-mesa-dev + - name: (macOS) Install dependencies + if: matrix.os == 'macOS-latest' + run: brew install ninja p7zip + - name: Get Skia from cache + id: skia-cache + uses: actions/cache@v2 + with: + path: skia + key: skia-${{ matrix.os }}-cache + - name: Download Skia if not in cache + if: steps.skia-cache.outputs.cache-hit != 'true' + run: | + curl -o Skia-${{ runner.os }}-Release-X64.zip -L https://github.com/aseprite/skia/releases/download/m81-b607b32047/Skia-${{ runner.os }}-Release-X64.zip + unzip Skia-${{ runner.os }}-Release-X64.zip -d skia + - name: Download Aseprite release + run: | + curl -o Aseprite-source.zip -L ${{ needs.check-version.outputs.download_url }} + unzip Aseprite-source.zip -d aseprite + mkdir -p aseprite/build + - name: (Windows) Set architecture for the produced binary + if: matrix.os == 'windows-latest' + shell: cmd + run: call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat" -arch=x64 + - name: (Windows) Setting Visual Studio build environment variables and paths + if: matrix.os == 'windows-latest' + uses: seanmiddleditch/gha-setup-vsdevenv@v1 + - name: (Windows) Run CMake + if: matrix.os == 'windows-latest' + working-directory: aseprite/build + shell: cmd + run: cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} -DCMAKE_IGNORE_PATH='C:/ProgramData/chocolatey/bin/;C:/Strawberry/c/bin/' -DLAF_BACKEND=skia -DSKIA_DIR=../../skia -DSKIA_LIBRARY_DIR=../../skia/out/Release-x64 -G Ninja .. + - name: (Ubuntu) Run CMake + if: matrix.os == 'ubuntu-latest' + working-directory: aseprite/build + run: cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} -DLAF_BACKEND=skia -DSKIA_DIR=../../skia -DSKIA_LIBRARY_DIR=../../skia/out/Release-x64 -G Ninja .. + - name: (macOS) Run CMake + if: matrix.os == 'macOS-latest' + working-directory: aseprite/build + run: cmake -DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -DLAF_BACKEND=skia -DSKIA_DIR=../../skia -DSKIA_LIBRARY_DIR=../../skia/out/Release-x64 -G Ninja .. + - name: Run Ninja + working-directory: aseprite/build + run: ninja aseprite + - name: Clean up build + working-directory: aseprite/build/bin + shell: bash + run: rm -f gen modp_b64_gen gen.exe gen.exe.manifest modp_b64_gen.exe modp_b64_gen.exe.manifest + - name: (Windows) Make portable zip + working-directory: aseprite/build/bin + run: echo '# This file is here so Aseprite behaves as a portable program' > aseprite.ini + - name: Create release + working-directory: aseprite/build/bin + run: 7z -tzip a Aseprite-${{ needs.check-version.outputs.latest_tag }}-${{ runner.os }}.zip * + - name: Upload release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.check-version.outputs.upload_url }} + asset_path: aseprite/build/bin/Aseprite-${{ needs.check-version.outputs.latest_tag }}-${{ runner.os }}.zip + asset_name: Aseprite-${{ needs.check-version.outputs.latest_tag }}-${{ runner.os }}.zip + asset_content_type: application/zip