summaryrefslogtreecommitdiff
path: root/.github
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2020-11-06 23:52:56 +0000
committerGitHub <noreply@github.com>2020-11-06 23:52:56 +0000
commit43d1afbeeb9cba0ce1281a9cf2223b5bd71664d2 (patch)
tree874e6352f8733ee61a28170bb171eb6acb6e5e19 /.github
parent3957a2555dbd81271d3e29a2f0b8f07258037e7b (diff)
downloadalacritty-43d1afbeeb9cba0ce1281a9cf2223b5bd71664d2.tar.gz
alacritty-43d1afbeeb9cba0ce1281a9cf2223b5bd71664d2.zip
Migrate from Travis CI to GitHub Actions
This removes all CI builds from travis-ci, due to their recent changes in policy and harsh limitations on builds. With build times over 2 hours, it was a significant hindrance to development. Instead of Travis CI, the CI is now split on Sourcehut and GitHub. Since Sourcehut only supports Linux/BSD, all builds on those operating systems are executed there. The GitHub Actions CI is used to build for Windows/macOS, which are not available on Sourcehut. Since asset deployment for releases requires builds on all platforms, this is also done on GitHub actions. Though the new `upload_asset.sh` script makes sure that migration in the future is fairly simple and we do not tie ourselves to the overly complicated GitHub Actions ecosystem.
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/ci.yml38
-rw-r--r--.github/workflows/release.yml81
-rwxr-xr-x.github/workflows/upload_asset.sh93
3 files changed, 212 insertions, 0 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 00000000..7086f1cd
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,38 @@
+name: CI
+
+on: [push, pull_request]
+
+env:
+ CARGO_TERM_COLOR: always
+
+jobs:
+ build:
+ strategy:
+ matrix:
+ rust_version: [stable, 1.43.1]
+ os: [windows-latest, macos-latest]
+
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Rustup
+ run: rustup default ${{ matrix.rust_version }}
+ - name: Test
+ run: cargo test
+
+ clippy:
+ strategy:
+ matrix:
+ os: [windows-latest, macos-latest]
+
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Rustup
+ run: rustup default ${{ matrix.rust_version }}
+ - name: Install Clippy
+ run: rustup component add clippy
+ - name: Lint
+ run: cargo clippy --all-targets --manifest-path ./alacritty/Cargo.toml --no-default-features --features "x11 wayland"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..d1a9848c
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,81 @@
+name: Release
+
+on:
+ push:
+ tags: ["v[0-9]+.[0-9]+.[0-9]+"]
+
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ CARGO_TERM_COLOR: always
+
+jobs:
+ macos:
+ runs-on: macos-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Test
+ run: cargo test --release
+ - name: Make App
+ run: make dmg
+ - name: Upload Application
+ run: |
+ mv ./target/release/osx/Alacritty.dmg ./Alacritty-${GITHUB_REF##*/}.dmg
+ ./.github/workflows/upload_asset.sh ./Alacritty-${GITHUB_REF##*/}.dmg $GITHUB_TOKEN
+
+ windows:
+ runs-on: windows-latest
+
+ defaults:
+ run:
+ shell: bash
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Test
+ run: cargo test --release
+ - name: Build
+ run: cargo build --release
+ - name: Upload portable executable
+ run: |
+ cp ./target/release/alacritty.exe ./Alacritty-${GITHUB_REF##*/}-portable.exe
+ ./.github/workflows/upload_asset.sh \
+ ./Alacritty-${GITHUB_REF##*/}-portable.exe $GITHUB_TOKEN
+ - name: Install WiX
+ run: nuget install WiX
+ - name: Crate msi installer
+ run: |
+ ./WiX.*/tools/candle.exe -nologo -arch "x64" -ext WixUIExtension -ext WixUtilExtension \
+ -out "./alacritty.wixobj" "extra/windows/wix/alacritty.wxs"
+ ./WiX.*/tools/light.exe -nologo -ext WixUIExtension -ext WixUtilExtension \
+ -out "./Alacritty-${GITHUB_REF##*/}-installer.msi" -sice:ICE61 -sice:ICE91 \
+ "./alacritty.wixobj"
+ - name: Upload msi installer
+ run: |
+ ./.github/workflows/upload_asset.sh \
+ ./Alacritty-${GITHUB_REF##*/}-installer.msi $GITHUB_TOKEN
+
+ linux:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install dependencies
+ run: |
+ sudo apt-get install cmake pkg-config libfreetype6-dev libfontconfig1-dev \
+ libxcb-xfixes0-dev python3
+ - name: Test
+ run: cargo test --release
+ - name: Gzip manpage
+ run: gzip -c "./extra/alacritty.man" > "./alacritty.1.gz"
+ - name: Upload Assets
+ run: |
+ mv ./extra/logo/alacritty-term.svg ./Alacritty.svg
+ ./.github/workflows/upload_asset.sh ./Alacritty.svg $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./alacritty.1.gz $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./extra/completions/alacritty.bash $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./extra/completions/alacritty.fish $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./extra/completions/_alacritty $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./extra/linux/Alacritty.desktop $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./extra/alacritty.info $GITHUB_TOKEN
+ ./.github/workflows/upload_asset.sh ./alacritty.yml $GITHUB_TOKEN
diff --git a/.github/workflows/upload_asset.sh b/.github/workflows/upload_asset.sh
new file mode 100755
index 00000000..3005e707
--- /dev/null
+++ b/.github/workflows/upload_asset.sh
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# Assure parameters are correct.
+if [ $# -lt 2 ]; then
+ echo "Usage: upload_asset.sh <FILE> <TOKEN>"
+ exit 1
+fi
+
+repo="alacritty/alacritty"
+file_path=$1
+bearer=$2
+
+echo "Starting asset upload from $file_path to $repo."
+
+# Get the release for this tag.
+tag="$(git describe --tags --abbrev=0)"
+
+# Make sure the git tag could be determined.
+if [ -z "$tag" ]; then
+ printf "\e[31mError: Unable to find git tag\e[0m\n"
+ exit 1
+fi
+
+echo "Git tag: $tag"
+
+# Get the upload URL for the current tag.
+#
+# Since this might be a draft release, we can't just use the /releases/tags/:tag
+# endpoint which only shows published releases.
+echo "Checking for existing release..."
+upload_url=$(\
+ curl \
+ -H "Authorization: Bearer $bearer" \
+ "https://api.github.com/repos/$repo/releases" \
+ 2> /dev/null \
+ | grep -E "(upload_url|tag_name)" \
+ | paste - - \
+ | grep -e "tag_name\": \"$tag" \
+ | head -n 1 \
+ | sed 's/.*\(https.*assets\).*/\1/' \
+)
+
+# Create a new release if we didn't find one for this tag.
+if [ -z "$upload_url" ]; then
+ echo "No release found."
+ echo "Creating new release..."
+
+ # Create new release.
+ response=$(
+ curl -f \
+ -X POST \
+ -H "Authorization: Bearer $bearer" \
+ -d "{\"tag_name\":\"$tag\",\"draft\":true}" \
+ "https://api.github.com/repos/$repo/releases" \
+ 2> /dev/null\
+ )
+
+ # Abort if the release could not be created.
+ if [ $? -ne 0 ]; then
+ printf "\e[31mError: Unable to create new release.\e[0m\n"
+ exit 1;
+ fi
+
+ # Extract upload URL from new release.
+ upload_url=$(\
+ echo "$response" \
+ | grep "upload_url" \
+ | sed 's/.*: "\(.*\){.*/\1/' \
+ )
+fi
+
+# Propagate error if no URL for asset upload could be found.
+if [ -z "$upload_url" ]; then
+ printf "\e[31mError: Unable to find release upload url.\e[0m\n"
+ exit 2
+fi
+
+# Upload the file to the tag's release.
+file_name=${file_path##*/}
+echo "Uploading asset $file_name to $upload_url..."
+curl -f \
+ -X POST \
+ -H "Authorization: Bearer $bearer" \
+ -H "Content-Type: application/octet-stream" \
+ --data-binary @"$file_path" \
+ "$upload_url?name=$file_name" \
+ &> /dev/null \
+|| { \
+ printf "\e[31mError: Unable to upload asset.\e[0m\n" \
+ && exit 3; \
+}
+
+printf "\e[32mSuccess\e[0m\n"