Skip to content

Commit

Permalink
add import script to importer to get tf state (#1)
Browse files Browse the repository at this point in the history
* add import script to importer to get tf state

* fix discarder property strategy test error msg

* update readme terraform to match expected
  • Loading branch information
jgramoll committed Aug 6, 2019
1 parent e9d0d95 commit 10fa096
Show file tree
Hide file tree
Showing 65 changed files with 726 additions and 236 deletions.
70 changes: 42 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ $jenkins_url/user/$username/configure

### Importer ###

go run ./importer -job="Name of your Job"
go run ./importer --job "Name of your Job" --output my_tf_dir

1. Ensures each resource has a valid id
1. Outputs terraform code to match the job
Expand All @@ -42,34 +42,41 @@ provider "jenkins" {
}
resource "jenkins_job" "main" {
name = "Premerge checks"
name = "Premerge checks"
plugin = "workflow-job@2.33"
disabled = false
}
resource "jenkins_job_declarative_job_action" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
plugin = "pipeline-model-definition@1.3.9"
}
resource "jenkins_job_declarative_job_property_tracker_action" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
plugin = "pipeline-model-definition@1.3.9"
}
resource "jenkins_job_git_scm" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
plugin = "workflow-cps@2.70"
git_plugin = "git@3.10.0"
config_version = "2"
script_path = "Jenkinsfile.api"
lightweight = false
}
resource "jenkins_job_git_scm_user_remote_config" "main" {
resource "jenkins_job_git_scm_user_remote_config" "config_1" {
scm = "${jenkins_job_git_scm.main.id}"
refspec = "GERRIT_REFSPEC"
refspec = "$${GERRIT_REFSPEC}"
url = "ssh://git.server/git-repo.git"
credentials_id = "123-abc"
}
resource "jenkins_job_git_scm_branch" "main" {
resource "jenkins_job_git_scm_branch" "branch_1" {
scm = "${jenkins_job_git_scm.main.id}"
name = "FETCH_HEAD"
Expand All @@ -79,26 +86,14 @@ resource "jenkins_job_git_scm_clean_before_checkout_extension" "main" {
scm = "${jenkins_job_git_scm.main.id}"
}
resource "jenkins_job_build_discarder_property" "main" {
job = "${jenkins_job.main.id}"
}
resource "jenkins_job_build_discarder_property_log_rotator_strategy" "main" {
property = "${jenkins_job_build_discarder_property.main.id}"
days_to_keep = "30"
num_to_keep = "-1"
artifact_days_to_keep = "-1"
artifact_num_to_keep = "-1"
}
resource "jenkins_job_pipeline_triggers_property" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
}
resource "jenkins_job_gerrit_trigger" "main" {
property = "${jenkins_job_pipeline_triggers_property.main.id}"
plugin = "gerrit-trigger@2.29.0"
server_name = "__ANY__"
silent_mode = false
silent_start_mode = false
Expand All @@ -108,6 +103,7 @@ resource "jenkins_job_gerrit_trigger" "main" {
commit_message_parameter_mode = "BASE64"
change_subject_parameter_mode = "PLAIN"
comment_text_parameter_mode = "BASE64"
dynamic_trigger_configuration = false
skip_vote = {
on_successful = false
Expand All @@ -131,31 +127,49 @@ resource "jenkins_job_gerrit_trigger_draft_published_event" "main" {
trigger = "${jenkins_job_gerrit_trigger.main.id}"
}
resource "jenkins_job_gerrit_project" "main" {
resource "jenkins_job_gerrit_project" "project_1" {
trigger = "${jenkins_job_gerrit_trigger.main.id}"
compare_type = "PLAIN"
pattern = "bridge-skills"
}
resource "jenkins_job_gerrit_branch" "main" {
project = "${jenkins_job_gerrit_project.main.id}"
resource "jenkins_job_gerrit_branch" "branch_1" {
project = "${jenkins_job_gerrit_project.project_1.id}"
compare_type = "REG_EXP"
pattern = "^(?!refs/meta/config).*$"
}
resource "jenkins_job_datadog_job_property" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
}
resource "jenkins_job_build_discarder_property" "main" {
job = "${jenkins_job.main.name}"
}
resource "jenkins_job_build_discarder_property_log_rotator_strategy" "main" {
property = "${jenkins_job_build_discarder_property.main.id}"
days_to_keep = "30"
num_to_keep = "-1"
artifact_days_to_keep = "-1"
artifact_num_to_keep = "-1"
}
resource "jenkins_job_datadog_job_property" "main" {
job = "${jenkins_job.main.name}"
}
resource "jenkins_job_jira_project_property" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
plugin = "jiraPlugin"
}
```

## TODO

1. importer project
1. Fragile TestAccJobBuildDiscarderPropertyStrategyLogRotatorBasic test
19 changes: 1 addition & 18 deletions importer/generate_terraform_code_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,11 @@ func NewGenerateTerraformCodeService(jobService *client.JobService) *GenerateTer
}

func (s *GenerateTerraformCodeService) GenerateCode(job *client.Job, outputDir string) error {
if err := ensureOutputDir(outputDir); err != nil {
return err
}

if err := s.generateProviderCode(outputDir); err != nil {
return err
}

if err := s.generatePipelineCode(outputDir, job); err != nil {
return err
}

return nil
return s.generatePipelineCode(outputDir, job)
}

func (s *GenerateTerraformCodeService) generateProviderCode(outputDir string) error {
Expand All @@ -54,12 +46,3 @@ func (s *GenerateTerraformCodeService) generatePipelineCode(outputDir string, jo
_, err = tfCodeFile.Write([]byte(jobCode(job)))
return err
}

func ensureOutputDir(outputDir string) error {
if err := os.Mkdir(outputDir, os.ModePerm); err != nil {
if os.IsNotExist(err) {
return err
}
}
return nil
}
34 changes: 34 additions & 0 deletions importer/generate_terraform_import_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package main

import (
"fmt"
"os"

"github.com/jgramoll/terraform-provider-jenkins/client"
)

type GenerateTerraformImportService struct {
jobService *client.JobService
}

func NewGenerateTerraformImportService(jobService *client.JobService) *GenerateTerraformImportService {
return &GenerateTerraformImportService{
jobService: jobService,
}
}

func (s *GenerateTerraformImportService) GenerateScript(job *client.Job, outputDir string) error {
scriptFilePath := fmt.Sprintf("%s/import.sh", outputDir)
scriptFile, err := os.Create(scriptFilePath)
if err != nil {
return err
}
defer scriptFile.Close()

if err := os.Chmod(scriptFilePath, 0777); err != nil {
return err
}

_, err = scriptFile.Write([]byte(jobImportScript(job)))
return err
}
16 changes: 15 additions & 1 deletion importer/job_import_service.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"os"

"github.com/jgramoll/terraform-provider-jenkins/client"
)

Expand All @@ -25,9 +27,21 @@ func (s *JobImportService) Import(jobName string, skipEnsure bool, outputDir str
}
}

if err := ensureOutputDir(outputDir); err != nil {
return err
}

if err := NewGenerateTerraformCodeService(s.jobService).GenerateCode(job, outputDir); err != nil {
return err
}
// GenerateTerraformImportScriptService(s.jobService).Generate(job)
return NewGenerateTerraformImportService(s.jobService).GenerateScript(job, outputDir)
}

func ensureOutputDir(outputDir string) error {
if err := os.Mkdir(outputDir, os.ModePerm); err != nil {
if os.IsNotExist(err) {
return err
}
}
return nil
}
21 changes: 19 additions & 2 deletions importer/resource_cps_scm_flow_definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import (
"fmt"

"github.com/jgramoll/terraform-provider-jenkins/client"
"github.com/jgramoll/terraform-provider-jenkins/provider"
)

func init() {
ensureDefinitionFuncs["*client.CpsScmFlowDefinition"] = ensureCpsScmFlowDefinition
definitionCodeFuncs["*client.CpsScmFlowDefinition"] = cpsScmFlowDefinitionCode
definitionImportScriptFuncs["*client.CpsScmFlowDefinition"] = cpsScmFlowDefinitionImportScript
}

func ensureCpsScmFlowDefinition(definitionInterface client.JobDefinition) error {
Expand All @@ -29,14 +31,29 @@ func cpsScmFlowDefinitionCode(definitionInterface client.JobDefinition) string {
definition := definitionInterface.(*client.CpsScmFlowDefinition)
return fmt.Sprintf(`
resource "jenkins_job_git_scm" "main" {
job = "${jenkins_job.main.id}"
job = "${jenkins_job.main.name}"
plugin = "%v"
git_plugin = "%v"
config_version = "%v"
script_path = "%v"
lightweight = %v
}
`, definition.SCM.ConfigVersion, definition.ScriptPath, definition.Lightweight) +
`, definition.Plugin, definition.SCM.Plugin, definition.SCM.ConfigVersion, definition.ScriptPath, definition.Lightweight) +
jobGitScmUserRemoteConfigsCode(definition.SCM.UserRemoteConfigs) +
jobGitScmBranchesCode(definition.SCM.Branches) +
jobGitScmExtensionsCode(definition.SCM.Extensions)
}

func cpsScmFlowDefinitionImportScript(
jobName string, definitionInterface client.JobDefinition,
) string {
definition := definitionInterface.(*client.CpsScmFlowDefinition)
return fmt.Sprintf(`
terraform import jenkins_job_git_scm.main "%v"
`, provider.ResourceJobDefinitionId(jobName, definition.Id)) +
jobGitScmUserRemoteConfigsImportScript(jobName, definition.Id, definition.SCM.UserRemoteConfigs) +
jobGitScmBranchesImportScript(jobName, definition.Id, definition.SCM.Branches) +
jobGitScmExtensionsImportScript(jobName, definition.Id, definition.SCM.Extensions)
}
11 changes: 11 additions & 0 deletions importer/resource_git_scm_branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/google/uuid"
"github.com/jgramoll/terraform-provider-jenkins/client"
"github.com/jgramoll/terraform-provider-jenkins/provider"
)

func ensureGitScmBranches(branches *client.GitScmBranches) error {
Expand Down Expand Up @@ -36,3 +37,13 @@ resource "jenkins_job_git_scm_branch" "branch_%v" {
}
return code
}

func jobGitScmBranchesImportScript(jobName string, definitionId string, branches *client.GitScmBranches) string {
code := ""
for i, item := range *branches.Items {
code += fmt.Sprintf(`
terraform import jenkins_job_git_scm_branch.branch_%v "%v"
`, i+1, provider.ResourceJobGitScmBranchId(jobName, definitionId, item.Id))
}
return code
}
10 changes: 10 additions & 0 deletions importer/resource_git_scm_clean_before_checkout_extension.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package main

import (
"fmt"

"github.com/jgramoll/terraform-provider-jenkins/client"
"github.com/jgramoll/terraform-provider-jenkins/provider"
)

func init() {
jobGitScmExtensionCodeFuncs["*client.GitScmCleanBeforeCheckoutExtension"] = jobGitScmCleanBeforeCheckoutExtensionCode
jobGitScmExtensionImportScriptFuncs["*client.GitScmCleanBeforeCheckoutExtension"] = jobGitScmCleanBeforeCheckoutExtensionImportScript
}

func jobGitScmCleanBeforeCheckoutExtensionCode(client.GitScmExtension) string {
Expand All @@ -15,3 +19,9 @@ resource "jenkins_job_git_scm_clean_before_checkout_extension" "main" {
}
`
}

func jobGitScmCleanBeforeCheckoutExtensionImportScript(jobName string, definitionId string, extension client.GitScmExtension) string {
return fmt.Sprintf(`
terraform import jenkins_job_git_scm_clean_before_checkout_extension.main "%v"
`, provider.ResourceJobGitScmExtensionId(jobName, definitionId, extension.GetId()))
}
15 changes: 15 additions & 0 deletions importer/resource_git_scm_extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ import (
)

type jobGitScmExtensionCodeFunc func(client.GitScmExtension) string
type jobGitScmExtensionImportScriptFunc func(string, string, client.GitScmExtension) string

var jobGitScmExtensionCodeFuncs = map[string]jobGitScmExtensionCodeFunc{}
var jobGitScmExtensionImportScriptFuncs = map[string]jobGitScmExtensionImportScriptFunc{}

func ensureGitScmExtensions(extensions *client.GitScmExtensions) error {
if extensions == nil || extensions.Items == nil {
Expand Down Expand Up @@ -40,3 +42,16 @@ func jobGitScmExtensionsCode(extensions *client.GitScmExtensions) string {
}
return code
}

func jobGitScmExtensionsImportScript(jobName string, definitionId string, extensions *client.GitScmExtensions) string {
code := ""
for _, item := range *extensions.Items {
reflectType := reflect.TypeOf(item).String()
if codeFunc, ok := jobGitScmExtensionImportScriptFuncs[reflectType]; ok {
code += codeFunc(jobName, definitionId, item)
} else {
log.Println("[WARNING] Unknown action type:", reflectType)
}
}
return code
}
Loading

0 comments on commit 10fa096

Please sign in to comment.