Add GitHubActions plugin for CI and docs

The docs deployment requires Documenter 0.24 but I'm assuming that
PkgTemplates 0.7 won't be released until after Documenter 0.24.
This commit is contained in:
Chris de Graaf 2019-11-09 00:26:05 +07:00
parent 6bb3c2c669
commit 4d70635d3a
No known key found for this signature in database
GPG Key ID: 150FFDD9B0073C7B
13 changed files with 250 additions and 27 deletions

View File

@ -50,6 +50,7 @@ These plugins will create the configuration files of common CI services for you.
AppVeyor AppVeyor
CirrusCI CirrusCI
DroneCI DroneCI
GitHubActions
GitLabCI GitLabCI
TravisCI TravisCI
``` ```
@ -91,9 +92,9 @@ Template(;
plugins=[ plugins=[
License(; name="MPL"), License(; name="MPL"),
Git(; manifest=true, ssh=true), Git(; manifest=true, ssh=true),
TravisCI(; x86=true), GitHubActions(; x86=true),
Codecov(), Codecov(),
Documenter{TravisCI}(), Documenter{GitHubActions}(),
Develop(), Develop(),
], ],
) )

View File

@ -22,6 +22,7 @@ export
Develop, Develop,
Documenter, Documenter,
Git, Git,
GitHubActions,
GitLabCI, GitLabCI,
License, License,
ProjectFile, ProjectFile,

View File

@ -13,14 +13,84 @@ const DEFAULT_CI_VERSIONS_NO_NIGHTLY = map(format_version, [default_version(), V
const EXTRA_VERSIONS_DOC = "- `extra_versions::Vector`: Extra Julia versions to test, as strings or `VersionNumber`s." const EXTRA_VERSIONS_DOC = "- `extra_versions::Vector`: Extra Julia versions to test, as strings or `VersionNumber`s."
""" """
collect_versions(t::Template, versions::Vector) -> Vector{String} GitHubActions(;
file="$(contractuser(default_file("github", "workflows", "ci.yml")))",
destination="ci.yml",
linux=true,
osx=true,
windows=true,
x64=true,
x86=false,
coverage=true,
extra_versions=$DEFAULT_CI_VERSIONS_NO_NIGHTLY,
)
Combine `t`'s Julia version with `versions`, and format them as `major.minor`. Integrates your packages with [GitHub Actions](https://github.com/features/actions).
This is useful for creating lists of versions to be included in CI configurations.
## Keyword Arguments
- `file::AbstractString`: Template file for the workflow file.
- `destination::AbstractString`: Destination of the worflow file,
relative to `.github/workflows`.
- `linux::Bool`: Whether or not to run builds on Linux.
- `osx::Bool`: Whether or not to run builds on OSX (MacOS).
- `windows::Bool`: Whether or not to run builds on Windows.
- `x64::Bool`: Whether or not to run builds on 64-bit architecture.
- `x86::Bool`: Whether or not to run builds on 32-bit architecture.
- `coverage::Bool`: Whether or not to publish code coverage.
Another code coverage plugin such as [`Codecov`](@ref) must also be included.
$EXTRA_VERSIONS_DOC
!!! note
If using coverage plugins, don't forget to manually add your API tokens as secrets,
as described [here](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#creating-encrypted-secrets).
!!! note
Nightly Julia is not supported.
""" """
function collect_versions(t::Template, versions::Vector) @with_kw_noshow struct GitHubActions <: BasicPlugin
vs = map(format_version, [t.julia, versions...]) file::String = default_file("github", "workflows", "ci.yml")
return sort(unique(vs)) destination::String = "ci.yml"
linux::Bool = true
osx::Bool = true
windows::Bool = true
x64::Bool = true
x86::Bool = false
coverage::Bool = true
extra_versions::Vector = DEFAULT_CI_VERSIONS_NO_NIGHTLY
end
source(p::GitHubActions) = p.file
destination(p::GitHubActions) = joinpath(".github", "workflows", p.destination)
tags(::GitHubActions) = "<<", ">>"
badges(p::GitHubActions) = Badge(
"Build Status",
"https://github.com/{{{USER}}}/{{{PKG}}}.jl/actions",
"https://github.com/{{{USER}}}/{{{PKG}}}.jl/workflows/CI/badge.svg",
)
function view(p::GitHubActions, t::Template, pkg::AbstractString)
os = String[]
p.linux && push!(os, "ubuntu-latest")
p.osx && push!(os, "macOS-latest")
p.windows && push!(os, "windows-latest")
arch = filter(a -> getfield(p, Symbol(a)), ["x64", "x86"])
excludes = Dict{String, String}[]
p.osx && p.x86 && push!(excludes, Dict("E_OS" => "macOS-latest", "E_ARCH" => "x86"))
return Dict(
"ARCH" => arch,
"EXCLUDES" => excludes,
"HAS_CODECOV" => p.coverage && hasplugin(t, Codecov),
"HAS_COVERALLS" => p.coverage && hasplugin(t, Coveralls),
"HAS_DOCUMENTER" => hasplugin(t, Documenter{GitHubActions}),
"HAS_EXCLUDES" => !isempty(excludes),
"OS" => os,
"PKG" => pkg,
"USER" => t.user,
"VERSIONS" => collect_versions(t, p.extra_versions),
)
end end
""" """
@ -319,6 +389,17 @@ function view(p::DroneCI, t::Template, pkg::AbstractString)
) )
end end
"""
collect_versions(t::Template, versions::Vector) -> Vector{String}
Combine `t`'s Julia version with `versions`, and format them as `major.minor`.
This is useful for creating lists of versions to be included in CI configurations.
"""
function collect_versions(t::Template, versions::Vector)
vs = map(format_version, [t.julia, versions...])
return sort(unique(vs))
end
""" """
is_ci(::Plugin) -> Bool is_ci(::Plugin) -> Bool
@ -326,6 +407,6 @@ Determine whether or not a plugin is a CI plugin.
If you are adding a CI plugin, you should implement this function and return `true`. If you are adding a CI plugin, you should implement this function and return `true`.
""" """
is_ci(::Plugin) = false is_ci(::Plugin) = false
is_ci(::Union{AppVeyor, TravisCI, CirrusCI, GitLabCI, DroneCI}) = true is_ci(::Union{AppVeyor, GitHubActions, TravisCI, CirrusCI, GitLabCI, DroneCI}) = true
needs_username(::Union{AppVeyor, TravisCI, CirrusCI, GitLabCI, DroneCI}) = true needs_username(::Union{AppVeyor, GitHubActions, TravisCI, CirrusCI, GitLabCI, DroneCI}) = true

View File

@ -3,6 +3,9 @@ const DOCUMENTER_DEP = PackageSpec(;
uuid="e30172f5-a6a5-5a46-863b-614d45cd2de4", uuid="e30172f5-a6a5-5a46-863b-614d45cd2de4",
) )
const DeployStyle = Union{TravisCI, GitHubActions, GitLabCI, Nothing}
const GitHubPagesStyle = Union{TravisCI, GitHubActions}
""" """
Documenter{T<:Union{TravisCI, GitLabCI, Nothing}}(; Documenter{T<:Union{TravisCI, GitLabCI, Nothing}}(;
make_jl="$(contractuser(default_file("docs", "make.jl")))", make_jl="$(contractuser(default_file("docs", "make.jl")))",
@ -17,6 +20,8 @@ Documentation deployment depends on `T`, where `T` is some supported CI plugin,
or `Nothing` to only support local documentation builds. or `Nothing` to only support local documentation builds.
## Supported Type Parameters ## Supported Type Parameters
- `GitHubActions`: Deploys documentation to [GitHub Pages](https://pages.github.com)
with the help of [`GitHubActions`](@ref).
- `TravisCI`: Deploys documentation to [GitHub Pages](https://pages.github.com) - `TravisCI`: Deploys documentation to [GitHub Pages](https://pages.github.com)
with the help of [`TravisCI`](@ref). with the help of [`TravisCI`](@ref).
- `GitLabCI`: Deploys documentation to [GitLab Pages](https://pages.gitlab.com) - `GitLabCI`: Deploys documentation to [GitLab Pages](https://pages.gitlab.com)
@ -37,7 +42,7 @@ or `Nothing` to only support local documentation builds.
If deploying documentation with Travis CI, don't forget to complete If deploying documentation with Travis CI, don't forget to complete
[the required configuration](https://juliadocs.github.io/Documenter.jl/stable/man/hosting/#SSH-Deploy-Keys-1). [the required configuration](https://juliadocs.github.io/Documenter.jl/stable/man/hosting/#SSH-Deploy-Keys-1).
""" """
struct Documenter{T<:Union{TravisCI, GitLabCI, Nothing}} <: Plugin struct Documenter{T<:DeployStyle} <: Plugin
assets::Vector{String} assets::Vector{String}
makedocs_kwargs::Dict{Symbol} makedocs_kwargs::Dict{Symbol}
canonical_url::Union{Function, Nothing} canonical_url::Union{Function, Nothing}
@ -51,7 +56,7 @@ struct Documenter{T<:Union{TravisCI, GitLabCI, Nothing}} <: Plugin
canonical_url::Union{Function, Nothing}=make_canonical(T), canonical_url::Union{Function, Nothing}=make_canonical(T),
make_jl::AbstractString=default_file("docs", "make.jl"), make_jl::AbstractString=default_file("docs", "make.jl"),
index_md::AbstractString=default_file("docs", "src", "index.md"), index_md::AbstractString=default_file("docs", "src", "index.md"),
) where T <: Union{TravisCI, GitLabCI, Nothing} ) where T <: DeployStyle
return new(assets, makedocs_kwargs, canonical_url, make_jl, index_md) return new(assets, makedocs_kwargs, canonical_url, make_jl, index_md)
end end
end end
@ -61,7 +66,7 @@ Documenter(; kwargs...) = Documenter{Nothing}(; kwargs...)
gitignore(::Documenter) = ["/docs/build/"] gitignore(::Documenter) = ["/docs/build/"]
badges(::Documenter) = Badge[] badges(::Documenter) = Badge[]
badges(::Documenter{TravisCI}) = [ badges(::Documenter{<:GitHubPagesStyle}) = [
Badge( Badge(
"Stable", "Stable",
"https://img.shields.io/badge/docs-stable-blue.svg", "https://img.shields.io/badge/docs-stable-blue.svg",
@ -90,18 +95,17 @@ view(p::Documenter, t::Template, pkg::AbstractString) = Dict(
"USER" => t.user, "USER" => t.user,
) )
function view(p::Documenter{TravisCI}, t::Template, pkg::AbstractString) function view(p::Documenter{<:GitHubPagesStyle}, t::Template, pkg::AbstractString)
base = invoke(view, Tuple{Documenter, Template, AbstractString}, p, t, pkg) base = invoke(view, Tuple{Documenter, Template, AbstractString}, p, t, pkg)
return merge(base, Dict("HAS_DEPLOY" => true)) return merge(base, Dict("HAS_DEPLOY" => true))
end end
foreach((TravisCI, GitLabCI)) do T validate(::Documenter{Nothing}, ::Template) = nothing
@eval function validate(::Documenter{$T}, t::Template) function validate(::Documenter{T}, t::Template) where T <: DeployStyle
if !hasplugin(t, $T) if !hasplugin(t, T)
name = nameof($T) name = nameof(T)
s = "Documenter: The $name plugin must be included for docs deployment to be set up" s = "Documenter: The $name plugin must be included for docs deployment to be set up"
throw(ArgumentError(s)) throw(ArgumentError(s))
end
end end
end end
@ -127,7 +131,7 @@ end
github_pages_url(t::Template, pkg::AbstractString) = "https://$(t.user).github.io/$pkg.jl" github_pages_url(t::Template, pkg::AbstractString) = "https://$(t.user).github.io/$pkg.jl"
gitlab_pages_url(t::Template, pkg::AbstractString) = "https://$(t.user).gitlab.io/$pkg.jl" gitlab_pages_url(t::Template, pkg::AbstractString) = "https://$(t.user).gitlab.io/$pkg.jl"
make_canonical(::Type{TravisCI}) = github_pages_url make_canonical(::Type{<:GitHubPagesStyle}) = github_pages_url
make_canonical(::Type{GitLabCI}) = gitlab_pages_url make_canonical(::Type{GitLabCI}) = gitlab_pages_url
make_canonical(::Type{Nothing}) = nothing make_canonical(::Type{Nothing}) = nothing

View File

@ -48,6 +48,7 @@ end
badge_order() = [ badge_order() = [
Documenter{GitLabCI}, Documenter{GitLabCI},
Documenter{TravisCI}, Documenter{TravisCI},
GitHubActions,
GitLabCI, GitLabCI,
TravisCI, TravisCI,
AppVeyor, AppVeyor,

View File

@ -0,0 +1,67 @@
name: CI
on:
- push
- pull_request
jobs:
test:
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
version:
<<#VERSIONS>>
- '<<&.>>'
<</VERSIONS>>
os:
<<#OS>>
- <<&.>>
<</OS>>
arch:
<<#ARCH>>
- <<&.>>
<</ARCH>>
<<#HAS_EXCLUDES>>
exclude:
<</HAS_EXCLUDES>>
<<#EXCLUDES>>
- os: <<&E_OS>>
arch: <<&E_ARCH>>
<<#E_VERSION>>
version: '<<&E_VERSION>>'
<</E_VERSION>>
<</EXCLUDES>>
steps:
- uses: actions/checkout@v1
- uses: julia-actions/setup-julia@latest
with:
version: ${{ matrix.version }}
arch: ${{ matrix.arch }}
- uses: julia-actions/julia-buildpkg@latest
- uses: julia-actions/julia-runtest@latest
<<#HAS_CODECOV>>
- uses: julia-actions/julia-uploadcodecov@latest
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
<</HAS_CODECOV>>
<<#HAS_COVERALLS>>
- uses: julia-actions/julia-uploadcoveralls@latest
env:
COVERALLS_TOKEN: ${{ secrets.COVERALLS_TOKEN }}
<</HAS_COVERALLS>>
<<#HAS_DOCUMENTER>>
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: julia-actions/setup-julia@latest
with:
version: '1.0'
- run: julia --project=docs -e '
using Pkg;
Pkg.develop(PackageSpec(; path=pwd()));
Pkg.instantiate();'
- run: julia --project=docs docs/make.jl
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
<</HAS_DOCUMENTER>>

View File

@ -0,0 +1,33 @@
name: CI
on:
- push
- pull_request
jobs:
test:
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
version:
- '1.0'
- '1.2'
os:
- ubuntu-latest
- macOS-latest
- windows-latest
arch:
- x64
steps:
- uses: actions/checkout@v1
- uses: julia-actions/setup-julia@latest
with:
version: ${{ matrix.version }}
arch: ${{ matrix.arch }}
- uses: julia-actions/julia-buildpkg@latest
- uses: julia-actions/julia-runtest@latest
- uses: julia-actions/julia-uploadcodecov@latest
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
- uses: julia-actions/julia-uploadcoveralls@latest
env:
COVERALLS_TOKEN: ${{ secrets.COVERALLS_TOKEN }}

View File

@ -1,5 +1,6 @@
# AllPlugins # AllPlugins
[![Build Status](https://github.com/tester/AllPlugins.jl/actions)](https://github.com/tester/AllPlugins.jl/workflows/CI/badge.svg)
[![Build Status](https://gitlab.com/tester/AllPlugins.jl/badges/master/build.svg)](https://gitlab.com/tester/AllPlugins.jl/pipelines) [![Build Status](https://gitlab.com/tester/AllPlugins.jl/badges/master/build.svg)](https://gitlab.com/tester/AllPlugins.jl/pipelines)
[![Coverage](https://gitlab.com/tester/AllPlugins.jl/badges/master/coverage.svg)](https://gitlab.com/tester/AllPlugins.jl/commits/master) [![Coverage](https://gitlab.com/tester/AllPlugins.jl/badges/master/coverage.svg)](https://gitlab.com/tester/AllPlugins.jl/commits/master)
[![Build Status](https://travis-ci.com/tester/AllPlugins.jl.svg?branch=master)](https://travis-ci.com/tester/AllPlugins.jl) [![Build Status](https://travis-ci.com/tester/AllPlugins.jl.svg?branch=master)](https://travis-ci.com/tester/AllPlugins.jl)

View File

@ -0,0 +1,30 @@
name: CI
on:
- push
- pull_request
jobs:
test:
name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
version:
- '1.0'
- '1.2'
os:
- macOS-latest
- windows-latest
arch:
- x64
- x86
exclude:
- os: macOS-latest
arch: x86
steps:
- uses: actions/checkout@v1
- uses: julia-actions/setup-julia@latest
with:
version: ${{ matrix.version }}
arch: ${{ matrix.arch }}
- uses: julia-actions/julia-buildpkg@latest
- uses: julia-actions/julia-runtest@latest

View File

@ -1,4 +1,4 @@
# WackyOptions [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://tester.gitlab.io/WackyOptions.jl/dev) [![Build Status](https://gitlab.com/tester/WackyOptions.jl/badges/master/build.svg)](https://gitlab.com/tester/WackyOptions.jl/pipelines) [![Build Status](https://travis-ci.com/tester/WackyOptions.jl.svg?branch=master)](https://travis-ci.com/tester/WackyOptions.jl) [![Build Status](https://ci.appveyor.com/api/projects/status/github/tester/WackyOptions.jl?svg=true)](https://ci.appveyor.com/project/tester/WackyOptions-jl) [![Build Status](https://cloud.drone.io/api/badges/tester/WackyOptions.jl/status.svg)](https://cloud.drone.io/tester/WackyOptions.jl) [![Build Status](https://api.cirrus-ci.com/github/tester/WackyOptions.jl.svg)](https://cirrus-ci.com/github/tester/WackyOptions.jl) [![Coverage](https://codecov.io/gh//.jl/branch/master/graph/badge.svg)](https://codecov.io/gh//.jl) [![Coverage](https://coveralls.io/repos/github//.jl/badge.svg?branch=master)](https://coveralls.io/github//.jl?branch=master) # WackyOptions [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://tester.gitlab.io/WackyOptions.jl/dev) [![Build Status](https://github.com/tester/WackyOptions.jl/actions)](https://github.com/tester/WackyOptions.jl/workflows/CI/badge.svg) [![Build Status](https://gitlab.com/tester/WackyOptions.jl/badges/master/build.svg)](https://gitlab.com/tester/WackyOptions.jl/pipelines) [![Build Status](https://travis-ci.com/tester/WackyOptions.jl.svg?branch=master)](https://travis-ci.com/tester/WackyOptions.jl) [![Build Status](https://ci.appveyor.com/api/projects/status/github/tester/WackyOptions.jl?svg=true)](https://ci.appveyor.com/project/tester/WackyOptions-jl) [![Build Status](https://cloud.drone.io/api/badges/tester/WackyOptions.jl/status.svg)](https://cloud.drone.io/tester/WackyOptions.jl) [![Build Status](https://api.cirrus-ci.com/github/tester/WackyOptions.jl.svg)](https://cirrus-ci.com/github/tester/WackyOptions.jl) [![Coverage](https://codecov.io/gh//.jl/branch/master/graph/badge.svg)](https://codecov.io/gh//.jl) [![Coverage](https://coveralls.io/repos/github//.jl/badge.svg?branch=master)](https://coveralls.io/github//.jl?branch=master)
## Citing ## Citing

View File

@ -48,9 +48,9 @@ uuid = "a63ad114-7e13-5084-954f-fe012c677804"
[[Parsers]] [[Parsers]]
deps = ["Dates", "Test"] deps = ["Dates", "Test"]
git-tree-sha1 = "ef0af6c8601db18c282d092ccbd2f01f3f0cd70b" git-tree-sha1 = "c56ecb484f286639f161e712b8311f5ab77e8d32"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "0.3.7" version = "0.3.8"
[[Pkg]] [[Pkg]]
deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"] deps = ["Dates", "LibGit2", "Markdown", "Printf", "REPL", "Random", "SHA", "UUIDs"]

View File

@ -22,8 +22,8 @@ end
@testset "All plugins" begin @testset "All plugins" begin
test_all("AllPlugins"; authors=USER, plugins=[ test_all("AllPlugins"; authors=USER, plugins=[
AppVeyor(), CirrusCI(), Citation(), Codecov(), Coveralls(), AppVeyor(), CirrusCI(), Citation(), Codecov(), Coveralls(), Develop(),
Develop(), Documenter(), DroneCI(), GitLabCI(), TravisCI(), Documenter(), DroneCI(), GitHubActions(), GitLabCI(), TravisCI(),
]) ])
end end
@ -41,6 +41,7 @@ end
), ),
DroneCI(; amd64=false, arm=true, arm64=true, extra_versions=["1.1"]), DroneCI(; amd64=false, arm=true, arm64=true, extra_versions=["1.1"]),
Git(; ignore=["a", "b", "c"], manifest=true), Git(; ignore=["a", "b", "c"], manifest=true),
GitHubActions(; x86=true, linux=false, coverage=false),
GitLabCI(; coverage=false, extra_versions=[v"0.6"]), GitLabCI(; coverage=false, extra_versions=[v"0.6"]),
License(; name="ISC"), License(; name="ISC"),
ProjectFile(; version=v"1"), ProjectFile(; version=v"1"),

View File

@ -61,6 +61,9 @@
end end
@testset "validate" begin @testset "validate" begin
foreach((GitHubActions, TravisCI, GitLabCI)) do T
@test_throws ArgumentError tpl(; plugins=[Documenter{T}()])
end
mock(LibGit2.getconfig => (_k, _d) -> "") do _gc mock(LibGit2.getconfig => (_k, _d) -> "") do _gc
@test_throws ArgumentError tpl(; plugins=[Git()]) @test_throws ArgumentError tpl(; plugins=[Git()])
end end