ci: Update CI and migrate publish job to Actions (#455)

- Replace hecrj/setup-rust-action with actions-rs tools
- Add a Cargo Audit test step
- Move cargo publish step from Azure Pipelines to GitHub Actions
- Use cargo-publish-all to publish multiple packages at once
- Automate the creation of release notes
This commit is contained in:
Matan Kushner 2019-10-04 15:12:48 +09:00 committed by GitHub
parent 34bca5a035
commit aee46dd678
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 357 additions and 385 deletions

49
.github/chglog/CHANGELOG.tpl.md vendored Executable file
View File

@ -0,0 +1,49 @@
{{ if .Versions -}}
<a name="unreleased"></a>
## [Unreleased]
{{ if .Unreleased.CommitGroups -}}
{{ range .Unreleased.CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}
{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
- {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}
{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
{{ end -}}

29
.github/chglog/RELEASE.tpl.md vendored Executable file
View File

@ -0,0 +1,29 @@
{{ range .Versions }}
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
* {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
* {{ .Revert.Header }}
{{ end }}
{{ end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

29
.github/chglog/changelog.yml vendored Executable file
View File

@ -0,0 +1,29 @@
style: github
template: CHANGELOG.tpl.md
info:
title: CHANGELOG
repository_url: https://github.com/starship/starship
options:
commits:
# filters:
# Type:
# - feat
# - fix
# - perf
# - refactor
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
perf: Performance Improvements
refactor: Code Refactoring
ci: Continuous Integration
header:
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
pattern_maps:
- Type
- Scope
- Subject
notes:
keywords:
- BREAKING CHANGE

28
.github/chglog/release.yml vendored Executable file
View File

@ -0,0 +1,28 @@
style: github
template: RELEASE.tpl.md
info:
repository_url: https://github.com/starship/starship
options:
commits:
# filters:
# Type:
# - feat
# - fix
# - perf
# - refactor
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
perf: Performance Improvements
refactor: Code Refactoring
ci: Continuous Integration
header:
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
pattern_maps:
- Type
- Scope
- Subject
notes:
keywords:
- BREAKING CHANGE

View File

@ -1,100 +0,0 @@
name: Continuous Integration
on: [push, pull_request]
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"
# Install dotnet at a fixed version
- uses: actions/setup-dotnet@master
with:
dotnet-version: "2.2.402"
# 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

222
.github/workflows/workflow.yml vendored Normal file
View File

@ -0,0 +1,222 @@
name: Workflow
on: [push, pull_request]
jobs:
# Run the `rustfmt` code formatter
rustfmt:
name: Rustfmt [Formatter]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- run: rustup component add rustfmt
- uses: actions-rs/cargo@v1
with:
command: fmt
args: --all -- --check
# Run the `clippy` linting tool
clippy:
name: Clippy [Linter]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- run: rustup component add clippy
- uses: actions-rs/clippy-check@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
args: --all-targets --all-features -- -D clippy::all
# Run a security audit on dependencies
cargo_audit:
name: Cargo Audit [Security]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- run: cargo install --force cargo-audit
- run: cargo generate-lockfile
- uses: actions-rs/cargo@v1
with:
command: audit
# Ensure that the project could be successfully compiled
cargo_check:
name: Compile
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: check
args: --all
# Run tests on Linux, and macOS
# On both Rust stable and Rust nightly
test:
name: Test Suite
needs: [cargo_check]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macOS-latest]
rust: [stable, nightly]
steps:
# Checkout the branch being tested
- uses: actions/checkout@v1
# Install all the required dependencies for testing
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
# 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"
# Install dotnet at a fixed version
- uses: actions/setup-dotnet@master
with:
dotnet-version: "2.2.402"
# Run the ignored tests that expect the above setup
- name: Run all tests
uses: actions-rs/cargo@v1
with:
command: test
args: -- -Z unstable-options --include-ignored
# Run the tests in the Docker image
docker_test:
name: Test in Docker
needs: [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
# Publish all packages to Crates.io
cargo_publish:
if: startsWith(github.ref, 'refs/tags/v')
name: Publish Cargo Packages
needs: [test, docker_test]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
- run: cargo install --force cargo-publish-all
- run: cargo-publish-all --token $CRATES_IO_TOKEN --yes
github_release:
if: startsWith(github.ref, 'refs/tags/v')
name: Create GitHub release [${{ matrix.target }}]
needs: [test, docker_test]
strategy:
fail-fast: false
matrix:
# In order to use different target names on parallel ubuntu builds,
# we use `ubuntu-latest` and `ubuntu-18.04` to include them separately
os: [ubuntu-latest, ubuntu-18.04, macOS-latest]
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
bin: starship
name: starship-x86_64-unknown-linux-gnu.tar.gz
- os: ubuntu-18.04
target: x86_64-unknown-linux-musl
bin: starship
name: starship-x86_64-unknown-linux-musl.tar.gz
- os: macOS-latest
target: x86_64-apple-darwin
bin: starship
name: starship-x86_64-apple-darwin.tar.gz
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
target: ${{ matrix.target }}
- name: Install musl tools
if: matrix.target == 'x86_64-unknown-linux-musl'
run: sudo apt-get install -y musl-tools
- name: Build target
uses: actions-rs/cargo@v1
with:
command: build
args: --release --target ${{ matrix.target }}
- name: Prepare build artifacts
run: |
strip target/${{ matrix.target }}/release/${{ matrix.bin }}
cd target/${{ matrix.target }}/release
if [[ "${{ matrix.os }}" == "windows-latest" ]]
then
7z a ../../../${{ matrix.name }} ${{ matrix.bin }}
else
tar czvf ../../../${{ matrix.name }} ${{ matrix.bin }}
fi
cd -
- name: Generate release notes
run: |
# Temporary fix for https://github.com/actions/setup-go/issues/14
export PATH=$PATH:$(go env GOPATH)/bin
go get -u github.com/git-chglog/git-chglog/cmd/git-chglog
git-chglog -c .github/chglog/release.yml $(git describe --tags $(git rev-list --tags --max-count=1)) > RELEASE.txt
- name: Create GitHub release ${{ matrix.target }}
uses: softprops/action-gh-release@v1
with:
files: ${{ matrix.name }}
body_path: RELEASE.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,35 +0,0 @@
trigger:
tags:
include: ["*"]
stages:
- stage: Release
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
jobs:
# Release binary on GitHub
- template: ci/github-release.yml
parameters:
name: github_release
rust_version: stable
contents: |
*
!*.rlib
!*.d
!.*
targets:
- x86_64-unknown-linux-gnu
- x86_64-unknown-linux-musl
# Windows support temporarily disabled
# - x86_64-pc-windows-gnu
# - x86_64-pc-windows-msvc
- x86_64-apple-darwin
github:
gitHubConnection: StarshipRelease
repositoryName: starship/starship
isPreRelease: false
# Publish package to Crates.io
- template: ci/cargo-publish.yml
parameters:
name: cargo_publish
displayName: Publish to Crates.io

View File

@ -1,15 +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 login $(CARGO_TOKEN)
cargo publish
displayName: Publish package to Crates.io

View File

@ -1,157 +0,0 @@
parameters:
rust_version: stable
github:
isPreRelease: false
repositoryName: "$(Build.Repository.Name)"
displayName: "Release to GitHub"
archiveName: "$(Build.Repository.Name)"
jobs:
- job: ${{ parameters.name }}
displayName: ${{ parameters.displayName }}
pool:
vmImage: ubuntu-16.04
steps:
- template: install-cross-rust.yml
- bash: |
MY_TAG="$(Build.SourceBranch)"
MY_TAG=${MY_TAG#refs/tags/}
echo $MY_TAG
echo "##vso[task.setvariable variable=build.my_tag]$MY_TAG"
DATE="$(date +%Y-%m-%d)"
echo "##vso[task.setvariable variable=build.date]$DATE"
displayName: "Create date and tag variables"
- ${{ each build_target in parameters.targets }}:
- ? ${{ if not(or(eq(build_target, 'x86_64-apple-darwin'), eq(build_target, 'x86_64-pc-windows-msvc'))) }}
: - script: |
echo Start building ${{ build_target }}
cross build --target ${{ build_target }} --release
ls -l
ls -l target/${{ build_target }}/release/*
displayName: Relase build for target ${{ build_target }}
- task: CopyFiles@2
displayName: Copy files for target ${{ build_target }}
inputs:
sourceFolder: "$(Build.SourcesDirectory)/target/${{ build_target }}/release"
contents: ${{ parameters.contents }}
targetFolder: "$(Build.BinariesDirectory)/${{ build_target }}"
- task: ArchiveFiles@2
displayName: Gather assets
inputs:
rootFolderOrFile: "$(Build.BinariesDirectory)/${{ build_target }}"
archiveType: "tar"
tarCompression: "gz"
archiveFile: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}-$(build.my_tag)-${{ build_target }}.tar.gz"
- task: GitHubRelease@0
displayName: Create release
inputs:
gitHubConnection: ${{ parameters.github.gitHubConnection }}
tagSource: manual
title: "$(build.my_tag) - $(build.date)"
tag: "$(build.my_tag)"
assetUploadMode: replace
action: edit
assets: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}*"
repositoryName: ${{ parameters.github.repositoryName }}
isPreRelease: ${{ parameters.github.isPreRelease }}
- ${{ each build_target in parameters.targets }}:
- ${{ if eq(build_target, 'x86_64-apple-darwin') }}:
- job: ${{ parameters.name }}_macOS
displayName: ${{ parameters.displayName }} (macOS)
pool:
vmImage: macOS-10.13
steps:
- template: install-rust.yml
- bash: |
MY_TAG="$(Build.SourceBranch)"
MY_TAG=${MY_TAG#refs/tags/}
echo $MY_TAG
echo "##vso[task.setvariable variable=build.my_tag]$MY_TAG"
DATE="$(date +%Y-%m-%d)"
echo "##vso[task.setvariable variable=build.date]$DATE"
displayName: "Create date and tag variables"
- script: |
echo Start building ${{ build_target }}
cargo build --release
ls -l
ls -l target/release/*
displayName: Relase build for target ${{ build_target }}
- task: CopyFiles@2
displayName: Copy files for target ${{ build_target }}
inputs:
sourceFolder: "$(Build.SourcesDirectory)/target/release"
contents: ${{ parameters.contents }}
targetFolder: "$(Build.BinariesDirectory)/${{ build_target }}"
- task: ArchiveFiles@2
displayName: Gather assets
inputs:
rootFolderOrFile: "$(Build.BinariesDirectory)/${{ build_target }}"
archiveType: "tar"
tarCompression: "gz"
archiveFile: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}-$(build.my_tag)-${{ build_target }}.tar.gz"
- task: GitHubRelease@0
displayName: Create release
inputs:
gitHubConnection: ${{ parameters.github.gitHubConnection }}
tagSource: manual
title: "$(build.my_tag) - $(build.date)"
tag: "$(build.my_tag)"
assetUploadMode: replace
action: edit
assets: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}*"
repositoryName: ${{ parameters.github.repositoryName }}
isPreRelease: ${{ parameters.github.isPreRelease }}
- ${{ if eq(build_target, 'x86_64-pc-windows-msvc') }}:
- job: ${{ parameters.name }}_msvc
displayName: ${{ parameters.displayName }} (Windows)
pool:
vmImage: vs2017-win2016
steps:
- template: install-rust.yml
- bash: |
MY_TAG="$(Build.SourceBranch)"
MY_TAG=${MY_TAG#refs/tags/}
echo $MY_TAG
echo "##vso[task.setvariable variable=build.my_tag]$MY_TAG"
DATE="$(date +%Y-%m-%d)"
echo "##vso[task.setvariable variable=build.date]$DATE"
displayName: "Create date and tag variables"
- script: |
echo Start building ${{ build_target }}
cargo build --release
ls -l
ls -l target/release/*
displayName: Relase build for target ${{ build_target }}
- task: CopyFiles@2
displayName: Copy files for target ${{ build_target }}
inputs:
sourceFolder: "$(Build.SourcesDirectory)/target/release"
contents: ${{ parameters.contents }}
targetFolder: "$(Build.BinariesDirectory)/${{ build_target }}"
- task: ArchiveFiles@2
displayName: Gather assets
inputs:
rootFolderOrFile: "$(Build.BinariesDirectory)/${{ build_target }}"
archiveType: "zip"
tarCompression: "None"
archiveFile: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}-$(build.my_tag)-${{ build_target }}.zip"
- task: GitHubRelease@0
displayName: Create release
inputs:
gitHubConnection: ${{ parameters.github.gitHubConnection }}
tagSource: manual
title: "$(build.my_tag) - $(build.date)"
tag: "$(build.my_tag)"
assetUploadMode: replace
action: edit
assets: "$(Build.ArtifactStagingDirectory)/${{ parameters.archiveName }}*"
repositoryName: ${{ parameters.github.repositoryName }}
isPreRelease: ${{ parameters.github.isPreRelease }}

View File

@ -1,43 +0,0 @@
# defaults for any parameters that aren't specified
parameters:
rust_version: stable
steps:
# Linux and macOS
- script: |
set -e
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUSTUP_TOOLCHAIN
echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin:/usr/local/cargo/bin"
env:
RUSTUP_TOOLCHAIN: ${{parameters.rust_version}}
displayName: "Install rust (*nix)"
condition: not(eq(variables['Agent.OS'], 'Windows_NT'))
# Windows
- script: |
curl -sSf -o rustup-init.exe https://win.rustup.rs
rustup-init.exe -y --default-toolchain %RUSTUP_TOOLCHAIN%
set PATH=%PATH%;%USERPROFILE%\.cargo\bin
echo "##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin"
env:
RUSTUP_TOOLCHAIN: ${{parameters.rust_version}}
displayName: "Install rust (windows)"
condition: eq(variables['Agent.OS'], 'Windows_NT')
# Install additional components:
- ${{ each component in parameters.components }}:
- script: rustup component add ${{ component }}
# TEMPORATY FIX UNTIL https://github.com/rust-embedded/cross/pull/169 is merged.
- script: |
git config --global user.email "not_necessery@dont.need"
git config --global user.name "I merge the things"
git clone https://github.com/rust-embedded/cross
cd cross
cargo install --force --path .
displayName: Install cross
# All platforms
- script: |
rustup -V
rustup component list --installed
rustc -Vv
cargo -V
displayName: Query rust and cargo versions

View File

@ -1,35 +0,0 @@
# defaults for any parameters that aren't specified
parameters:
rust_version: stable
steps:
# Linux and macOS
- script: |
set -e
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain $RUSTUP_TOOLCHAIN
echo "##vso[task.setvariable variable=PATH;]$PATH:$HOME/.cargo/bin:/usr/local/cargo/bin"
env:
RUSTUP_TOOLCHAIN: ${{parameters.rust_version}}
displayName: "Install rust (*nix)"
condition: not(eq(variables['Agent.OS'], 'Windows_NT'))
# Windows
- script: |
curl -sSf -o rustup-init.exe https://win.rustup.rs
rustup-init.exe -y --default-toolchain %RUSTUP_TOOLCHAIN%
set PATH=%PATH%;%USERPROFILE%\.cargo\bin
echo "##vso[task.setvariable variable=PATH;]%PATH%;%USERPROFILE%\.cargo\bin"
env:
RUSTUP_TOOLCHAIN: ${{parameters.rust_version}}
displayName: "Install rust (windows)"
condition: eq(variables['Agent.OS'], 'Windows_NT')
# Install additional components:
- ${{ each component in parameters.components }}:
- script: rustup component add ${{ component }}
# All platforms
- script: |
rustup -V
rustup component list --installed
rustc -Vv
cargo -V
displayName: Query rust and cargo versions