BuildInfoPlugin.groovy
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2018-2019 Andres Almiray.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     http://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.kordamp.gradle.plugin.buildinfo
019 
020 import groovy.transform.CompileStatic
021 import net.nemerosa.versioning.VersioningExtension
022 import net.nemerosa.versioning.VersioningPlugin
023 import org.gradle.api.Project
024 import org.kordamp.gradle.plugin.AbstractKordampPlugin
025 import org.kordamp.gradle.plugin.base.BasePlugin
026 import org.kordamp.gradle.plugin.base.ProjectConfigurationExtension
027 
028 import java.text.SimpleDateFormat
029 
030 import static org.kordamp.gradle.PluginUtils.resolveEffectiveConfig
031 import static org.kordamp.gradle.plugin.base.BasePlugin.isRootProject
032 
033 /**
034  * Calculates build properties and attaches them to the root {@code Project}.
035  * The following properties are exposed when this plugin is applied:
036  <ul>
037  *     <li>buildTimeAndDate: a {@code java.util.Date} instance.</li>
038  *     <li>buildDate: the value of {@code buildTimeAndDate} formatted with "yyyy-MM-dd".</li>
039  *     <li>buildTime: the value of {@code buildTimeAndDate} formatted with "HH:mm:ss.SSSZ".</li>
040  *     <li>buildBy: the value of the "user.name" System property.</li>
041  *     <li>buildRevision: the value of the latest commit hash.</li>
042  *     <li>buildJdk: concatenation of the following System properties [java.version, java.vendor, java.vm.version].</li>
043  *     <li>buildCreatedBy: the Gradle version used in the build.</li>
044  </ul>
045  @author Andres Almiray
046  @since 0.1.0
047  */
048 @CompileStatic
049 class BuildInfoPlugin extends AbstractKordampPlugin {
050     Project project
051 
052     void apply(Project project) {
053         this.project = project
054 
055         if (isRootProject(project)) {
056             configureProject(project)
057         }
058     }
059 
060     private void configureProject(Project project) {
061         if (hasBeenVisited(project)) {
062             return
063         }
064         setVisited(project, true)
065 
066         BasePlugin.applyIfMissing(project)
067 
068         project.afterEvaluate {
069             configureBuildProperties(project)
070         }
071     }
072 
073     private void configureBuildProperties(Project project) {
074         ProjectConfigurationExtension effectiveConfig = resolveEffectiveConfig(project)
075         setEnabled(effectiveConfig.buildInfo.enabled)
076 
077         if (!enabled) {
078             return
079         }
080 
081         Date date = new Date()
082         if (effectiveConfig.buildInfo.clearTime) {
083             Calendar calendar = Calendar.instance
084             calendar.time = date
085             calendar.clear(Calendar.HOUR)
086             calendar.clear(Calendar.MINUTE)
087             calendar.clear(Calendar.SECOND)
088             calendar.clear(Calendar.MILLISECOND)
089             calendar.clear(Calendar.ZONE_OFFSET)
090             date = calendar.time
091         }
092 
093         if (!effectiveConfig.buildInfo.skipBuildBy) {
094             effectiveConfig.buildInfo.buildBy = System.properties['user.name']
095         }
096 
097         if (!effectiveConfig.buildInfo.skipBuildDate) {
098             effectiveConfig.buildInfo.buildDate = new SimpleDateFormat('yyyy-MM-dd').format(date)
099         }
100 
101         if (!effectiveConfig.buildInfo.skipBuildTime) {
102             effectiveConfig.buildInfo.buildTime = new SimpleDateFormat('HH:mm:ss.SSSZ').format(date)
103         }
104 
105         if (!effectiveConfig.buildInfo.skipBuildRevision) {
106             project.plugins.apply(VersioningPlugin)
107             VersioningExtension versioning = project.extensions.findByType(VersioningExtension)
108             effectiveConfig.buildInfo.buildRevision = versioning.info.commit
109         }
110 
111         if (!effectiveConfig.buildInfo.skipBuildJdk) {
112             effectiveConfig.buildInfo.buildJdk = "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})".toString()
113         }
114 
115         if (!effectiveConfig.buildInfo.skipBuildCreatedBy) {
116             effectiveConfig.buildInfo.buildCreatedBy = "Gradle ${project.gradle.gradleVersion}"
117         }
118     }
119 
120     static void applyIfMissing(Project project) {
121         if (!project.plugins.findPlugin(BuildInfoPlugin)) {
122             project.plugins.apply(BuildInfoPlugin)
123         }
124     }
125 }