ci: Migrate CI from Azure Pipelines to GitHub Actions (#233)

Migrated CI from Azure Pipelines to GitHub Actions.
Until the release process is figured out in Actions, we'll stick to using Azure pipelines for releases.
This commit is contained in:
Matan Kushner 2019-09-04 19:13:53 -04:00 committed by GitHub
parent 68754208c1
commit e66d7bae1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 108 additions and 234 deletions

View File

@ -0,0 +1,93 @@
name: Continuous Integration
on: push
jobs:
# Run the `rustfmt` code formatter
rustfmt:
name: Rustfmt [Formatter]
runs-on: ubuntu-latest
steps:
- uses: hecrj/setup-rust-action@master
- uses: actions/checkout@master
- name: Install rustfmt
run: rustup component add rustfmt
- name: Run rustfmt
run: cargo fmt --all -- --check
# Run the `clippy` linting tool
clippy:
name: Clippy [Linter]
runs-on: ubuntu-latest
steps:
- uses: hecrj/setup-rust-action@master
- uses: actions/checkout@master
- name: Install clippy
run: rustup component add clippy
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D clippy::all
# Ensure that the project could be successfully compiled
cargo_check:
name: Compile
runs-on: ubuntu-latest
steps:
- uses: hecrj/setup-rust-action@master
- uses: actions/checkout@master
- run: cargo check --all
# Run tests on Linux, and macOS
# On both Rust stable and Rust nightly
test:
name: Test Suite
needs: [rustfmt, clippy, cargo_check]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macOS-latest]
rust: [stable, nightly]
steps:
# Install all the required dependencies for testing
- uses: hecrj/setup-rust-action@master
with:
rust-version: ${{ matrix.rust }}
# Install Node.js at a fixed version
- uses: actions/setup-node@master
with:
node-version: "12.0.0"
# Install Golang at a fixed version
- uses: actions/setup-go@master
with:
go-version: "1.12.1"
# Install Ruby at a fixed version
- uses: actions/setup-ruby@master
with:
ruby-version: "2.6.3"
# Install Python at a fixed version
- uses: actions/setup-python@master
with:
python-version: "3.6.9"
# Run the ignored tests that expect the above setup
- uses: actions/checkout@master
- name: Run all tests
run: cargo test -- -Z unstable-options --include-ignored
# Run the tests in the Docker image
docker_test:
name: Test in Docker
needs: [rustfmt, clippy, cargo_check]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Pull the pre-built Docker image
run: docker pull starshipcommand/starship-test
- name: Fix file permissions
run: chmod -R a+w .
- name: Build the Docker image
run: docker build -f tests/Dockerfile --tag starshipcommand/starship-test --cache-from starshipcommand/starship-test .
- name: Run tests in Docker
run: docker run --rm -v $(pwd):/src/starship starshipcommand/starship-test

View File

@ -1,59 +1,10 @@
trigger:
branches:
include: ["*"]
tags:
include: ["*"]
stages:
- stage: Checks
jobs:
# Check formatting
- template: ci/rustfmt.yml
parameters:
name: rustfmt
displayName: Check formatting
# Run linter
- template: ci/cargo-clippy.yml
parameters:
name: cargo_clippy
displayName: Run linter
# Cargo check
- template: ci/cargo-check.yml
parameters:
name: cargo_check
displayName: Cargo check
- stage: Test
dependsOn: Checks
jobs:
# Test stable
- template: ci/test.yml
parameters:
name: cargo_test_stable
displayName: Cargo test
cross: true # Test on Windows and macOS
# Test nightly
- template: ci/test.yml
parameters:
name: cargo_test_nightly
displayName: Cargo test
rust_version: nightly
# Test docker
# Runs integration tests as a starship developer would run them locally
- template: ci/test-docker.yml
parameters:
name: test_docker
displayName: Docker test
- stage: Release
dependsOn:
- Checks
- Test
condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
jobs:
# Release binary on GitHub
- template: ci/github-release.yml

View File

@ -1,13 +0,0 @@
parameters:
rust_version: stable
jobs:
- job: ${{ parameters.name }}
displayName: ${{ parameters.displayName }}
pool:
vmImage: ubuntu-16.04
steps:
- template: install-rust.yml
- script: cargo check
displayName: Check features

View File

@ -1,13 +0,0 @@
parameters:
rust_version: stable
jobs:
- job: ${{ parameters.name }}
displayName: ${{ parameters.displayName }}
pool:
vmImage: ubuntu-16.04
steps:
- template: install-rust.yml
- script: cargo clippy -- -D clippy::all
displayName: Run clippy

View File

@ -1,16 +0,0 @@
jobs:
# Check formatting
- job: ${{ parameters.name }}
displayName: Check rustfmt
pool:
vmImage: ubuntu-16.04
steps:
- template: install-rust.yml
parameters:
rust_version: stable
- script: |
rustup component add rustfmt
displayName: Install rustfmt
- script: |
cargo fmt --all -- --check
displayName: Check formatting

View File

@ -1,32 +0,0 @@
steps:
# Install Node.js
- task: NodeTool@0
inputs:
versionSpec: "12.0.0"
displayName: "Install a fixed version of Node"
# Install Go
- task: GoTool@0
inputs:
versionSpec: "1.10"
displayName: "Install a fixed version of Go"
# Install Ruby
- task: UseRubyVersion@0
inputs:
versionSpec: "2.5.5"
displayName: "Install a fixed version of Ruby"
# We are using pyenv to install Python for integration tests
# Install Python
- script: |
echo "##vso[task.setvariable variable=PYTHON_VERSION;]3.6.9"
echo "##vso[task.setvariable variable=PYENV_ROOT;]$HOME/.pyenv"
- script: |
curl https://pyenv.run | bash
echo "##vso[task.setvariable variable=PATH;]$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH"
- script: |
eval "$(pyenv init -)"
pyenv install $PYTHON_VERSION
pyenv global $PYTHON_VERSION
displayName: "Install a fixed version of Python"

View File

@ -1,23 +0,0 @@
jobs:
- job: ${{ parameters.name }}
displayName: ${{ parameters.displayName }}
pool:
vmImage: ubuntu-16.04
steps:
- script: docker pull starshipcommand/starship-test
displayName: Pull docker image
- script: |
# In order to run tests as a non-root user in docker,
# the files need to be accessible to non-root users
chmod -R a+w .
./integration_test
displayName: Run integration test suite
- script: |
docker login -u $(dockerUsername) -p $(dockerPassword)
docker push starshipcommand/starship-test
# Only push new image if on master and build is passing
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
displayName: Push image to dockerhub

View File

@ -1,28 +0,0 @@
parameters:
rust_version: stable
jobs:
- job: ${{ parameters.name }}
displayName: ${{ parameters.displayName }} ${{parameters.rust_version}}
strategy:
matrix:
Linux:
vmImage: ubuntu-16.04
${{ if parameters.cross }}:
MacOS:
vmImage: macOS-10.13
# Temporarily disable Windows support
# Windows:
# vmImage: vs2017-win2016
pool:
vmImage: $(vmImage)
steps:
- template: install-rust.yml
- template: setup-test-env.yml
- script: |
cargo test -- -Z unstable-options --include-ignored
env:
CI: "true"
displayName: cargo test

View File

@ -4,8 +4,6 @@ use std::process::Command;
use ansi_term::Color;
use crate::config::Config;
use super::{Context, Module};
/// Creates a module with the current Python version

View File

@ -16,7 +16,7 @@ RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | ba
RUN node --version
# Install Go
ENV GO_VERSION 1.10.0
ENV GO_VERSION 1.12.1
ENV GOENV_ROOT /home/nonroot/.goenv
ENV PATH $GOENV_ROOT/bin:$GOENV_ROOT/shims:$PATH
RUN git clone https://github.com/syndbg/goenv.git $GOENV_ROOT \
@ -28,7 +28,7 @@ RUN git clone https://github.com/syndbg/goenv.git $GOENV_ROOT \
RUN go version
# Install Ruby
ENV RUBY_VERSION 2.5.5
ENV RUBY_VERSION 2.6.3
ENV RBENV_ROOT /home/nonroot/.rbenv
ENV PATH $RBENV_ROOT/bin:$RBENV_ROOT/shims:$PATH
RUN curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash \

View File

@ -90,13 +90,13 @@ fn test_truncate_length(
expected_name: &str,
truncation_symbol: &str,
) -> io::Result<()> {
return test_truncate_length_with_config(
test_truncate_length_with_config(
branch_name,
truncate_length,
expected_name,
truncation_symbol,
"",
);
)
}
fn test_truncate_length_with_config(

View File

@ -31,7 +31,7 @@ fn folder_with_go_file() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -48,7 +48,7 @@ fn folder_with_go_mod() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -65,7 +65,7 @@ fn folder_with_go_sum() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -83,7 +83,7 @@ fn folder_with_godeps() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -100,7 +100,7 @@ fn folder_with_glide_yaml() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -117,7 +117,7 @@ fn folder_with_gopkg_yml() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}
@ -134,7 +134,7 @@ fn folder_with_gopkg_lock() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.10"));
let expected = format!("via {} ", Color::Cyan.bold().paint("🐹 v1.12.1"));
assert_eq!(expected, actual);
Ok(())
}

View File

@ -1,8 +1,5 @@
use ansi_term::Color;
use std::fs;
use std::io;
use std::path::Path;
use tempfile::TempDir;
use crate::common::{self, TestCommand};

View File

@ -4,7 +4,6 @@ use std::io;
use ansi_term::Color;
use crate::common;
use crate::common::TestCommand;
#[test]
#[ignore]
@ -110,42 +109,3 @@ fn with_virtual_env() -> io::Result<()> {
assert_eq!(expected, actual);
Ok(())
}
#[test]
#[ignore]
fn with_pyenv() -> io::Result<()> {
let dir = common::new_tempdir()?;
File::create(dir.path().join("main.py"))?;
let output = common::render_module("python")
.use_config(toml::toml! {
[python]
pyenv_version_name = true
})
.env("VIRTUAL_ENV", "/foo/bar/my_venv")
.arg("--path")
.arg(dir.path())
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Yellow.bold().paint("🐍 pyenv system"));
assert_eq!(expected, actual);
Ok(())
}
#[test]
#[ignore]
fn with_pyenv_no_output() -> io::Result<()> {
let dir = common::new_tempdir()?;
File::create(dir.path().join("main.py"))?;
let output = common::render_module("python")
.use_config(toml::toml! {
[python]
pyenv_version_name = true
})
.env("PATH", "")
.arg("--path")
.arg(dir.path())
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
assert_eq!("", actual);
Ok(())
}

View File

@ -1,5 +1,5 @@
use ansi_term::Color;
use std::fs::{self, File};
use std::fs::File;
use std::io;
use crate::common;
@ -31,7 +31,7 @@ fn folder_with_gemfile() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.5.5"));
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.6.3"));
assert_eq!(expected, actual);
Ok(())
}
@ -48,7 +48,7 @@ fn folder_with_rb_file() -> io::Result<()> {
.output()?;
let actual = String::from_utf8(output.stdout).unwrap();
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.5.5"));
let expected = format!("via {} ", Color::Red.bold().paint("💎 v2.6.3"));
assert_eq!(expected, actual);
Ok(())
}