diff --git a/defaults/gitlab-ci.yml b/defaults/gitlab-ci.yml new file mode 100644 index 0000000..1ee9657 --- /dev/null +++ b/defaults/gitlab-ci.yml @@ -0,0 +1,36 @@ +stages: + - test + - coverage + +.test_template: &test_template + stage: test + artifacts: + name: coverage + expire_in: 2 hours + paths: + - coverage/ + tags: + - docker + script: + - julia -e 'Pkg.clone(pwd()); Pkg.build("{{PKGNAME}}"); Pkg.test("{{PKGNAME}}"{{#GITLABCOVERAGE}}; coverage=true{{/GITLABCOVERAGE}})' + - cp -r $(julia -e 'print(Pkg.dir("{{PKGNAME}}", "src"))') coverage + +Julia {{VERSION}}: + image: julia:{{VERSION}} + <<: *test_template + +Julia nightly: + image: staticfloat/julia:nightly-x64 + allow_failure: true + <<: *test_template{{#GITLABCOVERAGE}} + +"Coverage": + stage: coverage + image: julia:0.6 + tags: + - docker + before_script: + - apt-get update && apt-get -y install git make unzip gcc bzip2 + script: + - rm -rf src && mv coverage src + - julia -e 'Pkg.add("Coverage"); using Coverage; c, t = get_summary(process_folder()); @printf("Test Coverage %.2f%%\n", 100c/t)'{{/GITLABCOVERAGE}} diff --git a/src/PkgTemplates.jl b/src/PkgTemplates.jl index 6e1c2bc..62ec943 100644 --- a/src/PkgTemplates.jl +++ b/src/PkgTemplates.jl @@ -7,7 +7,7 @@ using TerminalMenus using URIParser export generate, interactive_template, show_license, available_licenses, Template, - GitHubPages, AppVeyor, TravisCI, CodeCov, Coveralls + GitHubPages, AppVeyor, TravisCI, GitLabCI, CodeCov, Coveralls abstract type Plugin end @@ -20,6 +20,7 @@ include(joinpath("plugins", "coveralls.jl")) include(joinpath("plugins", "appveyor.jl")) include(joinpath("plugins", "codecov.jl")) include(joinpath("plugins", "travisci.jl")) +include(joinpath("plugins", "gitlabci.jl")) include(joinpath("plugins", "githubpages.jl")) const DEFAULTS_DIR = normpath(joinpath(@__DIR__, "..", "defaults")) diff --git a/src/plugins/gitlabci.jl b/src/plugins/gitlabci.jl new file mode 100644 index 0000000..a387ffb --- /dev/null +++ b/src/plugins/gitlabci.jl @@ -0,0 +1,82 @@ +""" + GitLabCI(; config_file::Union{AbstractString, Void}="", coverage::Bool=true) -> GitLabCI + +Add `GitLabCI` to a template's plugins to add a `.gitlab-ci.yml` configuration file to +generated repositories, and appropriate badge(s) to the README. + +# Keyword Arguments: +* `config_file::Union{AbstractString, Void}=""`: Path to a custom `.gitlab-ci.yml`. + If `nothing` is supplied, no file will be generated. +* `coverage::Bool=true`: Whether or not GitLab CI's built-in code coverage analysis should + be enabled. If enabled, you must set a regex in your repo settings; use + `Test Coverage (\d+.\d+)%`. +""" +@auto_hash_equals struct GitLabCI <: GenericPlugin + gitignore::Vector{AbstractString} + src::Nullable{AbstractString} + dest::AbstractString + badges::Vector{Badge} + view::Dict{String, Any} + + function GitLabCI(; config_file::Union{AbstractString, Void}="", coverage::Bool=true) + if config_file != nothing + if isempty(config_file) + config_file = joinpath(DEFAULTS_DIR, "gitlab-ci.yml") + elseif !isfile(config_file) + throw(ArgumentError("File $(abspath(config_file)) does not exist")) + end + end + badges = [ + Badge( + "Build Status", + "https://gitlab.com/{{USER}}/{{PKGNAME}}.jl/badges/master/build.svg", + "https://gitlab.com/{{USER}}/{{PKGNAME}}.jl/commits/master", + ), + ] + if coverage + push!( + badges, + Badge( + "Coverage", + "https://gitlab.com/{{USER}}/{{PKGNAME}}.jl/badges/master/coverage.svg", + "https://gitlab.com/{{USER}}/{{PKGNAME}}.jl/commits/master", + ), + ) + end + + new( + coverage ? ["*.jl.cov", "*.jl.*.cov", "*.jl.mem"] : [], + config_file, + ".gitlab-ci.yml", + badges, + Dict("GITLABCOVERAGE" => coverage), + ) + end +end + +function interactive(plugin_type::Type{GitLabCI}) + name = "GitLabCI" + kwargs = Dict{Symbol, Any}() + + default_config_file = joinpath(DEFAULTS_DIR, "gitlab-ci.yml") + print("$name: Enter the config template filename (\"None\" for no file) ") + print("[$default_config_file]: ") + config_file = readline() + kwargs[:config_file] = if uppercase(config_file) == "NONE" + nothing + elseif isempty(config_file) + default_config_file + else + config_file + end + + print("$name: Enable test coverage analysis? [yes]: ") + coverage = readline() + kwargs[:coverage] = if isempty(coverage) + true + else + !in(uppercase(user_image), ["N", "NO", "FALSE", "NONE"]) + end + + return GitLabCI(; kwargs...) +end