library 'first-class-pipeline'

executeFreeleapsPipeline {
  // serviceName is the name of the service, which is used to identify the service
  serviceName = 'gitops-mvp-app'
  // serviceSlug used to identify the service environment
  environmentSlug = 'alpha'
  // serviceGitBranch used to specify the git repo branch of the service codes
  serviceGitBranch = 'master'
  // serviceGitRepo used to specify the git repo of the service codes
  serviceGitRepo = "https://zhenyus@dev.azure.com/zhenyus/gitops-mvp-app/_git/gitops-mvp-app"
  // serviceGitRepoType used to specify the git repo type of the service codes
  // monorepo: all services codes are in the same repo and using sub-folders to separate them
  // separated: each service has its own repo
  serviceGitRepoType = 'monorepo' // monorepo, separated
  // serviceGitCredentialsId used to specify the git credentials id of the service codes
  // the credentials should be stored in Jenkins
  serviceGitCredentialsId = 'gitops-mvp-app-azure-devops'
  // executeMode used to specify the pipeline execution mode
  // on-demand: the pipeline will be triggered with code changes, only changed components will be executed
  // fully: the pipeline will be triggered without code changes, all components will be executed
  executeMode = 'fully' // on-demand, fully
  // commitMessageLintEnabled used to specify whether to enable commit message lint
  commitMessageLintEnabled = true
  // components used to specify the service components
  components = [
    [
      // name is the name of the component, which is used to identify the component
      name: 'frontend',
      // root is the root folder of the component codes
      root: 'frontend',
      // language is the programming language of the component codes
      language: 'javascript',
      // dependenciesManager used to specify which dependencies manager to use
      dependenciesManager: 'npm',
      // npmPackageJsonFile used to specify the npm package.json file path when dependenciesManager set to npm
      npmPackageJsonFile: 'package.json',
      // buildCacheEnabled used to specify whether to enable build dependencies cache
      buildCacheEnabled: true,
      // buildAgentImage used to specify the build environment container image
      buildAgentImage: 'node:lts',
      // buildCommand used to specify the build command of the component
      buildCommand: 'npm run build',
      // buildArtifacts used to specify the build artifacts that needs to be stores and shares between components
      buildArtifacts: ['dist'],
      // lintEnabled used to specify whether to enable code lint
      lintEnabled: false,
      // linter used to specify the code linter
      linter: 'eslint',
      // eslintVersion used to specify the eslint version
      eslintVersion: '7.32.0',
      // eslintPlugins used to specify the eslint plugins
      eslintPlugins: ['eslint-plugin-vue@8.0.3', '@typescript-eslint/parser@4.33.0', '@typescript-eslint/eslint-plugin@4.33.0'],
      // linterConfig used to specify the code linter configuration file path, if not set, will use the default configuration
      // linterConfig: '.eslintrc.js',
      // sastEnabled used to specify whether to enable SAST scan
      sastEnabled: false,
      // sastScanner used to specify the SAST scanner
      // FIXME: JS has no production-ready SAST scanner yet
      // sastScanner: '',
      // imageRegistry used to specify the which registry to push the image
      imageRegistry: 'docker.io',
      // imageRepository used to specify the image repository
      imageRepository: 'sunzhenyucn',
      // imageName used to specify the image name
      imageName: 'demo-frontend',
      // imageBuilder used to specify the image builder
      // dind: using docker-in-docker to build the image
      // kaniko: using Kaniko to build the image
      imageBuilder: 'dind',
      // dockerfilePath used to specify the Dockerfile path
      dockerfilePath: 'Dockerfile',
      // imageBuildRoot used to specify the image build context root
      imageBuildRoot: '.',
      // imageReleaseArchitectures used to specify the released image architectures
      imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'],
      // registryCredentialsId used to specify the registry credential that stored in Jenkins
      registryCredentialsId: 'gitops-mvp-app-dockerhub-secret',
      // semanticReleaseEnabled used to specify whether to enable semantic release
      semanticReleaseEnabled: true
    ],
    [
      // name is the name of the component, which is used to identify the component
      name: 'backend',
      // root is the root folder of the component codes
      root: 'backend',
      // language is the programming language of the component codes
      language: 'python',
      // dependenciesManager used to specify which dependencies manager to use
      dependenciesManager: 'pip',
      // buildAgentImage used to specify the build environment container image
      buildAgentImage: 'python:3.8-slim-buster',
      // buildArtifacts used to specify the build artifacts that needs to be stores and shares between components
      buildArtifacts: ['.'],
      // buildCacheEnabled used to specify whether to enable build dependencies cache
      buildCacheEnabled: true,
      // buildCommand used to specify the build command of the component
      lintEnabled: false,
      // linter used to specify the code linter
      linter: 'pylint',
      // linterConfig used to specify the code linter configuration file path, if not set, will use the default configuration
      // linterConfig: '.pylintrc',
      // sastEnabled used to specify whether to enable SAST scan
      sastEnabled: false,
      // sastScanner used to specify the SAST scanner
      // FIXME: Python has no production-ready SAST scanner yet
      sastScanner: 'bandit',
      // imageRegistry used to specify the which registry to push the image
      imageRegistry: 'docker.io',
      // imageRepository used to specify the image repository
      imageRepository: 'sunzhenyucn',
      // imageName used to specify the image name
      imageName: 'demo-backend',
      // imageBuilder used to specify the image builder
      // dind: using docker-in-docker to build the image
      // kaniko: using Kaniko to build the image
      imageBuilder: 'dind',
      // dockerfilePath used to specify the Dockerfile path
      dockerfilePath: 'Dockerfile',
      // imageBuildRoot used to specify the image build context root
      imageBuildRoot: '.',
      // imageReleaseArchitectures used to specify the released image architectures
      imageReleaseArchitectures: ['linux/amd64', 'linux/arm64/v8'],
      // registryCredentialsId used to specify the registry credential that stored in Jenkins
      registryCredentialsId: 'gitops-mvp-app-dockerhub-secret',
      // semanticReleaseEnabled used to specify whether to enable semantic release
      semanticReleaseEnabled: true
    ]
  ]
}
