diff options
author | Christian Duerr <contact@christianduerr.com> | 2020-11-06 23:52:56 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-06 23:52:56 +0000 |
commit | 43d1afbeeb9cba0ce1281a9cf2223b5bd71664d2 (patch) | |
tree | 874e6352f8733ee61a28170bb171eb6acb6e5e19 /.github | |
parent | 3957a2555dbd81271d3e29a2f0b8f07258037e7b (diff) | |
download | alacritty-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.yml | 38 | ||||
-rw-r--r-- | .github/workflows/release.yml | 81 | ||||
-rwxr-xr-x | .github/workflows/upload_asset.sh | 93 |
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" |