diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..82fe176 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,40 @@ +pipeline { + agent any + + stages { + stage('Build') { + steps { + sh 'make' + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + //该sh步骤调用该make命令,只有在命令返回零退出代码时才会继续。任何非零退出代码将失败Pipeline。 + //archiveArtifacts捕获与include pattern(**/target/*.jar)匹配的文件,并将它们保存到Jenkins主文件以供以后检索。 + //存档工件不能替代使用诸如Artifactory或Nexus之类的外部工件存储库,只能用于基本报告和文件归档。 + } + } + stage('Test') { + steps { + /* `make check` returns non-zero on test failures, + * using `true` to allow the Pipeline to continue nonetheless + */ + sh 'make check || true' + junit '**/target/*.xml' + //运行自动化测试是任何成功的连续传送过程的重要组成部分。因此,Jenkins有许多插件提供的测试记录,报告和可视化设备 。在基本层面上,当有测试失败时,让Jenkins在Web UI中记录报告和可视化的故障是有用的。 + //下面的示例使用junit由JUnit插件提供的步骤。 + //在下面的示例中,如果测试失败,则Pipeline被标记为“不稳定”,如Web UI中的黄色球。根据记录的测试报告,Jenkins还可以提供历史趋势分析和可视化。 + } + } + stage('Deploy') { + when { + expression { + currentBuild.result == null || currentBuild.result == 'SUCCESS' + //访问该currentBuild.result变量允许Pipeline确定是否有任何测试失败。在这种情况下,值将是 UNSTABLE。 + } + } + steps { + sh 'make publish' + } + } + //部署可能意味着各种步骤,具体取决于项目或组织的要求,并且可能是从构建的工件发送到Artifactory服务器,将代码推送到生产系统的任何步骤。 + //在Pipeline示例的这个阶段,“构建”和“测试”阶段都已成功执行。实际上,“部署”阶段只能在上一阶段成功完成,否则Pipeline将早退。 + } +} \ No newline at end of file diff --git a/testT/ex_test.go b/testT/ex_test.go new file mode 100644 index 0000000..9ce9e61 --- /dev/null +++ b/testT/ex_test.go @@ -0,0 +1,77 @@ +package testT + +import ( + "flag" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + log "github.com/sirupsen/logrus" + "net/http" + "sreExporter/collector" + "strings" +) + +var ( + metricsPath string = "https://github.com/strive-after/demo-exporter" + version string = "v1.0" + listenAddress string + help bool + disable string //命令行传入的需要关闭的指标 + disables []string //处理命令行传入的根据,分割为一个切片做处理 +) + +func init() { + flag.StringVar(&listenAddress, "addr", ":9100", "addr") + flag.BoolVar(&help, "h", false, "help") + flag.StringVar(&disable, "disable", "", "关闭的指标收集器") +} + +// main函数作为总入口 提供web url /metrices以及访问/的时候提供一些基本介绍 +func main() { + flag.Parse() + if help { + flag.Usage() + return + } + disables = strings.Split(disable, ",") + //手动开关 + //通过用户输入的我们做关闭 + for scraper, _ := range collector.Scrapers { + for _, v := range disables { + if v == scraper.Name() { + collector.Scrapers[scraper] = false + break + } + } + } + + //访问/的时候返回一些基础提示 + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(` + ` + collector.Name() + ` + +

` + collector.Name() + `

+

Metrics

+

Build

+
` + version + `
+ + `)) + }) + //根据开关来判断指标的是否需要收集 这里只有代码里面的判断 用户手动开关还未做 + enabledScrapers := []collector.Scraper{} + for scraper, enabled := range collector.Scrapers { + if enabled { + log.Info("Scraper enabled ", scraper.Name()) + enabledScrapers = append(enabledScrapers, scraper) + } + } + + //注册自身采集器 + exporter := collector.New(collector.NewMetrics(), enabledScrapers) + prometheus.MustRegister(exporter) + + http.Handle("/metrics", promhttp.Handler()) + //监听端口 + if err := http.ListenAndServe(listenAddress, nil); err != nil { + log.Printf("Error occur when start server %v", err) + } +}