Migrate to GitHub Actions (#44)

* Migrate to GitHub Actions

* Delete .travis.yml

* Replace Travis badge

* Analyze with `--fatal-infos`

* Add branch:master filter to badge link
diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
new file mode 100644
index 0000000..e55702c
--- /dev/null
+++ b/.github/workflows/test-package.yml
@@ -0,0 +1,64 @@
+name: Dart CI
+
+on:
+  # Run on PRs and pushes to the default branch.
+  push:
+    branches: [ master ]
+  pull_request:
+    branches: [ master ]
+  schedule:
+    - cron: "0 0 * * 0"
+
+env:
+  PUB_ENVIRONMENT: bot.github
+
+jobs:
+  # Check code formatting and static analysis on a single OS (linux)
+  # against Dart dev.
+  analyze:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        sdk: [dev]
+    steps:
+      - uses: actions/checkout@v2
+      - uses: dart-lang/setup-dart@v0.1
+        with:
+          channel: ${{ matrix.sdk }}
+      - id: install
+        name: Install dependencies
+        run: dart pub get
+      - name: Check formatting
+        run: dart format --output=none --set-exit-if-changed .
+        if: always() && steps.install.outcome == 'success'
+      - name: Analyze code
+        run: dart analyze --fatal-infos
+        if: always() && steps.install.outcome == 'success'
+
+  # Run tests on a matrix consisting of two dimensions:
+  # 1. OS: ubuntu-latest, (macos-latest, windows-latest)
+  # 2. release channel: dev
+  test:
+    needs: analyze
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        # Add macos-latest and/or windows-latest if relevant for this package.
+        os: [ubuntu-latest]
+        sdk: [dev]
+    steps:
+      - uses: actions/checkout@v2
+      - uses: dart-lang/setup-dart@v0.1
+        with:
+          channel: ${{ matrix.sdk }}
+      - id: install
+        name: Install dependencies
+        run: dart pub get
+      - name: Run VM tests
+        run: dart test --platform vm
+        if: always() && steps.install.outcome == 'success'
+      - name: Run Chrome tests
+        run: dart test --platform chrome
+        if: always() && steps.install.outcome == 'success'
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index cb4fbf9..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-language: dart
-
-dart:
-- dev
-
-jobs:
-  include:
-    - stage: analyze_and_format
-      name: "Analyze lib/ (no experiment flag)"
-      os: linux
-      script: dartanalyzer --fatal-warnings --fatal-infos lib/
-    - stage: analyze_and_format
-      name: "Analyze (with experiment flag)"
-      os: linux
-      script: dartanalyzer --enable-experiment=non-nullable --fatal-warnings --fatal-infos .
-    - stage: analyze_and_format
-      name: "Format"
-      os: linux
-      script: dartfmt -n --set-exit-if-changed .
-    - stage: test
-      name: "Vm Tests"
-      os: linux
-      script: pub run --enable-experiment=non-nullable test -p vm
-    - stage: test
-      name: "Web Tests"
-      os: linux
-      script: pub run --enable-experiment=non-nullable test -p chrome
-
-branches:
-  only: [master]
-
-cache:
-  directories:
-    - $HOME/.pub-cache
diff --git a/README.md b/README.md
index 1adaeea..9d37e21 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
 [![pub package](https://img.shields.io/pub/v/characters.svg)](https://pub.dev/packages/characters)
-[![Build Status](https://travis-ci.org/dart-lang/characters.svg?branch=master)](https://travis-ci.org/dart-lang/characters)
-
+[![Build Status](https://github.com/dart-lang/characters/workflows/Dart%20CI/badge.svg)](https://github.com/dart-lang/characters/actions?query=workflow%3A"Dart+CI"+branch%3Amaster)
 
 [`Characters`][Characters] are strings viewed as
 sequences of **user-perceived character**s,