From cc269ae804038b69c1fdda2e7ec3daba33be34dd Mon Sep 17 00:00:00 2001 From: Ethan Dennis Date: Thu, 3 Nov 2022 12:47:40 -0700 Subject: [PATCH] Rebrand labs --- azure_devops/2-audit.md | 36 ++--- azure_devops/4-dry-run.md | 12 +- azure_devops/5-custom-transformers.md | 24 ++-- azure_devops/6-migrate.md | 6 +- azure_devops/bootstrap/azure_devops.tgz | Bin 9669 -> 20016 bytes azure_devops/bootstrap/setup | 2 +- azure_devops/readme.md | 32 ++--- circle_ci/1-configure.md | 14 +- circle_ci/2-audit.md | 95 +++++++------- circle_ci/3-forecast.md | 4 +- circle_ci/4-dry-run.md | 16 +-- circle_ci/5-custom-transformers.md | 10 +- circle_ci/6-migrate.md | 4 +- circle_ci/readme.md | 32 ++--- gitlab/1-configure.md | 12 +- gitlab/2-audit.md | 94 ++++++------- gitlab/3-forecast.md | 4 +- gitlab/4-dry-run.md | 24 ++-- gitlab/5-custom-transformers.md | 20 +-- gitlab/6-migrate.md | 6 +- gitlab/readme.md | 36 ++--- jenkins/1-configure.md | 12 +- jenkins/2-audit.md | 20 +-- jenkins/3-forecast.md | 2 +- jenkins/4-dry-run.md | 8 +- jenkins/5-custom-transformers.md | 12 +- jenkins/6-migrate.md | 4 +- .../test_freestyle_project/config.xml | 2 +- jenkins/bootstrap/setup.sh | 2 +- jenkins/readme.md | 38 +++--- travis/1-configure.md | 14 +- travis/2-audit.md | 123 +++++++++--------- travis/3-forecast.md | 4 +- travis/4-dry-run.md | 24 ++-- travis/5-custom-transformers.md | 12 +- travis/6-migrate.md | 4 +- travis/readme.md | 32 ++--- 37 files changed, 401 insertions(+), 395 deletions(-) diff --git a/azure_devops/2-audit.md b/azure_devops/2-audit.md index c50a76a..c2fc303 100644 --- a/azure_devops/2-audit.md +++ b/azure_devops/2-audit.md @@ -150,23 +150,23 @@ The final section of the audit report provides a manifest of all of the files th ```md ### Successful -#### valet-bootstrap/pipelines/valet-pipeline2 +#### actions-importer-bootstrap/pipelines/pipeline2 -- [pipelines/valet-bootstrap/pipelines/valet-pipeline2/.github/workflows/valet-pipeline2.yml](pipelines/valet-bootstrap/pipelines/valet-pipeline2/.github/workflows/valet-pipeline2.yml) -- [pipelines/valet-bootstrap/pipelines/valet-pipeline2/config.json](pipelines/valet-bootstrap/pipelines/valet-pipeline2/config.json) -- [pipelines/valet-bootstrap/pipelines/valet-pipeline2/source.yml](pipelines/valet-bootstrap/pipelines/valet-pipeline2/source.yml) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline2/.github/workflows/pipeline2.yml](pipelines/actions-importer-bootstrap/pipelines/pipeline2/.github/workflows/pipeline2.yml) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline2/config.json](pipelines/actions-importer-bootstrap/pipelines/pipeline2/config.json) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline2/source.yml](pipelines/actions-importer-bootstrap/pipelines/pipeline2/source.yml) -#### valet-bootstrap/pipelines/valet-pipeline1 +#### actions-importer-bootstrap/pipelines/pipeline1 -- [pipelines/valet-bootstrap/pipelines/valet-pipeline1/.github/workflows/valet-pipeline1.yml](pipelines/valet-bootstrap/pipelines/valet-pipeline1/.github/workflows/valet-pipeline1.yml) -- [pipelines/valet-bootstrap/pipelines/valet-pipeline1/config.json](pipelines/valet-bootstrap/pipelines/valet-pipeline1/config.json) -- [pipelines/valet-bootstrap/pipelines/valet-pipeline1/source.yml](pipelines/valet-bootstrap/pipelines/valet-pipeline1/source.yml) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline1/.github/workflows/pipeline1.yml](pipelines/actions-importer-bootstrap/pipelines/pipeline1/.github/workflows/pipeline1.yml) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline1/config.json](pipelines/actions-importer-bootstrap/pipelines/pipeline1/config.json) +- [pipelines/actions-importer-bootstrap/pipelines/pipeline1/source.yml](pipelines/actions-importer-bootstrap/pipelines/pipeline1/source.yml) -#### valet-bootstrap/pipelines/valet-custom-transformer-example +#### actions-importer-bootstrap/pipelines/custom-transformer-example -- [pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml](pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml) -- [pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/config.json](pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/config.json) -- [pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/source.yml](pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/source.yml) +- [pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml](pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml) +- [pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/config.json](pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/config.json) +- [pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/source.yml](pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/source.yml) ``` Each pipeline will have a variety of files written that include: @@ -183,17 +183,17 @@ Each pipeline will have a variety of files written that include: ```csv Pipeline,Action,File path - valet-bootstrap/pipelines/valet-pipeline2,actions/checkout@v2,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-pipeline2/.github/workflows/valet-pipeline2.yml - valet-bootstrap/pipelines/valet-pipeline1,actions/checkout@v2,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-pipeline1/.github/workflows/valet-pipeline1.yml - valet-bootstrap/pipelines/valet-custom-transformer-example,actions/checkout@v2,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml - valet-bootstrap/pipelines/valet-custom-transformer-example,actions/setup-node@v2,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml + actions-importer-bootstrap/pipelines/pipeline2,actions/checkout@v2,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/pipeline2/.github/workflows/pipeline2.yml + actions-importer-bootstrap/pipelines/pipeline1,actions/checkout@v2,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/pipeline1/.github/workflows/pipeline1.yml + actions-importer-bootstrap/pipelines/custom-transformer-example,actions/checkout@v2,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml + actions-importer-bootstrap/pipelines/custom-transformer-example,actions/setup-node@v2,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml Pipeline,Secret,File path Pipeline,Runner,File path - valet-bootstrap/pipelines/valet-pipeline2,mechamachine,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-pipeline2/.github/workflows/valet-pipeline2.yml - valet-bootstrap/pipelines/valet-custom-transformer-example,mechamachine,tmp/audit/pipelines/valet-bootstrap/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml + actions-importer-bootstrap/pipelines/pipeline2,mechamachine,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/pipeline2/.github/workflows/pipeline2.yml + actions-importer-bootstrap/pipelines/custom-transformer-example,mechamachine,tmp/audit/pipelines/actions-importer-bootstrap/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml ``` The contents of this file can be useful in answering questions similar to the following: diff --git a/azure_devops/4-dry-run.md b/azure_devops/4-dry-run.md index e206381..87a0b7c 100644 --- a/azure_devops/4-dry-run.md +++ b/azure_devops/4-dry-run.md @@ -15,11 +15,11 @@ You will perform a dry run for a pipeline in the bootstrapped Azure DevOps proje 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - - Selecting the pipeline with the name "valet-pipeline1" + - Selecting the pipeline with the name "pipeline1" - Inspecting the URL to locate the pipeline id 2. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -32,8 +32,8 @@ You will perform a dry run for a pipeline in the bootstrapped Azure DevOps proje 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `tmp/dry-run/pipelines/lab-testing/pipelines/valet-pipeline1/.github/workflows` in the file explorer pane in your codespace. - - Click `valet-pipeline1.yml` to open. + - Find `tmp/dry-run/pipelines/lab-testing/pipelines/pipeline1/.github/workflows` in the file explorer pane in your codespace. + - Click `pipeline1.yml` to open. ## Inspect the output files @@ -65,7 +65,7 @@ steps: Converted workflow πŸ‘‡ ```yaml -name: valet-bootstrap/pipelines/valet-pipeline1 +name: actions-importer-bootstrap/pipelines/pipeline1 on: push: branches: @@ -90,4 +90,4 @@ Despite these two pipelines using different syntax they will function equivalent ## Next lab -[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) +[Use custom transformers to customize GitHub Actions Importer's behavior](./5-custom-transformers.md) diff --git a/azure_devops/5-custom-transformers.md b/azure_devops/5-custom-transformers.md index 3ab61de..1525ada 100644 --- a/azure_devops/5-custom-transformers.md +++ b/azure_devops/5-custom-transformers.md @@ -1,6 +1,6 @@ -# Using custom transformers to customize Valet's behavior +# Using custom transformers to customize GitHub Actions Importer's behavior -In this lab we will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab we will build upon the `dry-run` command to override GitHub Actions Importer's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -21,11 +21,11 @@ You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps proje 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - - Selecting the pipeline with the name "valet-custom-transformer-example" + - Selecting the pipeline with the name "custom-transformer-example" - Inspecting the URL to locate the pipeline id 2. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -38,8 +38,8 @@ You will perform a dry-run for a pipeline in the bootstrapped Azure DevOps proje 3. The command will list all the files written to disk when the command succeeds. 4. View the converted workflow: - - Find `tmp/dry-run/pipelines/lab-testing/pipelines/valet-custom-transformer-example/.github/workflows` in the file explorer pane in your codespace. - - Click `valet-custom-transformer-example.yml` to open. + - Find `tmp/dry-run/pipelines/lab-testing/pipelines/custom-transformer-example/.github/workflows` in the file explorer pane in your codespace. + - Click `custom-transformer-example.yml` to open. The converted workflow that is generated can be seen below: @@ -47,7 +47,7 @@ The converted workflow that is generated can be seen below: Converted workflow πŸ‘‡ ```yaml -name: valet-bootstrap/pipelines/valet-custom-transformer-example +name: actions-importer-bootstrap/pipelines/custom-transformer-example on: push: branches: @@ -81,7 +81,7 @@ _Note_: You can refer to the previous [lab](./4-dry-run.md) to learn about the f ## Custom transformers for build steps -You can use custom transformers to override Valet's default behavior. In this scenario, you may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. Answer the following questions before writing a custom transformer: +You can use custom transformers to override GitHub Actions Importer's default behavior. In this scenario, you may want to override the behavior for converting `DotnetCoreCLI@2` tasks to support parameters that are glob patterns. Answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __DotnetCoreCLI@2__ @@ -110,17 +110,17 @@ transform "DotNetCoreCLI@2" do |item| end ``` -The `transform` method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Azure DevOps. +The `transform` method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. GitHub Actions Importer will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Azure DevOps. Now, we can perform a `dry-run` command with the `--custom-transformers` CLI option. The output of the `dry-run` command should look similar to this: ```console $ gh actions-importer dry-run azure-devops pipeline --pipeline-id 6 --output-dir tmp/dry-run --custom-transformers transformers.rb -[2022-09-20 18:39:50] Logs: 'tmp/dry-run/log/valet-20220920-183950.log' +[2022-09-20 18:39:50] Logs: 'tmp/dry-run/log/actions-importer-20220920-183950.log' This is the item: {"command"=>"restore", "projects"=>"$(BuildParameters.RESTOREBUILDPROJECTS)"} This is the item: {"projects"=>"$(BuildParameters.RESTOREBUILDPROJECTS)", "arguments"=>"--configuration $(BUILDCONFIGURATION)"} [2022-09-20 18:39:51] Output file(s): -[2022-09-20 18:39:51] tmp/dry-run/pipelines/lab-testing/pipelines/valet-custom-transformer-example/.github/workflows/valet-custom-transformer-example.yml +[2022-09-20 18:39:51] tmp/dry-run/pipelines/lab-testing/pipelines/custom-transformer-example/.github/workflows/custom-transformer-example.yml ``` In the above command you will see two instances of `item` printed to the console. This is because there are two `DotNetCoreCLI@2` steps in the pipeline. Each item listed above represents each `DotNetCoreCLI@2` step in the order that they are defined in the pipeline. @@ -247,7 +247,7 @@ runner "mechamachine", "ubuntu-latest" -That's it! At this point you have overridden Valet's default behavior by customizing the conversion of: +That's it! At this point you have overridden GitHub Actions Importer's default behavior by customizing the conversion of: - Build steps - Environment variables diff --git a/azure_devops/6-migrate.md b/azure_devops/6-migrate.md index 2ed84f1..34e1e46 100644 --- a/azure_devops/6-migrate.md +++ b/azure_devops/6-migrate.md @@ -15,7 +15,7 @@ Answer the following questions before running a `migrate` command: 1. What is the id of the pipeline to convert? - __:pipeline_id__. This id can be found by: - Navigating to the build pipelines in the bootstrapped Azure DevOps project - - Selecting the pipeline with the name "valet-pipeline2" + - Selecting the pipeline with the name "pipeline2" - Inspecting the URL to locate the pipeline id 2. Where do you want to store the logs? - __tmp/migrate__ @@ -34,7 +34,7 @@ Answer the following questions before running a `migrate` command: ```console $ gh actions-importer migrate azure-devops pipeline --pipeline-id 8 --target-url https://github.com/ethanis/labs --output-dir tmp/migrate - [2022-09-07 20:25:08] Logs: 'tmp/dry-run/log/valet-20220907-202508.log' + [2022-09-07 20:25:08] Logs: 'tmp/dry-run/log/actions-importer-20220907-202508.log' [2022-09-07 20:25:13] Pull request: 'https://github.com/ethanis/labs/pull/42' ``` @@ -56,4 +56,4 @@ At this point, the migration has completed and you have successfully migrated an ### Next lab -This concludes all labs for migrating Azure DevOps pipelines to Actions with Valet! +This concludes all labs for migrating Azure DevOps pipelines to Actions with GitHub Actions Importer! diff --git a/azure_devops/bootstrap/azure_devops.tgz b/azure_devops/bootstrap/azure_devops.tgz index cdc27b2ec83f784e87455d87e8f9355c3f023692..6c470fcd5e459f7f755d5ae07a5d5b3462101a89 100644 GIT binary patch literal 20016 zcmY&;V{~Orv~7$IJL&Mm>e%Yow$rg~+qP}nW_N7cw$1a>-yLtf`~I97d)KKNRki2B zoVD;HU_cVE4GloRFS_7jNrv3;TH$Vfv7_`yfQWH@1Lpy;?I_-iQ3shnA3xV0@q%|Y z&RHI?c2<6rx^PxyDKB?%1`%|GFp_Ma4*PZ*UF#K&Ol+Bh_j8x_(%&SaUW!TV*Kn+7 zbb@I}DLa#AKIX3Yw-cP7!Ml$6SBz&fF{hQ4nJ4LK=>n=CoEus`Djz=HFTj_h93SIb zhY;rv6bOD*W!l$@0Ut>5Fd!MmPs)1gZ~6IDL_b4O^11rUI;K|h1iJ_zc=REI0liNC znjAul=JMGI!!tk+K3ea|Tg%ptDBtfs@^V7rsE(06v|) z_QUi^Z=EhmXYMA|^Yqjp{z0IPfjet$| z?Kx>}C@5O;s#%J<{EOb}6nfchS14s^gwk9tA6Uf<+w4zImv&bkeA;hoPim`9^ILk&+Oao1zf}yD>$I;8i{+B<%7+7C<~?l*n8&d{a?cd^MG!ue352 zv>KXn98@h~I*G4FuUSK?vC`RKC;46QaHzE=SRNHjF{|dwk2f4Nc}Hy)5gmcLDF&Ty zbY*SFk7uOdml4{?0vQ@=A=are*Azn+8zbPZJ5AY0ZAtSNWZ)Z&B+86vZGK#2%W}$) zM2C<7uUTQ;KgN<~tarX-spb%ke9*r$k&>?LM`8}XZZaI!$jUZET6U!yL>htyL>$!5U;z2Aa1VSzF}TwJ~rN$rdy{h z&v3#H*U11o8P7~daYv-U7Wdsm^KUO=qTXgQh^TD=yNpQUZb{d`@(DEr%X>cOy12E%JBOaO5TD zb)5opVXcC|SBn5#>zP#5nQgeJbCw|a7Sh5sFuJrgUqBZmz&`HM0pGBd$(b`qgVtXo z3&vUxuj6`^bz7xQYf(u)Q3(C1GA4_luHB?H)E|(fzldrkkP7io9Q4s#?@$=`(@-Co zWLI#_%eGb<9FU<;F6Fn1yqWAHYZXyG-@vXEJZTN|*DjYxH>)MW zg&bHG%<<}$${V!CWRM_3gODXtFw@f({wV$vF>YIcV*VpQMOoeiV3>0QV)^^z~hLvnb<#*q!m z2({CZVI~N5J5^dU+8?R;Z+@@y-!y>%Gf%cmh^IVVk>1a?F;HMM4%@Z4VjGOFZWhvD z2I$YRVwanTM-}I?0Q{|~f?@qA$_bDR^c#f|?db;#Jr=?g8)1U^A((PRMKI2=Z3e}c7B1dM!k7wL zFOA(2{m$Lk(;|PlB+?vDR+wUZgOO5i5{`(@JiHo43Z0WOKR;TAEQi5%(0O;ALdQLBsB23NPz-A;&HO_d9eEMT zG!*6|xU!;ozL8pz%>e~TD(%<~Zhlieg>0NUuHQ{PD`kKIi4FgzHE{5(K2PFXf^z|p zd`d=8jKAw>O63oNP1$A+-%wO;8$XT)zwbGw{@5PvV9k?)8^jAQBK;gSq2bjGZH9K= zm3NejuT4fLVoyqO`cYfg8D|dAOXC={NZQxeY)50=g!lBBg$%NKBqU5b^|pBe2O{@~ zu(NwcAJKkHQ6ET-$_m9sWqS5@fvwF`OY=2N%lQV~W9e;ypevXI8V#$;K+7o1+;maB zZ2Yj9C?GAd-sZs0GNEYma)GWBu}yj7U>u9zvLU}49I&8hx8)JB zb?TKGH{_KyQ?IJb#oKpShOs}da`w06?K0xYmW7v{aww9M2Fr?Azc@Q`9aazsJ8pf? z$%Rf46QuuBNamU1-|8FO-`Nk->?``$pIl4|R6$dqe?@#{pM_(QK@{?3v%Y&OF9{aM zK8$&YGQ1Eqgkv}U*InV1!j7v)kJg=d zFIiMKL_;r&DjA;Fj`zYgi(lPcwB#^{KhncS{vTEd#e6d=KRX!o2BlQx<}F=W{Q>bk z`aijc*eCg149oExF|S}7hR}c{J~c7du<$=WWFi*LLb2%@WOYkC(}J4cL7vtM|D@_p z2T&yt(dxUHYR9??>ORb0FC&zo5VfL3Srv&YLHu&@AF-S+AR2CCB5f}rds=G2?bK}( z!;XT5VsT)Gwp%=zz_ezr)ekKi=s)&~r#3Agtf!^(LokVB^2c!~z$kn8lhubV4o?4v z9Me}kVL}fMhRw+`Ka6!COhODB?5`53U(r}}L@A|B?S9d{`Yc7la=WuFKUs9!z5ix9 z%q^>B3uDbT$N{URi;{rwBHmF3mXzX3X((2k@wxn5D&71aj8~Jl&R`3Fv2-yUx087i zlB`Y@8^B7CNGG=QS3`CwBs>rc>Bk+Tq~NM(a8ZuhU04?xUS2hxDbypbnB}icKbdW7 zM22@H#{Nsm0N^-smmj7{J+Dy_d8b_(N*&pzb{~f!Lv}=(u0Zt$cL#AtNMsjSHD}T| z=7-g$j(vw6QyLg9sFAM+BW1y*zaLl^MB-RmG`uP1*tPkjdqQHI+4#d{3RzX%VR{#Z zJ+%y*BZDft_h+ONhHxlxgzgWanMd3kSTZ3YeO;p|WRong2uU$8y8K6rdhqCJ)RhF4 zS4(BDNr(9E3{2G-IFS`n5Zdvv;nE6AHBm*h^ze3@00sjb+0bn+eUVIJYj_E~K2XF$ zn0~(S>=Z$%fMu|1$TX3a(@p~6HOV^oP9lA->v&=HBz5=m!q7j>*9N`P3xX60y;AT+ z$B?K536X8r?aQWpSaXKhT6^5K$WX=Mioz=*OXi&ePm^1Vf77 z{EbnGXd+w}WEP+D{zOS^3#a@0KG7Hi0MNpmIo6=oVReK#jgQ|lLs((g3lCcTRgify zkgX|JYa|RN*&`*k5fqr!6;luEzQQ`|p_cqi^vWy+pT%2dO|Hc>x-h>v0Sj6jT`?ts zmOypdBFeb&9HWLm={~4*WV#t-8$|+G)wW;Fc)I{dik#iIx9Gb9-M_y8XFWetJ7Pdv`lTbqWrB05}($h zlf?(0a)HoET_!3~zmgb=O|&Mk4nd!0mD3K&hNiLwD>4bjz%H_d?z$VtRIW4=N|`iq zFxU@8S3$W~oZlKMzS@=;?l7*fvx;Yx(?^0mt<(?}$s`A=V2lHSHm_2l7k(V0AA#-9 ziDW6DDfQ#FmM3Izn7|hyE@MwcuokgRypMDSCfNkuCqlkC)iS;G7vmw$&JTV&PRZwd zqT#KC2z`S$t}Q|~C#_nvCeU0%RwdM9gxoU;!8sa)ZDqN3!UH`Sn5Zy;><_#l&-x@! zf%=QYzn!9b5U{KWM6*uKT~+!>d)U1X`!!t$#rDK4INu#WcYuU{cN97Bk*dg^jmG z-a*I084g#1SCt0lUzbYY>b_16A6cKsJqQHhfZ<)DjDgrcsp1eF-ra?8*``GxR8X^ zZk35#(JA~d5e5crLaH%WR0s4TR=c4}(@6Dv3N|PsVjQa+tr~Fxvf#dB(K_AGp8(km z*J3r@#x;gIKekfA8sl*Lj1dOTm4z;)OoQaacLSV9+#~UGRtDN)1yy^gNC)6FL=s^W z@2|i72Wb0yj8!!<)XkF-<5Z{6I0rUKbyw&eumsrLf^CEXx-3e|jDTtLG6cA*YqBW{Ofm+pVuc1o=8;rO6Q4rPd@+fYyc1?h!m!R_tnhLMX~_a2*OsTckNq+Z+`A&Q z!QsbWQ-&!0VQmKY39j_J2~oLCrgnvc&NAuAml6390_F2Y+$FN(v{; zLStF#Z(@Eh8($HV zV)LKBd60aI-!Mlu=#C6xq?MHb?-*y6gf_seCZcv@i(NCMADs^WOgW6X_Qdc& zvMLQ9H-j`cOX4K}UM<>zp6lF)0vQz=x0@DR-C%Tk<~k-PjJ4_L=MCl5FV$>Olc|5@ zxss)aOl&B@e=L+^`6oE~DJ$+^XPz5-GSUVC0yu>Y(13TtGiUZYH8#0cc6)cSC+de$EC_Drt0$uMevKhdVy zAhR$ImcdD00a1RKh;1ePlRD+9oRZ4ZuOJ`)M(`|5^f7J@gspV3qMJn&*Fvf~_-go0 z1cJ?Vojyr-ESI1`(W~u`ef1x|+(CH`I|=xu79ZVi7AB|8=$ZB9ERm3n!PTM{_fE=5 z7_;W%_=+v}?)yMRg)?F<*hW#0>qOuq#NF~_JuQe53qYrwqtk{+_f3N$^D>AuUcHqd zKuze^EHz114N1=!BMrKy&d$hYO!d_)pXyZ9{Bv&l>xYSfI zFN5WOrT&CTG3}pDRYE?=w#BF?dCt3Lv@oR>=ZT%>6BjTrORq24MhbvY%|H+)j)M#5Mb^otY5YvUiFd^2FcA%hdpeC*@VolN{LRRSif`Y z@i1F}q8a$1S6~z-7DuXKHk@3^l3xGKhju1Rto61|pHFIiGBp`7otkijaF}gP7;fCqO z(~XW=Q+;We$ZO!4MmPcSPK)YMFu|rkHGbx_<}}IJgrUESjR*~F5*dC0`!|22p)xz_oXZ|0?nNH5S+FsmsC27Kj{m;vr zx>XIQPK^#FL_}GrX+%F63|E)!b{!Loz7}!dagv2pt7M-@?Soasyuv8K{Y^2|GAbDpn#M-yckrv{=Boy zGzkYlrB=ysLWW`5Z@5d`gK%hCif815*%=+vZ}8X|bi8fkJzQgVSgpriSC+n3W#oH3H>k$p zf>j~hAb>xe4BIkH3a(gjUuaP2DwVWAU;BByDNS(B;thj$N&3ug(%fLXs;z#D5C+Vi zruDc69VlFm3Y4am5#mlI-}W+QmO)k)o<*`VUx|#Z##15d{|3(nG8^~*$#m6v?_MzH zi2Iz*BUgM6c@z>npB%6L*BFqHF$koQyr*GEb^;@w$Tcm$K4tB^-rJIwn)7%Yns*9w zevLT@ZnuJBtgVx}zFD$iQu@VtJ+TxmQKrh#a;JuI zP7Ba*@Ae+1XJbI+A+_(xp1p2Ln+ByC(K18@Q2M9kK(Qo!;st74oTG}KA>?vudA=!D zm`n*deHTLOw{lwTv%&Vn?Sur1c(e9YMcb+YXP6{gKAu;DKZdA?<36d%X{9fK+M4R` zb2daV-AVV+0&jE`SZ_6w@yty?4?FGwTtW0{fkzuOB+A$@agE+_#T(h-$6x>sU-FU@ zNA5-s{#q?f&5(NU0ku+$_K+Kb{u?$z2+^H+pY__>U!`T|l~QomaE)3kLmWM}I{)uC z-z_uRkfU1tiN*7XXTUkKk&fi^qUg_|?i?Jp(YHBE%lu_LjLGh^9-NM+rkGn1>%*Ct zw5BYk3U+!gCPxs}LheFcmL6FHL;%|+Q{zHc1NS$k2H63N!9!gzYgSh4*0wwt`M0=e?^48^X~023C6r}&V-V>lcUcGW`$1$5wxP+pB;#i z9LCk1injy2uLG4~!t4`PPIGUHm_{+dKiyvGF3LVF_FikG9(?Gk-H&;PqSQdD1MZ<6 zeVhCa#FFq((JH#`4GVpVu~{XR-dED%LHv*g zJ>VZuo!}fBtm|$36$e9P@V~goZIxJ0Xyzc{qR)(2%EuXUFT)YaS^sx zC{P`Q$yMJ)nwk(tcHavXph;!hooS_cAIp6%K1MtsEhQUCSEz3XA&5o$Qt_8{3&!IX z%1G2H3WA_&$8`EsY>AD=?O!H(O(7ARoB0v^l;Ik#5Gk1a+|H3(4qQY1!(Y6DqeaPN zd}w!ZCF;K3#?C*vL}ZI?TOC-hA>SXgq5YyF*sx9I*6kNPctW9Gj_nL4F0s%RpPM_y zZnpMo`nTY@S^{0BFM2|yK6T&eD3?DAbRNn+wj$tUV<+5aIwk2jr@C+`R?fo8Cj>B_ z5L|hF-g{h&z2528LvOfs)ueoI87YxD7H0U*3R^%N+#mn>Qph?G(d@m2CHn(K7cK@tOAUvSKV=*)kH4H!8UF>wY2`t2zpwnk=reS}5!lq?fySjVJ92Y@%wOfuxwEG2cT7FLR zUN?Hu;f9Na?s7wSvg|hKD@=n|b$H)KV}2jh;)wCOXp$$B1! z5l@CLp6hQY6$^MU*0UWj5>q$SFFyEy$coW+Ye@r);$?`LZLL@c{T5O}9? z%;B}#obxg~$J5C@^)@9mK2Ee`n1^BQ+I{z1X{aI@!;iMuWhoO;D0*1@sd4Y|Z)h6( zPpB=;$VFyUv3Vs3I4HqXXEtOd@S?+D4Xu4pgbnPjEb>9Cp(oAtiN`a;eby0X5;nV3 z>^kVF_OWh!mX+@Zr+f9V&0x%~BW=9({**@iJ2n3b7XeA#$v0pEHvtOvo_zVixg=iruLsg=xI3uQ*e8hs~L!@mWHFGQR{bc~eb^R4oY zh-|UnTkT&c+x)g`kjOj$pRP4jw+`2zvtF(zV*T-l6_9Jxge|RJuMB5SBW{h(N^SN8 zP+>$2>p)aE&{y1V@-PeX+&{^a=W{34U~7dx4XM1Y#D7wgR~G4sRBV>}AloCAVwKr$ zRp~J4D}~H_Sc2`c5IBBZyeWn5v4so-?3euE40W1EpzCm6a#$}_fibLZ2^}m5>^Aoe zK-DGfU6`@%dz7$T$92h4D2A)l(8Yz4jE*_|d)G2dCpwXP0x8qVqC_W2kF)7&Us&#E zV?_{Fr%TnPYv4?8xQ8K^vI3?OI(5U}`JnSYuKDA;t;dGOnP`q-A!0L!bPaBQk=R2F zGDq~b6o9OJv$T37x8^?G>gTXu8DL8@jOv^j1@B>v0RL?`K&;db)s#~O-U<2wo3v=WJO7o+-xQE|Wnh%`N z8q*=eJ$0(_y&y%-2_bYHEp#9`noZ)bc#X0F8QDIBw7%l7A75U{PSh0g8;$?p)!aFK zr~b`Vi)_Hi7F?C)i|Ssp?01g)PUl%L3Z*#JcE6jRGVb?s%*L)6IFxq_op4;awrEXa5l9;?mo=eECa!WVy;p25RCIP#~s3^Paao@ zfu(mcw+rvRI4UqMO_71hEW)FS!S_?z4~w@2CVz$#}$jtq3CebewA1ziWa2 zEVfrQDG(>T%s*XEvY{^a*}v7aG`bz_t!~a| z87C4}B02jr*Vv62*Fg{NLAlu$w-YWY&%rWTlM!3tpy@uQmV)!C&A#1DbM<|xSqtXo zLiw=aJ09@v*`}f*HnCKoRl^88Ye=(3Ql^+^3H0MYTciF>Nli4+XkKcyZeQcF9vK%~Ew=3nTz;$${F6oTB0Ew3j2@WFfxvHbL-h@JbXh8_)SJ z9(N#?VWBAx-Fe3h8px zL?u0^LY`d>Bj@j~28*igz`3av*`%HI+fj8c^#*%$J-c6BD|c&svSL!>b>x`_n=Me)=^#3XKdEz-D)Zrq@7v&U@?@#*pp1 zgEqQF3;ymUZDROsYh)<9nex1!C7Ln*;w*U~iT zsh7umc{!GrTw80E0bX<-m1 z5(A-bdlQ3=!8?jf<(B$Czy0+Va?{1ODUdJaHAiHNt%kp|?px#P4eR-yfje~D)oT$H zWt=!TcS6RMbsdoFNV{EgX9P3R3>Hs&zkfgk!sE07HS0*0{xlGvB0i3fdk4LOWi{F5@1>KIA`V4 zouiEK^tqF&b1tmE!r#`&`7nxGRxx)R81cpcjJfQ;1MWJ0e&v-X??A`ToQz4J>=Cd6 zKP_t#h@?F6)x!bg%>w3pJ*A|5{rK_x_we4u+R5QYC`g=-vd1I`v!RX-fORw{D^IbY*N|r|Q(2%Q$#PUZXn8bCT zPga&l<m?>E8Zv?Eal zLrDe*{AxcE_uAV$-80Ow5tK!feSnMqTTSSJEa)KKdV9Jul>p+s zay@TML-hc#U%6L~%#Xv;bb?KHOAx&P-5A_%$7|yrap%PKhhaRa-!Unrgj`dLQlFTlM*P|@{BI0vw+wY1R$I%@48QrGvwycpE?ug$DwamCIew%oM} zbZuPrjqX;6*|faXhP|v7Z(g3~kv4W%9bY`+tC9H(xOaR&D?C%3cJHbCGjHjyGw3!D zm11USOi<%{6D2rEAlCu=9D78Ysjz?r@}t#3KF%mW`2n+c6WMCQ_c^;|?`&Wp(J1+6 zfz%XmIUypjXQ@-&9I(vunNC3YuaJglCnron`aRnJxrP9Cw)8`kS8A`v!+|^H*=N1n z>+EI4nwbx$5^K~1cxi7Kc-n`n;26kw0JdJBZAQ*dM^?#Gv>h`PA~~0J7erK zdTh!Fj~?~If9vhMR)k94k-10Xn(4e@<;``n+W5 zT>#SyA2IsDqz_kDOPZ zf1O*RA1VJ{4g~ffX(TlI;cnN6zy1JrwWeNAK|s6&5%^{qdsOt8XS7^9L%Ch$MgvLa z7tZXVe6(g3PM&S(s$FnDp^vxvmJZ$hc$Xfjr?cT$eUXkV>4c7_cF_3#tcz(P=e!Tm zId*XQ`yjH!^z)He8S%BZhU3j2TsXg7>%Euze99){y`Av7PVMxC@WzsIyidYwgv|Bi z@B=&duE=uam%sn3tUQCXdb6 znYYg={P*L-9G}aQ&n^6pjnDHkpXZk$U`c_`ZA|yw)#p>qM~Kh8$Lfdd=EI%K+tdfI z&r{FKINN8;1d`{aPLIdkITLT}Ch&#V>nI0!gOvTQ3cRQDxz0JSDEW-gd0zDaBIR^1 za@|^74;%R0UF9IvxJ6w7OLANfd|HnHIh^XrJ}PxR*nkF_kxJm^=qOAtFGNJ9tH3lV{B(O(H2W~7Smne+Nanc z+lrd+lgU@hK@6vB3LmuiXeRr)p}>ZA3m75Zc@ky4*>MefDy+r2A-9b3oABWaiW3phRFd!ESB^ND!ashL8Yg#li#-1Bo;FHf zQ`?ow!sqq`zZh0?^VDfi_AG~__BO8`(_<= zI*4Z_fVAu)SIDdGtKqw3{L|Hxu`RL&>eqaS-6(#{BSWX4;|i*E&3Mz*o$-u9-({0o z+0CAfkI^i3zJ6PG=E#lV^j^XZXnuiQdJu?(J4gsBI*q8*BKJt+d+UI|M}gr7UB)+} zbbH2y=yk#5e7)WJe9u{bNPEa}_jLGl*!sZQ%ZTxMtFGzY+Q#d!dkLcR+`GHJ$@v_p z@w)Yc2A+@Qygzshv|N6Ay|eNTYs*zi9UZ&Wv5tDd}WHXQIj0@%8Dz0R`nwLaTy zfO)S&CF40-+MZ8H-7fb(c^`Z4Y`o4wbe=1p4%vXO{i9D?o#w!qzMjVSjh^<0^PiWT zH$^plvhUYtS8hj5I#D1PJ?5Iv@y;ULoqtGxAdW$3j_Q`phJp*eG#1|y-x72>5MOVt z?r$(*a=VZ%+k~Ddq3@+eUd`PQkFj3H=I1ESeTou3tt~Pcnl4l`%o1b0ZLNHJ?%IK5OMh(r6M9v7nl#S9iT2HBEM%l?f|8 z4mR<#hOT+(HmJJ!jHmy~JQN8*2oZcnj#q?6UdPZz?tm6`ePRQ`1z{7mpyBX6^hyyi z-*&|A#bhO73F8sbgA@nz%6+0wbe++C>ARiR4XN8w+;GyQ24Dxh<&WpktDSq?D-qnW zKRzY~+}(L={|x=efW+`w1l3m)NQ*kBa+3P0i@GN^-%Ic-P%sW~-pWRhU}Mv&InUG9=bZJXxqQecU*$CL}^O=v5O z68eOCd>O+)5&TGQx5|CfV%(IGix%{qhW3-bmAsHH{e@ zqfFf7PeS}@uSDzAv7M(flgM)z{H9j1CLH)*kf3W_GSgRe2Vop#FalxxS~tmm>$Zg1 zy*J!$;)l6dn7;eNG1KPp?{L-r9j+7~n=|P2T} zE#Fj-LytF?Gq|;~?nomr!xV&RiXpEgo$dq?j?lxqJe<{6e-~2GU5OYLB4bq${e0=o z&FwE6^y2?Az?NA~C85mj`G8NA&FV}f6pFKm9n$>HByBqUItg{8h^r-xS|&k-WZ1c+ zdcANhaum5MKwhbhz~pFXrcv>3;$~BpA0bd5)A>af^4{(J``=dqmpBsZG?-)_t}6!# ztn3ozhoKGbQv^#XStc_yNbW2^#$N@b^EA!fiwPHztMHp#A3F zf(^?{eS>whL3&m&qv93N4EnSh@~6rcXcSM%7%~_cauXqIC7ga(31A)R^;2Z{FZ5}WCQ)qHuj$&c=Z`fmh z)y*k>uA1k~ECJr1MHMyP+5}=6#qP=3IXU#{k1;R7|An&hL#OoRBqT6+J56K=Ou0pj zF-ak}F^HR8YhN)wYh&Av?zh!UJQ(%EY}NxLG!IK>C7yg;!=ABRI$w4&g?N3=@6W=45VV(iG>TbCf%tAWU%h{**DMs&6^(`1S!q1fE zBiS>p8HgHQ&$>~Vd%=K5_C(j7t z>($#*5w-Sf|=xJw}LYiuE=u|QaDWI<%ix~&vS_U-b^InN8 z(ZaOJMr+QAMj_O$a0|-mqAd*SRXD(*k9hV3iNNk*r$T1`maBgO-t`Oc;To%;4L2oo zGsZ|lQf>JH50FcgC?CG$mY(#e8Gi>G9|jyX^$fzs0vXA1NB3Q!I^|2}g1zI3tmhhTE zYSF?-;_+pag_kgPl8Jj2K>YI6p?Fv~=bWW|ge9a#9{Zq9UJaEE+_!v(j1Elmo-w&#s6N&Ybk}0468J1sXJn@Ym=0*NyFBVP_8vbrbJ1kM-%8a%4 z%Bw&Y?#1B(U)pqs2e{WJx}_|7ayi|)bKW_$+|UWrizBWNr_|}3(|hjt6>3_~JmF!L z!@p49{1xh(?i@lj=WZRuAV)RE?Xn)z8C9JVy^}c(q%OY_&v{i0?XNH~3%dDv$rxd^ z?N|!B32)|g(;@U2x!(i@`JC%{Zj$A>-p=uQ zN$Byed0yP;p#whZth?HG-5mD$P=1bT^gMLab$eVE_*@UFcG_&*6^!vdUGORapA%mi z#v-mh|2##1?hoO)epcChT*Ku&Y`!1rI#@9pSst)`F}Bb)7~x7 zY&3a{IPd}Tj!1l60_m41JHqXHzNmfKSq?h~twUN^!ICrNbmx8{l3~~>+?Kh@yu_6! zo}C+F_0wuE9eeQmzoZ0P^(zNhHFoX`A$Z(i^*#H`%EIfD+1~B$&Z2tAh~{kY1j6kB zc(t0o5XgY|FF-0UsFEwFdW_GSxFSHbfO*3P<}N(4mKh{xGCl;gs1vvq&9ya1%|RFc z!*z{WGn^6KoX}M}Z4F4jY(^)VQ#Ngh(WZBMriAuM;~@21V&mW!MnSv&VHEBl*fol0 zrr5Z?@j>|ZD>NAiv_(YQy_*f(g`&HxGvG}xVa(bMxe`3^*EPz7bP}ZLnlYGp{UK5N z{gnW*C*$Lt-$}qB6$?EKShG->H}#3~*n%Tp^kH3>TsxHQ6fm5=M$1Ni>oj177g}Oc79UQ z1#s=T8=<$%jn8qBY1#JAwOG{CCP328X(xF%>rQrFk8eABDOSiJ1yVERl;5+oVc>pU z#fNQ-yorjRMl47c_$P;{o>26=y7(zZzfsZzu@_MQLH^v27(Kof4F%CB++-gNtO=Qz zopCz1#S`1531YSaU$=}!VUg7xG zB%UjZUB|C$F-IKUL|JVe=9&XItrOiG&)v~voLka&r6|#+4 z)aS_Ht51kTd_oY~T5Y4=sa@i=`#e_*21J|u715|7cuFIrfTkDkWLG!za97^mJ))ip zcJQ;Apa~>&w1PS6Je+7FT|TcW`R)7TuU%hTR<|HBgqCvKznT^_64K8M&CJr_dh$@p z{Cx=VM6?s+5_Deo+lr9i%`s|zJ5aV+1SyDdO}`V5NbK){c(D<%zupJ%pR{VjTc+Lp`G*u zI(iEMjrdji%Ra9LSlEWRq22RZ5Vej2kXP5&;jS`HAfr37&pF*4@2MUW5)2AwvQqeG z!4BIVnwKChUS1NZSCl!-=iVB4)~ouIr9 zvX6{Sa@ts%#1nMZ&VaIoRr~j+b=h;xDONx4--V~Few}eecB{>##JT)9>7fN)%6&1|;RC(z}r2l92YG z1v_|H&~7<Ov%BXM8n=w zh}ngQFNr0ku~&^SOQzp{%QV249$LGhOJw;3CDBQMxYYreGe4J51NOBM;i+d}IAw+6 zSG9wMb+!B{O9ID_sBY04uulXX3xG`T&f%byzc0WQXMzUNmQY(GkX%u})1j9Ge)>u? zbgU_pb)Q2wqJfXjH*@cI_7ySOZn`b_x-(Y}c=d!8#|7(akcEesL6*vEtu6QT)smE%Ef{V;CmBALmInKGs+swD9k# z_ryJz`2KMuZo$aDmT_4u4rjDR2fU$odPCKVY&01KHVc{M-~=w;-=wVrS(w%@t!8AK zKQM~CcMx{ud^)0!EPqu*Z4OVJXP0Cw`!L(Xy%~EW_)y&7u0;dG(hFtxzO>7O-Iy%j z_{}=6cPD=N;(xkkgwLGa6B_Ufdm~8^z-x^C(}K9MiLCB|X&^?ya}POrejzN!Es#_` zHTp}jb*IG&vo}Tld_Nx^XOHnt_tG;C-lLaiw&vdP=(>bsS}yXYMa6O@#G~S2OZo63 zBjd%Y1UW-DZQg;SnMT}pa1iX-b{RL)_V?io)2!Ta5rJGJv~SNv(qjJ0bMpHl8=)an zGzz_8E2kTgmbjj@_iw9Knk#+01Mw3^!c>XNx7RAV$XGBnQ5(8b_$bOEJT;E7Lc&ux zjcodN5l%sJ-?@CyJ}{ma7v`-Wc}WJD%=ikfLb18M_u<~q#%LRXV=kElBr<38I>I+P z((z1>I!X&C?^oHHg~R=%mO~=l@K&hFpV`ew_kEFTF|LSgd1*_;RVN}Vd^cjw_dMNi z?)j}aPq%iuK})YX3HmMELx&=3yT33WJzXZQ{*>gLBp_u6)HH%X&myr~cdYNm|j#y1uxckW5(8nuCF0BFE%pKJ#X5{FAy&RD#!Prd% zLurng{Wg!Wdd6HgCgiNT@ECa{;?`h@lw8;xfbuZ#)quB+LA2Z(FovjWUkFfbE{C>G z4E~c^f-t5b=}@=MI>P8c=l*flh`oQL&#M|wTYtB$bdUF9rFMd@wHm`;lRSr-T3N^N zLSSVKVs*dYT|;v zk9;>WcQ;AlFA@Fzk7xz0QlfN8C3bW~GHU;d5xHr}%W2s8RD?e`jd1#>jP20cn1_tB zo0*4*sq2V+kr*1({@E#TO!Y`?6 z;Q?E17#KLMn66cOHYYPheb&C=hJ)Itp8kT4z6XuYv3bX(;CprOF`>n<9s&00P$}tY z#5qFwx{-fJTgGlh|1AOI$V5%qt{U97NT0 z-Cqq#+pL=f@%k=n>Xq6*6-&qPOWy|H)7Q(s8G($XRT0qE(G;guA#zMhZI&3Cht9wh zbzkiJ$6bZ*zqo6Xwr@hcWSX6%*eR#%>%YUEj7|2IxtmRfjUXLSDoek07z5>e7DLUm@q52?0HfTPdVbZh5)lZWuN=lA87erv7_jG9fXFiIIJ5rAbawS+Xw~g9(L@F+-S~K_+91v6p4YZY*PJ-sf?>*LA*}5AVn4 z%Y8lf|GMx0^7~!SLnTO0oJ@3Yf97{#Lr!+{mCfOlQnjKlJe1By+bya_SGm@SzX;6u zMSJ*X4eqK=zPXg|qz<)l^Hb7h>pLI}_(TBucx?M|(Q0L`b3JE}$Q7=HcO+Ri@McLX zowSC}8%HZ69lIe3DNORpA=@#F%Jk=dV&7uOTML5UfVQ~v5yN6goveD8zhvv#wLWb* zZ!fcMjq3px%fsEx$0*Vb*E3np?I4IVIDaLh zNQD@#h^Ym5F#u&c?v5iSL@w{&+vzBg0lIl8RaCt#E4Wy+I`@I#%f&hL_uI_=*7ff#4&hVK^)OK_ak_Q4E*hGA zU;!T^Za(D@UW#a8B#M0dDw7>y);UT2j~%=m9Hf_LWpf=Pm#qu(UeWp;VQL~pD%TAx zsZ<*YtKIfU(_O`KBlL}RAkB0@xF74N9^esD1m+2U!KU9LA7zPfEa~fcc5g|yT0JH^+Zr~AV%3q?H?6yp2gG|j zZ^tSVPq(O7_T>zL>O`%0kCS)K$tBseihR>;$DkGS8c8K?o#L!~A7umVOU{Nogw_8cJ{o?H(&N(UP#6Cpjt;&gV zvmVWwBHa7W`T;;2IPheZ#h9V(UWQLKQOqb;jN ziH&@fbZsTd@_s>8vL6gfn#0g55-ntmG8FhuSL@-fpyePzpP**X{|eod?wd^ReOYC& z7Slj-8W=heCX34WIDqy3QT#J^ZEea41oZe^5NKcQc=67{@<=3jv5ed(FSd>T3bsW~ z2qn>;LRU>k_lXYw^wF-ohc4(&3SRfkzdAQcj5S0G)+z{E_KW)yu5I#`eBa23Y)ER7 zKEq__MO~ZOO6Y>mi>wdqky1KPz=wBq%_7cF3xIe}-kK&XHh zRC^}i%-}*shh&ho?(6k&A%W_!ee;Z8Q;_|One{{q+PomzuAC^8kObU-3uWL z4B_x4In5>sk*z~BPX+qL@8Pd(XxMIU@lAUTuKmnLAAxn)SCK-I>Xc}%ay@!;b;&(+ zEY5{FdMuPwtNj&jw;v_SD(DS7EAmp($kWB91gSaak3XSg09Y~Z3vPpf4KWf?dqztZ z4jL_Pj3J>1QvVcpA|Yq{O$`q-o(Y!p<=@8i3TCd56}oOzH~mEoEn->XumoY~iK%lIig67HvbQ42J<{4=c!o zu24yA3cSfNa$#vaJ$hHoU;pD+==vn=Nc431c=)*ZxWQHrEcCnbSl!Z2&vf4Irc7CM zWCwd_njFHJh`1cR<_Xp34Aez!$5X?RQR|g9ZzDNh@S8FQY|GB^Uw9X4)D%e!&eCJI zL7RT(hPdtaA23EaEGDU$QS3r-L%i-t8YYB-#JU`3|0#rP;xZJh*L3xw--Fu zgXih-Rq2Srkelg_TvIr!v8Q@A>Af0A*iGxxl|jy)X$T8vPvDHkxB+LB5g%yU_(z`4 zbxpt*oD2g>lSaYFrFNa)HB(_`i5Hh7pmPg?jCxP~WLEy4&Nx%Iq|o;D?T>vcJrWPl?TU^lFICh%JC^yA zQ$OvjO{9vIk)uQVTY5WP{T*1J8^w(Xkiqa#tpM^6(bN7{8S8z+hbC>Kdjr!Iko& zzDrJML|9R9>t?9V^ZLe3PT-hwhy5d(*rIw}dYV3dkfIy73#!8#6CnG|+d3T3z|$hE zmn72xcV7Zrl_0p@DOwnNy10F9_y8O-~oHQ`qt zueKW*39-k3?w_Q5o+@PSG*i~Kj{Vfff0l~8*d{U=LCc!HFl2*!{`StBOVM#6^;#Z270kvguPNjUqD4%0{}qafvk%(KWETGTUYWQi^82{L-&IOJ7#(*tr3t^J zCNWnyGQ#TXOzx~n6T~}HqI==y_<{*+WNI+xA0`)HGBsmV?1FeGB2$PO4tV9ybL8)r zxlpMP;yC1uYG^;{fv6ULiZUrg%vsLx!L}LoJueT%d`rv7^Q5-EsQHVwXmhH?pBKfp z>;#RuE`HfO8oS2wt)w#}`|5i&aM`kEk8o0TA+uK?e|kGUmydF-{i#b8q~Ffyb7l z-IAnrI}dJ@vB(u1#x4G5sYykiG4#;plwltGk&sM-MsmT0!poOfYI1o zW>=Zfmw%phbb3Eqk~E-|9n<>d8GRqO_B);bkN;h4yD-UDzZhx=am}I!4f|~f4sIs5 zFV)a6@sjFM=fabryU3YS{uyzW_CNXP7a_!z z($arb{+BS3|1B|CZGo zM7;y6M<|VH9D25r%C}_<{}BmMc0Wj{&m+nujeAe>8k6{+(>Tq3&@}~fz2bgTWg zaQL6&^1qjb5z?%suyPpm3o@pvkqiL)%T-mxfuN3XIbKzjAWa7sqgIl9uPPnI*hMxN zkMePWS1(_BIvT~3A4Wmm&hsFAIv&3*>y6VNqBspFgKMmd1&)Ks`@yI;U;AP*o?h#x zaT4Gd!qZ=$+$OfX30vu{!Y6_hA9d8Ua=xm3eVA)d6FUV)LWfiZaxIiRE(X31NmZRFTy2r6IsMNeldb zF8~e$?n~lH8^%7cB~yKyg|TP%qtKIy@|o+3W`KPumI0Pj(l&rS>Nf$L1cRZ8XogYu z4k&j#YKU%L1JEVJSM|YfkH+r^o(gi@Cz zwiF4oB~Q4`NEF$OC7~N7iIj=I3g-riEvfL^aVCz}1!u+%m^h%oZqyKGtl^;o<$0WX zt}?(Gs&INhnL|z3Iq!gZPQHk*me}0iGE;W}n>KND#^{QCymsSy%;NgUMl{oaG&$Rv>Fafe|&~WIZEbfd5+6|n;@%3kk^>hq{%5}F0+Yy zKw!c3jKnn*X2S856pWflYXr;%9^M3Fph!66x2c9LsMrO@tktQF7~kA&f+H$XyY);> z>AZ%3P9;;mXNt6TikZ7UE4qC08&<;_y<}{S^Q03?lLHCsrsq&&xS@vBK4>YaYi49Y z6@^9?Q6@<14g_D)(U*|+*uzD-(M?7_CS&JFGlx@Ckcsbb;ktsGf()=Rhj3$_u1HdA zc={nD-RL`^?YbE8x_G`_WH%1#oQcz07Z%W;M+i(yv!JAemE8yRe1o85PEw1$y={z{ zD-#+~-=_V@v!(Q@-6yJV6E_l`9|t~_!77X!y(N^bz!)EO@r>bUQUriX)6j;lAzX(N zMg%j_xUmXDZH!PufHg_1McMZJ?IIi|0VA>R*~<4_TQVNnf^lvqByc%lq0jte1;V`1 zY^JMLW_;Ai_sL=8F%%_?mu0Bo9}wzLC0s#_B(|<1VWFkQ-Vvzcq2(sYy0v-BT382e z=8e|#9bnBiz}iJ)7^X23W{%GsIByd_cS)DKPUGG-)}HSNI1;vyoB-BdU{gTf=B|ub zKMX_HUy*p=^G1!Ew64xB>zG->=mD1poGxj&s}av@D97cVWWtEMp^9E|7vXC`yrheZ zHHcTqRu2&IM$MbFMm7-fP62AvbO}o5+Va?{d_!T^5mdO!NF~dwNa08$_h(5>O?2El zh&!mh)KHG+;TmEh#<7aR_|@WC(W04^bg|Wm z2;5td4|rE#`zllfM!^cA#+d&9S9R&$jeHE}iQ>(yk)V)co&*WCX=BQ5-)0hU< z5b!@od0f>p3)-<37zH8RIJZbwVH^~LcJ++d9h6*%54d1xa~>5Zz~yb8ioCktz5EMqw#fj zh;P8+9PKG7eCfJIu9O@;4r=)(Jf73FCPj4Xh<8}QS(6Dy{MLl;TS1(FN$fB~unAhi zgc4@tAjKLKvy&E+*V?hpDO!{7&D|}#Ryru;tSQDt{MOuWmv-H_A<^{=(z%u|uo~;U zunQ`btEAcDEwuw3s5H(zsYqIDZ*N;Q?*ev{^+o(Os=4TFec`(5If@uA-gyn~0(`J` zQ_su<6FO`~3{9|{q_tUP+XlOf6mPP_h}W8HxOo7(q|09`%OCK%-DHdruid%Q6>*B{&;enNM@%&}wB0b35a1TdY^R5=0?Hln zjRm@{0?M7w+BG#^?QeT{&T`shjS;Ukb94pbrs2&TZZND2d}(=M=#O!tq%zr;SHOl@ zlVW%fSX(jG_{2|p$1a`gfAH}S+esgQaYYVUP?uh z+Y-cf)x!n3(dKg3tk#VnZy>wHfj|f42C`e%kRa_b-^?=#WkVHTt7hh2)0{3?;MeMB zTi(Of!IMTCEibn<3CV5VtG7XRp_lK5-5|Tr$3>J1j}u~^N6LibE7PUApo=YKRNS|n znO*q1Dbz{aHFkE#otbFoFiZ|rW=0o3pgyQruv$yQxEEC6WJ$$px4bZ!++l4@Ew&4D zhj<8Ww6NXwi1zKk3~H7#-s7QbNOWyc&m%^AJaXj7(ngYYu$h)Otevm7?kw#h#+$a{ z-WlT3GzTrOfzC|nxn`<(0UudfF4iFq62V*JMcX>!9Reb>(Xn!8h?|DM@*0dd6y~pQ z4mhAk&68FtvhI7#v&-7u=vQ&qSlPD#I62@T)TJ5LI#i(~EZ?4C#yAEak(A#Q^>3`SvWWM#_(!u0V{CWerMPPXAYE)O+!w14obi1l>l)9%0StVJsiJ1qwaky$Fy2#NkR+G(WiKQBaMOrM zvp;2x)2t)XoZ_yXMct5T6bcGyX8EzE^s$($0cfw z`>Z3}OrKY!j57{(4Ll%4aV3o6*t&*LOWIW{+BsQn3(#uI`3kOzBT5OgflVpsVp7;H z1Jz6=#P9b*KOrGm1$3j=Os&aH=?b(!!xf?SpNw67EK~*`2^m4fO83uwV`qgt|s& zWmK>cqbR2C0Omy-H*Y&f!4IVZTN*$OBQ&L{9Y!*?{V4K<>XU%^tIn$%GivTJ`*yILNuzVD{aE16mNN`0_4J^csoYrDbGVd-hl*kq zzv<-CR-AK^*6!_5TXvJEKuNz3!a0xuFf%$qiA)mPr|?HaQ~}(pz;5u1QL+l_*I*+D zX>3z#-#W{Ji`eSwF3}dOW9a^-I$MnUK1@f$oFhyTq?>Hv(^Wv<l`3uS~59bKs+nFl(2zBMeSRDGGbA#7j`TjW+Lb zRJ9~5^u8Iw1vP7S_Hec343sViH~Prbs(ev=)CpmR8=U2wvb!4LyfALVB}^J+o?sOp zg}ZC+8!Jg-_ZZ=up9k*w&2F*Q$d%%a2OVvC9yoO!&oy+IOf_r|mYpgZ6q43a{PE76N(K9fpu0f7bUKn@Ca*l_Xn=rMH3$sv$ zS)wI1Udur^YRjru7l<3(VeOw{L5REA(>_LuiJ{!i3wwA#9dvEv<@Sru>@4o?ZN)h! zNv!^i!`5-`BDWj;VzPB7M`xU?k0wZi)c)cV4$={z;~MR+E+n?=P~#o-Gm2Ipm9ce+ z-49~0o?~v)I0$VSC%zqriL^sJJvk0t-d`2W@cc&im~72DP|WLgvOn++rA;Y2Z9EM% z7pf>wHSq%!+Xnkvsl zajBHbD0roC7mmblGHmc2o`R%xLFtDKc4OXH``367?3@_;W+P}nu7~lLve;8Koq4UWMW3IDV@A90pa#?a74y`RlA^_p{J$xz8+~G;HDZZacQc~#d~S?08~HwU zVSO?rCtypMfz3QjNHIDcp`u2$C*gwI$Z<9%$zA= zRublSlD-z@GumzRi}5w=+<1_UF+1m+n>gQ|t~9HUpUJ z{dlfq)aXkc1!Q7_uOH4RT6g%^wo&fD$EwjS##XsL@lhv~wZXH=XXdd6*E?i9*QaLb z`??AM=NZdvtfCKDSyUO8vEK6jx-J~u=ob6(t}(X8)7|kDvcmZx9B%3wE0PZw7)lImXcOO9?k)k1anakgHv2$0 za^30fTX&aq5aNvvvX$RB#YY{NYNDe{(nNlH`t&gg0KiIZ1an>mPk}dErE_A|p834( zRa!ryJ=^C7!kP#)W}nU2SIWS zUP;5RbGZ8R#?s;DTd;I5_z92}oVRUNg)#Sivpj5KzCTI*Kqc>5odza*!7sr5)Ps} z2!$Q8#Iu70mhePHl8Tk0yU{^*2Z-xarHGlQo9K=39tE@CEG}Il#|>TGL~o{U@rrF5 z;SOFg)#w$w6NIVnnCza_avl^w5I>TbeMC!Fk-j4~;%2=Kd+}45_YP|*`f(V@z;^oz z6)}(4Q4|r|3*tofeX0amX<;>b#qI`c&+(P1O`S`8{5Gn~l-b_896sqV<74IWURd3u zbMLTr!#)#4P@8imZQ1t%JLIr*doJaaQWB{CDy(Irf9!6sc1`(OpWG=Z@EkSroaB(H zrO%1Cqs;U+?0dgT-`v2G&0ezA+bCJLZIrHdQ}||{6J1y`N4io9VY)suG`*F1?5ZTG zHFmXSr-`dGK#8&wm+CWWfRTfM*a;CrsX(zXS`~_x&AzcUn>D%~asd{TkDvVZjJ=_* z&i?Qm7e9$-ta%gt;d1jN!Mqo`blUs9~Ick{dos;C< zGcA1Y`@K(g*XEbAe_f8_emF$n!~NUtgAf9$g{A+h{4cOh{PvRiDik++ImivJ5P(rN6--RCw z_`^#4iA8Rij>hX>9RE+P3V$mZ52JXpcYZl2|80fiQ5FnFsg=vz$Fw{1}(EL z;w-hU1{ae6C3`l8yYYMlXd%OlEN5@;(@#IOUW~KY3PvBSWH5w(L{V97*70~^rPF@# zE4AJahC}SftQ+h7WjxZ4zaC_Nf@TgwTv#kvNK&jA!c5l`L{@)1&eCiWTranFJsJNP zhZ&M=6{2xAMDfC{*+`Z5)9k}=vBmju3*gB$KK}FB%NKeqQawP{hpS<|r`gY0FL+qyf&BrLXn;Pzmsbb|98PK&g>9IWqf4=UyRaZJh_S|cKlOtbv=w7 zD70xGYvezE@^c=42F5Ah$^W~!-UX9E&y zd{M7e90a(Rm+h^dbG^ME$Nhpp_}78;=W+iBs+)=i>Gd%9@Ip7CZ3--5RS;gnB=6}5V1Zog_VBW;@G=hHj;GmymBz!Qx}62-+XGmuqWByd`XebGEOh#9 z8tXC^9w?|BUX>b*uBTbmi+*nyOIU`^uH*1vp?KNb@i==CXGh~neDuw;KeFa7UxQ%^ zC0cq4$5&Udx*b@Pg`!rus--Y6zkg%`^yA)5Xw)sYPcz#-_rXXsP{ z6|=;C@6-Gi=-%0-6@cbF8e9d#>Upliei%=!Fc?|6^d9^iqkgU3VOqV8;_Kn~1C~PF zH39?RQ|mB_atWNbpbI}i-Q3DRTBT2lN>6kHS0H8%pweZQfymz958ejO6-?FOYPh$T zO$HYi@g!dvu0Su|+skEsUF7fWRpQ>ZawpS)1<%LUpW@+g{KR@@1y{4TV*j?hu=HL7 zae*}+#kMY!x6<32Yx2Jf`J|i1cN~L7G0`$Jtp??Ze#a+EV^fGjr{2a{95=r9D)O$T z!)!25;ClSq`Jdhq|I20m-|2sMa{V^=e~$ZsLEc?Gy9zFVHQoiT(dzqVqKQe+wHh|HYgi)A6X&9Bb!)s+3?0 z{7y#wnXdiMQNEJM9`gtj5ZbF#@aep23^1$*GhFO^HcLLMCtx#Z+hSNp3KSzQKYE~hNpvg80jj%{95(3SL?Ci6_a3?n!aP;M}6)kzU?Pb zXbabacO>vrz+7fDmL8|d>>b~aCvTr+@zwcfHYd5sUUl6IKybc)35M-t5XHqbsSk7B@GB6% zXwo;fiGJYldb&ZI=?4(wS56f7rx%S)Y9vh>EW^Y-5Wd&(Bpc*olHbdM3(XSwp#1f*YoF5^!WFWCh@xiXYyDR)BADUKb&Tl zJ;rC@Sc6W>r{{yKcs$LXjh+ui(@YbS=fvQ{BfY1&p@=MBA&k=+rq`DM)r_gF`mEFI zVC~WTC@a})9~V$pquO)tw_z7Y`(|Zuesju`_#&(RpBgq022$$qdukm$d0(6 zwjhyj2T7RNea<2o#wuaFzjk7=k3X>rKV-giGz~6_qVaHA4#@8x)x3b^gT=AII}3V(FpOca}>gFusMq6pJkv7>vTY{McsaRfSY3;Pqv-{DJ+Z@AL3Y{PTKp4` z4$JV#D7qdGMtW2lijBrc0kG5ZS~bIAkRlV{a14j>@Kr9{2cwIYI@dw?7ObB1crbyn z7*9SlcMj8_KTZePhuXLt$65X0$+@8pCgCN#F}~QVX?oe4xon+7STd6!%80n>H<@Kruw z&*9}^-40e`uQiCGG){rxAk3j%fyCl8SOY{ktfnXcA-#pD%d)htD|6@LvQB};oT}Hr zU?A^+rvV`&v{#B6D0K$&JQuR#Bw5LRuj3@1#Gv0quZqAx%jg!3pN!u9HJCIHZIQkg zN6&*F$CJP26|iW-x;8627|oR>EoA|U@Up!uvLkA1KaWTH{ij*D^8L^9x!>~A*?2rG zW?)Mxt(Cs2E3*xQ(+9n9wFsNd%3{i_o|RP?Mz{3aPz7F%-^Y`)%Xm1n&T=p6{Z|KK zMtPFp0b8*8gEi_?+anD32*&}BU9i5BhIxPY>Ock)CeCK^8{JL~(t9v$nV$1=Zdp*~ zn8CA8t?wp-EY6*4HB<|oB(*L<;y7ks(#!Gt@A8*ylV5`i5U%kzhiB&}|M~3v=;iTAnIFD@ zD0BwNAY61cX^{rc;aQ$ZKkvYAbmi5_%{@1h_!?KRd}fs1kU0-eNlZA5gWAZ}mhs*& z=*Pn|5FTON_Neas(W|dh^9;@K)ig~qtw@3XlugqmZL@bV$i7L^v*|UKZ17{HZwJ?B zA4Xx`b3=hLk>!O}QO>6Qt8p~V{d|i>lNj`uLn&?y!z(w=%jo&oeb+O6e8xScIW2CVCBQbz)e|Bqp?VA^;UE5qf6}7+;=#o zXU5|U_i8n2@PY-yLFpo^^ZCpjUe`yOe1yf5ax5xSw)RZV6?}Ns@UR$|zm|^6&pvze z1`MI$XkM=Ta|)7fSqZ9;saDL|Gg#}cp9hn-$K&^UNHLN08p@Q3vwt0=(*SgwY#I&5 zR!MoDkvpCgj<(XGbaHFLvA%=p8wL|tJu&FlkF9AMM~-Cy7g$BM))VW$@HL7T`7a9= zGz%n<1wZl}S8FiJZ_M(0oq5Loz5@22KqIK4z0yY-Xvq^tPivgLpuimm?*@_eAHncy zHnEENSO(M5Yc!goaGFZzT?)UPcX~8ZJs9w^SNn%v7$=EH5?cx8+X6of;fLI}lgLd- zpC)}GgZ&?Z>p{BzOiL`B82f?esfY){mM$T-@)@x~0~5B2f+!Ixb``C55LO=LnP_|m zR_J7299{yi)M=06cTRwbznaXeK{y$w<0P~DI*faDUC{LPB)Gl=LjXs7|9OnU=uo!~ zGzO9LxAP0};_5Fy|Ly!Q*^Be={qrNjU!FgE|IK$NKmQ%?UA?~i``3RXFRs4jFMd2B z&4Raxg>3N7)6oD7s1m9Op?a&4`eXGb_+Dl40Y-7Zod<7A15k;wT*J)cFgG2_d~!#V zAjxVW1-%h$Hm{fG2c{?9%Iwff)c#+vzjU86)eLW??=0-MYG$gNc3rfFq5Jx~ws($m zBh9yx^%?^@`I%gK?4)dJF0O5(K4A~8aIMX^)WZu6bg?u`@P+pEV!eM{nLztAp9a0_ z!a8~LCjVW?VKzgtTH;Bekbr>6HJx0Jf#r$@az-jNJ9SJ+xzt+ zCoZmy|I;nS|9AO6cXI9G|GW6VwTu7n;{W&GGrNob*M?>n|KG*`ck%yS{J&mj7yqw; zzKj3w;{Ut&|1SQ&i~sN9|GW7A49{Ks-^6&S{=JL;FSNId|L@}embHuj@8bWv`2Q~c z-`mCick%xRAOENS%JF|ZmSGXNb+|scMr>8}kL&)Bz3w5fe zYA=6~-!E@}2@f3Na6+kYD3Q?jXmB;XT2YojSwR@}9lBRIh9C8QVN{Y6&bjTK9v|6) z9fE2mTw&8g?n`wn)bWY;Yws~M&`T#_?@9INm!}LK^TR`19CB$30{`((d{FPalT-hY zpD1yB{A+LTWK_DLYrUQxo)B?zL~J1b)TZ>9+fPr$Q=5<@B2HcZ}|4zpH;#UVEU4dDyJtwsHx)jqeiMlPAJvhl(HhoVll`-YS|l7zu4YKbiggg$wUc zvXdj*B|_Qam>$}mcl^|r@+o2Rh&_F(R`z>?u{f{w|E7L(?nixKj!%wV#A3uMFf^#_fLbU`l%1H{L(r-{O0Uree1=rw~Q+&Xtkcqrn)mX-VS`FHn&F`Hg;QddFmGFg2p=2wJ_V~s9WZQ8#X$lvU8J*$lgkWw@Kdu z!ne|3D}6?icoV+8NrNr(aFgcN^6jRL-4B(MUOMc*W|*?!0HStFZsUO8IE+pPTr9 zB;EOc?&PZBU)o_?{QeV_u1mE4N5~!icX2i0zu=|l+{YUKA7O;e^FQ3!`Ty?b`l49> zt+VLum%Yjp=)5>Nci>j^Q}UJLcnjHHtIokT3QZ z?_>S_g$DNY9qjk3-9o+9YYqS3N+0X^pG�{=1y*&VRm>>;L}ef2X*uz&g{L>OSAo zpW{idgD|$rd64eqQCXceALbu8s~+knvxsz2ravAJ@dWg;)T1<;U@!VxZ;z|e^OG4XAXW@+#7ToJq`aWsH$-J_+Q%CCPZeE=|1w6&ZvX$CTz8=V<;9<+diP3y7=NYZ z^B4QIJB>ObR)Qs|-e<7^rrIrJJ1S^I07`e`~EWVM=1 zZ-+Il=;U9kp35j)XpHy1Di)_Nin@ns8fWQOP!)HVe4c+O{-SPGRc81Mr H04@OlzaE0# diff --git a/azure_devops/bootstrap/setup b/azure_devops/bootstrap/setup index 7af011a..6b5f037 100755 --- a/azure_devops/bootstrap/setup +++ b/azure_devops/bootstrap/setup @@ -51,7 +51,7 @@ def create_project(options) project_to_create = { name: project, - description: "Project to be used for Valet Labs", + description: "Project to be used for GitHub Actions Importer Labs", capabilities: { versioncontrol: { sourceControlType: "Git" diff --git a/azure_devops/readme.md b/azure_devops/readme.md index 5669b3f..6de82e5 100644 --- a/azure_devops/readme.md +++ b/azure_devops/readme.md @@ -1,12 +1,12 @@ -# Azure Pipelines to Actions migrations powered by Valet +# Azure Pipelines to Actions migrations powered by GitHub Actions Importer -These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs to demonstrate how to use Valet to migrate Azure DevOps pipelines to GitHub Actions. +These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs to demonstrate how to use GitHub Actions Importer to migrate Azure DevOps pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -- Ensure that you have created a repository using [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +- Ensure that you have created a repository using [actions/importer-labs](https://github.com/actions/importer-labs) as a template. ## Configure your codespace @@ -17,7 +17,7 @@ These steps **must** be completed prior to starting other labs. - Click `Create codespaces on main` to create the codespace. - After the codespace has initialized there will be a terminal present. -2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). +2. Verify the GitHub Actions Importer CLI is installed and working. More information on the GitHub Actions Importer extension for the official GitHub CLI can be found [here](https://github.com/github/gh-actions-importer). - Run the following command in the codespace terminal: @@ -30,11 +30,11 @@ These steps **must** be completed prior to starting other labs. ```console $ gh actions-importer version gh version 2.14.3 (2022-07-26) - gh actions-importer github/gh-valet v0.1.12 - valet-cli unknown + gh actions-importer github/gh-actions-importer v0.1.12 + actions-importer/cli unknown ``` - - If `gh actions-importer version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh actions-importer version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-actions-importer/cli). ## Bootstrap your Azure DevOps organization @@ -74,37 +74,37 @@ These steps **must** be completed prior to starting other labs. ## Labs for Azure DevOps -Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using Valet: +Perform the following labs to learn how to migrate Azure DevOps pipelines to GitHub Actions using GitHub Actions Importer: -1. [Configure credentials for Valet](1-configure.md) +1. [Configure credentials for GitHub Actions Importer](1-configure.md) 2. [Perform an audit of an Azure DevOps project](2-audit.md) 3. [Forecast potential build runner usage](3-forecast.md) 4. [Perform a dry-run migration of an Azure DevOps pipeline](4-dry-run.md) -5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +5. [Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) 6. [Perform a production migration of a Azure DevOps pipeline](6-migrate.md) -## Troubleshoot the Valet CLI +## Troubleshoot the GitHub Actions Importer CLI -The CLI extension for Valet can be manually installed by following these steps: +The CLI extension for GitHub Actions Importer can be manually installed by following these steps: - Verify you are in the codespace terminal - Run this command from within the codespace terminal: ```bash - gh extension install github/gh-valet + gh extension install github/gh-actions-importer ``` - Verify the result of the install contains: ```console - $ gh extension install github/gh-valet - βœ“ Installed extension github/gh-valet + $ gh extension install github/gh-actions-importer + βœ“ Installed extension github/gh-actions-importer ``` - If you get an error similar to the image below, click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: +- Verify GitHub Actions Importer CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh actions-importer version diff --git a/circle_ci/1-configure.md b/circle_ci/1-configure.md index fab1250..23bd90f 100644 --- a/circle_ci/1-configure.md +++ b/circle_ci/1-configure.md @@ -1,6 +1,6 @@ -# Configure credentials for Valet +# Configure credentials for GitHub Actions Importer -In this lab, you will use the `configure` CLI command to set the required credentials and information for Valet to use when working with CircleCI and GitHub. +In this lab, you will use the `configure` CLI command to set the required credentials and information for GitHub Actions Importer to use when working with CircleCI and GitHub. You will need to complete all of the setup instructions [here](./readme.md#configure-your-codespace) prior to performing this lab. @@ -28,7 +28,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi - At the GitHub url prompt, enter the GitHub instance url or hit enter to accept the default value (`https://github.com`). - At the CircleCI token prompt, enter the CircleCI access token from step 2 and press enter. - At the CircleCI base url prompt, hit enter to accept the default value (`https://circleci.com`). - - At the CircleCI organization name prompt, enter `valet-labs`. This is the organization we'll be using throughout these labs. + - At the CircleCI organization name prompt, enter `actions-importer-labs`. This is the organization we'll be using throughout these labs. ```console $ gh actions-importer configure @@ -40,13 +40,13 @@ You will need to complete all of the setup instructions [here](./readme.md#confi βœ” Base url of the GitHub instance: https://github.com βœ” Personal access token for CircleCI: *************** βœ” Base url of the CircleCI instance: https://circleci.com - βœ” CircleCI organization name: valet-labs + βœ” CircleCI organization name: actions-importer-labs Environment variables successfully updated. ``` ## Verify your environment -To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of GitHub Actions Importer to your codespace. 1. In the codespace terminal run the following command: @@ -54,12 +54,12 @@ To verify our environment is configured correctly, we are going to run the `upda gh actions-importer update ``` -2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. +2. You should see a confirmation that you were logged into the GitHub Container Registry and the image was updated to the latest version. ```console $ gh actions-importer update Login Succeeded - latest: Pulling from valet-customers/valet-cli + latest: Pulling from actions-importer/cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb Status: Image is up to date for ghcr.io/actions-importer/cli:latest ghcr.io/actions-importer/cli:latest diff --git a/circle_ci/2-audit.md b/circle_ci/2-audit.md index 5792ff1..c5cb17f 100644 --- a/circle_ci/2-audit.md +++ b/circle_ci/2-audit.md @@ -3,21 +3,22 @@ In this lab, you will use the `audit` command to get a high-level view of all projects in a CircleCI organization. The `audit` command will perform the following steps: + 1. Fetch all of the projects defined in an CircleCI organization. 2. Convert each pipeline to their equivalent GitHub Actions workflow. -3. Generate a report that summarizes how complete and complex of a migration is possible with Valet. +3. Generate a report that summarizes how complete and complex of a migration is possible with GitHub Actions Importer. ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your GitHub Codespaces environment. -2. Completed the [configure lab](./1-configure.md#configure-credentials-for-valet). +2. Completed the [configure lab](./1-configure.md). ## Perform an audit -You will be performing an `audit` for the __valet-labs__ CircleCI organization that was created for the purposes of these labs. Your environment was configured to use this organization during the [configure lab](./1-configure.md). The remaining information needed to perform an `audit` is: +You will be performing an `audit` for the __actions-importer-labs__ CircleCI organization that was created for the purposes of these labs. Your environment was configured to use this organization during the [configure lab](./1-configure.md). The remaining information needed to perform an `audit` is: 1. Where do we want to store the result? - - __tmp/audit__. This can be any path within the working directory that Valet commands are executed from. + - __tmp/audit__. This can be any path within the working directory that GitHub Actions Importer commands are executed from. ### Steps @@ -40,7 +41,7 @@ You will be performing an `audit` for the __valet-labs__ CircleCI organization t #### Pipelines -The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: +The pipeline summary section contains high level statistics regarding the conversion rate done by GitHub Actions Importer: ```md ## Pipelines @@ -66,14 +67,14 @@ Here are some key terms that can appear in the β€œPipelines” section: - __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items that were not converted automatically to their GitHub Actions equivalent. - __Failed pipelines__ encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in CircleCI. - - Valet encountered an internal error when converting it. + - GitHub Actions Importer encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. -The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by Valet. +The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by GitHub Actions Importer. #### Build steps -The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. +The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by GitHub Actions Importer. ```md ### Build steps @@ -122,7 +123,7 @@ There is an equivalent breakdown of build triggers, environment variables, and o #### Manual Tasks -The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. +The manual tasks summary section presents an overview of the manual tasks that you will need to perform that GitHub Actions Importer is not able to complete automatically. ```md ### Manual tasks @@ -146,44 +147,44 @@ The final section of the audit report provides a manifest of all of the files th ```md ### Successful -#### valet-labs/circleci-hello-world +#### actions-importer-labs/circleci-hello-world -- [valet-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml](valet-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml) -- [valet-labs/circleci-hello-world/config.json](valet-labs/circleci-hello-world/config.json) -- [valet-labs/circleci-hello-world/source.yml](valet-labs/circleci-hello-world/source.yml) +- [actions-importer-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml](actions-importer-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml) +- [actions-importer-labs/circleci-hello-world/config.json](actions-importer-labs/circleci-hello-world/config.json) +- [actions-importer-labs/circleci-hello-world/source.yml](actions-importer-labs/circleci-hello-world/source.yml) -#### valet-labs/circleci-command-example +#### actions-importer-labs/circleci-command-example -- [valet-labs/circleci-command-example/.github/workflows/my-workflow.yml](valet-labs/circleci-command-example/.github/workflows/my-workflow.yml) -- [valet-labs/circleci-command-example/.github/actions/greeting/action.yml](valet-labs/circleci-command-example/.github/actions/greeting/action.yml) -- [valet-labs/circleci-command-example/config.json](valet-labs/circleci-command-example/config.json) -- [valet-labs/circleci-command-example/source.yml](valet-labs/circleci-command-example/source.yml) +- [actions-importer-labs/circleci-command-example/.github/workflows/my-workflow.yml](actions-importer-labs/circleci-command-example/.github/workflows/my-workflow.yml) +- [actions-importer-labs/circleci-command-example/.github/actions/greeting/action.yml](actions-importer-labs/circleci-command-example/.github/actions/greeting/action.yml) +- [actions-importer-labs/circleci-command-example/config.json](actions-importer-labs/circleci-command-example/config.json) +- [actions-importer-labs/circleci-command-example/source.yml](actions-importer-labs/circleci-command-example/source.yml) -#### valet-labs/circleci-python-example +#### actions-importer-labs/circleci-python-example -- [valet-labs/circleci-python-example/.github/workflows/sample.yml](valet-labs/circleci-python-example/.github/workflows/sample.yml) -- [valet-labs/circleci-python-example/config.json](valet-labs/circleci-python-example/config.json) -- [valet-labs/circleci-python-example/source.yml](valet-labs/circleci-python-example/source.yml) +- [actions-importer-labs/circleci-python-example/.github/workflows/sample.yml](actions-importer-labs/circleci-python-example/.github/workflows/sample.yml) +- [actions-importer-labs/circleci-python-example/config.json](actions-importer-labs/circleci-python-example/config.json) +- [actions-importer-labs/circleci-python-example/source.yml](actions-importer-labs/circleci-python-example/source.yml) -#### valet-labs/circleci-demo-java-spring +#### actions-importer-labs/circleci-demo-java-spring -- [valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml](valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml) -- [valet-labs/circleci-demo-java-spring/config.json](valet-labs/circleci-demo-java-spring/config.json) -- [valet-labs/circleci-demo-java-spring/source.yml](valet-labs/circleci-demo-java-spring/source.yml) +- [actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml](actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml) +- [actions-importer-labs/circleci-demo-java-spring/config.json](actions-importer-labs/circleci-demo-java-spring/config.json) +- [actions-importer-labs/circleci-demo-java-spring/source.yml](actions-importer-labs/circleci-demo-java-spring/source.yml) -#### valet-labs/circleci-demo-ruby-rails +#### actions-importer-labs/circleci-demo-ruby-rails -- [valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml](valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml) -- [valet-labs/circleci-demo-ruby-rails/config.json](valet-labs/circleci-demo-ruby-rails/config.json) -- [valet-labs/circleci-demo-ruby-rails/source.yml](valet-labs/circleci-demo-ruby-rails/source.yml) +- [actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml](actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml) +- [actions-importer-labs/circleci-demo-ruby-rails/config.json](actions-importer-labs/circleci-demo-ruby-rails/config.json) +- [actions-importer-labs/circleci-demo-ruby-rails/source.yml](actions-importer-labs/circleci-demo-ruby-rails/source.yml) ### Partially successful -#### valet-labs/circleci-node-example +#### actions-importer-labs/circleci-node-example -- [valet-labs/circleci-node-example/.github/workflows/sample.yml](valet-labs/circleci-node-example/.github/workflows/sample.yml) -- [valet-labs/circleci-node-example/config.json](valet-labs/circleci-node-example/config.json) -- [valet-labs/circleci-node-example/source.yml](valet-labs/circleci-node-example/source.yml) +- [actions-importer-labs/circleci-node-example/.github/workflows/sample.yml](actions-importer-labs/circleci-node-example/.github/workflows/sample.yml) +- [actions-importer-labs/circleci-node-example/config.json](actions-importer-labs/circleci-node-example/config.json) +- [actions-importer-labs/circleci-node-example/source.yml](actions-importer-labs/circleci-node-example/source.yml) ``` Each pipeline will have a variety of files written that include: @@ -200,19 +201,19 @@ Each pipeline will have a variety of files written that include: ```csv Pipeline,Action,File path - valet-labs/circleci-hello-world,actions/checkout@v2,tmp/audit/valet-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml - valet-labs/circleci-command-example,./.github/actions/greeting,tmp/audit/valet-labs/circleci-command-example/.github/workflows/my-workflow.yml - valet-labs/circleci-node-example,actions/checkout@v2,tmp/audit/valet-labs/circleci-node-example/.github/workflows/sample.yml - valet-labs/circleci-node-example,actions/cache@v2,tmp/audit/valet-labs/circleci-node-example/.github/workflows/sample.yml - valet-labs/circleci-python-example,actions/checkout@v2,tmp/audit/valet-labs/circleci-python-example/.github/workflows/sample.yml - valet-labs/circleci-python-example,actions/cache@v2,tmp/audit/valet-labs/circleci-python-example/.github/workflows/sample.yml - valet-labs/circleci-demo-java-spring,actions/checkout@v2,tmp/audit/valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml - valet-labs/circleci-demo-java-spring,actions/cache@v2,tmp/audit/valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml - valet-labs/circleci-demo-java-spring,actions/upload-artifact@v2,tmp/audit/valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml - valet-labs/circleci-demo-java-spring,actions/download-artifact@v2,tmp/audit/valet-labs/circleci-demo-java-spring/.github/workflows/workflow.yml - valet-labs/circleci-demo-ruby-rails,ruby/setup-ruby@v1,tmp/audit/valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml - valet-labs/circleci-demo-ruby-rails,actions/checkout@v2,tmp/audit/valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml - valet-labs/circleci-demo-ruby-rails,actions/cache@v2,tmp/audit/valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml + actions-importer-labs/circleci-hello-world,actions/checkout@v2,tmp/audit/actions-importer-labs/circleci-hello-world/.github/workflows/say-hello-workflow.yml + actions-importer-labs/circleci-command-example,./.github/actions/greeting,tmp/audit/actions-importer-labs/circleci-command-example/.github/workflows/my-workflow.yml + actions-importer-labs/circleci-node-example,actions/checkout@v2,tmp/audit/actions-importer-labs/circleci-node-example/.github/workflows/sample.yml + actions-importer-labs/circleci-node-example,actions/cache@v2,tmp/audit/actions-importer-labs/circleci-node-example/.github/workflows/sample.yml + actions-importer-labs/circleci-python-example,actions/checkout@v2,tmp/audit/actions-importer-labs/circleci-python-example/.github/workflows/sample.yml + actions-importer-labs/circleci-python-example,actions/cache@v2,tmp/audit/actions-importer-labs/circleci-python-example/.github/workflows/sample.yml + actions-importer-labs/circleci-demo-java-spring,actions/checkout@v2,tmp/audit/actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml + actions-importer-labs/circleci-demo-java-spring,actions/cache@v2,tmp/audit/actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml + actions-importer-labs/circleci-demo-java-spring,actions/upload-artifact@v2,tmp/audit/actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml + actions-importer-labs/circleci-demo-java-spring,actions/download-artifact@v2,tmp/audit/actions-importer-labs/circleci-demo-java-spring/.github/workflows/workflow.yml + actions-importer-labs/circleci-demo-ruby-rails,ruby/setup-ruby@v1,tmp/audit/actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml + actions-importer-labs/circleci-demo-ruby-rails,actions/checkout@v2,tmp/audit/actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml + actions-importer-labs/circleci-demo-ruby-rails,actions/cache@v2,tmp/audit/actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml Pipeline,Secret,File path diff --git a/circle_ci/3-forecast.md b/circle_ci/3-forecast.md index 2d16bf3..dc62765 100644 --- a/circle_ci/3-forecast.md +++ b/circle_ci/3-forecast.md @@ -29,8 +29,8 @@ Answer the following questions before running the `forecast` command: ```console $ gh actions-importer forecast circle-ci --output-dir tmp/forecast_reports --start-date 2022-09-02 - [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/valet-20220916-021004.log' - [2022-08-20 22:08:20] Forecasting 'http://app.circleci.com/pipelines/github/valet-labs' + [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/actions-importer-20220916-021004.log' + [2022-08-20 22:08:20] Forecasting 'http://app.circleci.com/pipelines/github/actions-importer-labs' [2022-08-20 22:08:20] Output file(s): [2022-08-20 22:08:20] tmp/forecast/jobs/09-16-2022-02-10_jobs_0.json [2022-08-20 22:08:20] tmp/forecast/forecast_report.md diff --git a/circle_ci/4-dry-run.md b/circle_ci/4-dry-run.md index 0d8d80b..a99dad2 100644 --- a/circle_ci/4-dry-run.md +++ b/circle_ci/4-dry-run.md @@ -13,10 +13,10 @@ In this lab you will use the `dry-run` command to convert a CircleCI pipeline to You will be performing a dry run migration against a CircleCI project. Answer the following questions before running this command: 1. What project do you want to convert? - - __circleci-demo-ruby-rails__. This is one of the sample projects avaiable in the CircleCI valet-labs organization. + - __circleci-demo-ruby-rails__. This is one of the sample projects avaiable in the CircleCI actions-importer-labs organization. 2. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory that Valet commands are executed from. + - __tmp/dry-run__. This can be any path within the working directory that GitHub Actions Importer commands are executed from. ### Steps @@ -30,14 +30,14 @@ You will be performing a dry run migration against a CircleCI project. Answer th 3. The command will list all the files written to disk when the command succeeds. ```console - $ gh actions-importer dry-run circle-ci --output-dir tmp/dry-run --circle-ci-project circleci-demo-ruby-rails --circle-ci-organization valet-labs - [2022-09-19 19:46:03] Logs: 'tmp/dry-run/log/valet-20220919-194603.log' + $ gh actions-importer dry-run circle-ci --output-dir tmp/dry-run --circle-ci-project circleci-demo-ruby-rails --circle-ci-organization actions-importer-labs + [2022-09-19 19:46:03] Logs: 'tmp/dry-run/log/actions-importer-20220919-194603.log' [2022-09-19 19:46:05] Output file(s): - [2022-09-19 19:46:05] tmp/dry-run/valet-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml + [2022-09-19 19:46:05] tmp/dry-run/actions-importer-labs/circleci-demo-ruby-rails/.github/workflows/build_and_test.yml ``` 4. View the converted workflow: - - Find `tmp/dry-run/valet-labs/circleci-demo-ruby-rails/.github/workflows` in the file explorer pane in your codespace. + - Find `tmp/dry-run/actions-importer-labs/circleci-demo-ruby-rails/.github/workflows` in the file explorer pane in your codespace. - Click `build_and_test.yml` to open. ## Inspect the output files @@ -114,7 +114,7 @@ workflows: Converted workflow πŸ‘‡ ```yaml -name: valet-labs/circleci-demo-ruby-rails/build_and_test +name: actions-importer-labs/circleci-demo-ruby-rails/build_and_test on: push: branches: @@ -194,4 +194,4 @@ Despite these two pipelines using different syntax they will function equivalent ## Next lab -[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) +[Use custom transformers to customize GitHub Actions Importer's behavior](./5-custom-transformers.md) diff --git a/circle_ci/5-custom-transformers.md b/circle_ci/5-custom-transformers.md index 2753d6d..c9b6911 100644 --- a/circle_ci/5-custom-transformers.md +++ b/circle_ci/5-custom-transformers.md @@ -1,6 +1,6 @@ -# Using custom transformers to customize Valet's behavior +# Using custom transformers to customize GitHub Actions Importer's behavior -In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override GitHub Actions Importer's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -27,7 +27,7 @@ The converted workflow that is generated by the above command can be seen below: Converted workflow πŸ‘‡ ```yaml -name: valet-labs/circleci-node-example/sample +name: actions-importer-labs/circleci-node-example/sample on: push: branches: @@ -98,7 +98,7 @@ transform "codecov_codecov_upload" do |_item| end ``` -This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in CircleCI. +This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. GitHub Actions Importer will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in CircleCI. Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: @@ -187,7 +187,7 @@ end -That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden GitHub Actions Importer's default behavior by customizing the conversion of: - Unknown steps - Environment variables diff --git a/circle_ci/6-migrate.md b/circle_ci/6-migrate.md index 6df0506..8dccdea 100644 --- a/circle_ci/6-migrate.md +++ b/circle_ci/6-migrate.md @@ -31,7 +31,7 @@ Answer the following questions before running a `migrate` command: ```console $ gh actions-importer migrate circle-ci --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --circle-ci-project circleci-hello-world - [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/valet-20220916-014033.log' + [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log' [2022-08-20 22:08:20] Pull request: 'https://github.com/:owner/:repo/pull/1' ``` @@ -51,4 +51,4 @@ At this point, the migration has completed and you have successfully migrated a ### Next Lab -This concludes all labs for migrating CircleCI pipelines to Actions with Valet! +This concludes all labs for migrating CircleCI pipelines to Actions with GitHub Actions Importer! diff --git a/circle_ci/readme.md b/circle_ci/readme.md index a00d298..091e7e6 100644 --- a/circle_ci/readme.md +++ b/circle_ci/readme.md @@ -1,12 +1,12 @@ -# CircleCI to Actions migrations powered by Valet +# CircleCI to Actions migrations powered by GitHub Actions Importer -The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate CircleCI pipelines to GitHub Actions. +The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use GitHub Actions Importer to migrate CircleCI pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +1. Ensure that you have created a repository using the [actions/importer-labs](https://github.com/actions/importer-labs) as a template. ## Configure your Codespace @@ -17,7 +17,7 @@ These steps **must** be completed prior to starting other labs. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. -2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). +2. Verify the GitHub Actions Importer CLI is installed and working. More information on the GitHub Actions Importer extension for the official GitHub CLI can be found [here](https://github.com/github/gh-actions-importer). - Run the following command in the codespace's terminal: @@ -30,45 +30,45 @@ These steps **must** be completed prior to starting other labs. ```console $ gh actions-importer version gh version 2.14.3 (2022-07-26) - gh actions-importer github/gh-valet v0.1.12 - valet-cli unknown + gh actions-importer github/gh-actions-importer v0.1.12 + actions-importer/cli unknown ``` - - If `gh actions-importer version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh actions-importer version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-actions-importer/cli). ## Labs for CircleCI -Perform the following labs to test-drive Valet +Perform the following labs to learn how to migrate CircleCI pipelines to GitHub Actions using GitHub Actions Importer: -1. [Configure credentials for Valet](1-configure.md) +1. [Configure credentials for GitHub Actions Importer](1-configure.md) 2. [Perform an audit of CircleCI](2-audit.md) 3. [Forecast potential build runner usage](3-forecast.md) 4. [Perform a dry-run of a CircleCI pipeline](4-dry-run.md) -5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +5. [Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) 6. [Perform a production migration of a CircleCI pipeline](6-migrate.md) -## Troubleshoot the Valet CLI +## Troubleshoot the GitHub Actions Importer CLI -The CLI extension for Valet can be manually installed by following these steps: +The CLI extension for GitHub Actions Importer can be manually installed by following these steps: - Verify you are in the codespace terminal - Run this command from within the codespace's terminal: ```bash - gh extension install github/gh-valet + gh extension install github/gh-actions-importer ``` - Verify the result of the install contains: ```console - $ gh extension install github/gh-valet - βœ“ Installed extension github/gh-valet + $ gh extension install github/gh-actions-importer + βœ“ Installed extension github/gh-actions-importer ``` - If you get an error similar to the image below, then click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: +- Verify GitHub Actions Importer CLI extension is installed and working by running the following command from the codespace's terminal: ```bash gh actions-importer version diff --git a/gitlab/1-configure.md b/gitlab/1-configure.md index 4fa2e9b..07e8056 100644 --- a/gitlab/1-configure.md +++ b/gitlab/1-configure.md @@ -1,6 +1,6 @@ -# Configure credentials for Valet +# Configure credentials for GitHub Actions Importer -In this lab, you will use the `configure` CLI command to set the required credentials and information for Valet to use when working with GitLab and GitHub. +In this lab, you will use the `configure` CLI command to set the required credentials and information for GitHub Actions Importer to use when working with GitLab and GitHub. You will need to complete all of the setup instructions [here](./readme.md#configure-your-codespace) prior to performing this lab. @@ -20,7 +20,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi 3. Create a GitLab personal access token (PAT): - Authenticate with the GitLab server using the following credentials: - Username: `root` - - Password: `valet-labs!` + - Password: `actions-importer-labs!` - Follow the GitLab [instructions](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token) to generate a PAT. - Ensure the token has the `read_api` scope. - Copy the generated token and save it in a safe location. @@ -62,7 +62,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Verify your environment -To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of GitHub Actions Importer to your codespace. 1. In the codespace terminal run the following command: @@ -70,12 +70,12 @@ To verify your environment is configured correctly, run the `update` CLI command gh actions-importer update ``` -2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. +2. You should see a confirmation that you were logged into the GitHub Container Registry and the image was updated to the latest version. ```console $ gh actions-importer update Login Succeeded - latest: Pulling from valet-customers/valet-cli + latest: Pulling from actions-importer/cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb Status: Image is up to date for ghcr.io/actions-importer/cli:latest ghcr.io/actions-importer/cli:latest diff --git a/gitlab/2-audit.md b/gitlab/2-audit.md index 08b3aea..d9d486d 100644 --- a/gitlab/2-audit.md +++ b/gitlab/2-audit.md @@ -3,9 +3,10 @@ In this lab, you will use the `audit` command to get a high-level view of all pipelines in a GitLab server. The `audit` command will perform the following steps: + 1. Fetch all of the projects defined in a GitLab group. 2. Convert each pipeline to their equivalent GitHub Actions workflow. -3. Generate a report that summarizes how complete and complex of a migration is possible with Valet. +3. Generate a report that summarizes how complete and complex of a migration is possible with GitHub Actions Importer. ## Prerequisites @@ -17,10 +18,10 @@ The `audit` command will perform the following steps: You will be performing an audit against your preconfigured GitLab server. Answer the following questions before running this command: 1. What namespace (e.g. group) do you want to audit? - - __valet__. In this example you will be auditing the `valet` group. In the future, you could add additional groups and subgroups to the audit command. + - __actions-importer__. In this example you will be auditing the `actions-importer` group. In the future, you could add additional groups and subgroups to the audit command. 2. Where do you want to store the result? - - __tmp/audit__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/audit__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -28,7 +29,7 @@ You will be performing an audit against your preconfigured GitLab server. Answer 2. Run the following command from the root directory: ```bash - gh actions-importer audit gitlab --output-dir tmp/audit --namespace valet + gh actions-importer audit gitlab --output-dir tmp/audit --namespace actions-importer ``` 3. The command will list all the files written to disk in green when the command succeeds. @@ -43,7 +44,7 @@ You will be performing an audit against your preconfigured GitLab server. Answer #### Pipelines -The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: +The pipeline summary section contains high level statistics regarding the conversion rate done by GitHub Actions Importer: ```md ## Pipelines @@ -70,17 +71,17 @@ Here are some key terms in the β€œPipelines” section in the above example: - __Successful__ pipelines had 100% of the pipeline constructs and individual items converted automatically to their GitHub Actions equivalent. - __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items (e.g. build tasks or build triggers) that were not converted automatically to their GitHub Actions equivalent. -- __Unsupported__ pipelines are definition types that are not supported by Valet. Auto DevOps pipelines are not supported. +- __Unsupported__ pipelines are definition types that are not supported by GitHub Actions Importer. Auto DevOps pipelines are not supported. - __Failed__ pipelines encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in GitLab. - - Valet encountered an internal error when converting it. + - GitHub Actions Importer encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. -The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by Valet. +The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by GitHub Actions Importer. #### Build steps -The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. +The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by GitHub Actions Importer. ```md ### Build steps @@ -129,7 +130,7 @@ There is an equivalent breakdown of build triggers, environment variables, and o #### Manual Tasks -The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. +The manual tasks summary section presents an overview of the manual tasks that you will need to perform that GitHub Actions Importer is not able to complete automatically. ```md ### Manual tasks @@ -153,25 +154,25 @@ The final section of the audit report provides a manifest of all of the files th ```md ### Successful -#### valet/included-files-example +#### actions-importer/included-files-example -- [valet/included-files-example/.github/workflows/included-files-example.yml](valet/included-files-example/.github/workflows/included-files-example.yml) -- [valet/included-files-example/config.json](valet/included-files-example/config.json) -- [valet/included-files-example/source.yml](valet/included-files-example/source.yml) +- [actions-importer/included-files-example/.github/workflows/included-files-example.yml](actions-importer/included-files-example/.github/workflows/included-files-example.yml) +- [actions-importer/included-files-example/config.json](actions-importer/included-files-example/config.json) +- [actions-importer/included-files-example/source.yml](actions-importer/included-files-example/source.yml) -#### valet/terraform-example +#### actions-importer/terraform-example -- [valet/terraform-example/.github/workflows/terraform-example.yml](valet/terraform-example/.github/workflows/terraform-example.yml) -- [valet/terraform-example/config.json](valet/terraform-example/config.json) -- [valet/terraform-example/source.yml](valet/terraform-example/source.yml) +- [actions-importer/terraform-example/.github/workflows/terraform-example.yml](actions-importer/terraform-example/.github/workflows/terraform-example.yml) +- [actions-importer/terraform-example/config.json](actions-importer/terraform-example/config.json) +- [actions-importer/terraform-example/source.yml](actions-importer/terraform-example/source.yml) -#### valet/child-parent-example +#### actions-importer/child-parent-example -- [valet/child-parent-example/.github/workflows/child-parent-example.yml](valet/child-parent-example/.github/workflows/child-parent-example.yml) -- [valet/child-parent-example/.github/workflows/a-.gitlab-ci.yml](valet/child-parent-example/.github/workflows/a-.gitlab-ci.yml) -- [valet/child-parent-example/.github/workflows/b-.gitlab-ci.yml](valet/child-parent-example/.github/workflows/b-.gitlab-ci.yml) -- [valet/child-parent-example/config.json](valet/child-parent-example/config.json) -- [valet/child-parent-example/source.yml](valet/child-parent-example/source.yml) +- [actions-importer/child-parent-example/.github/workflows/child-parent-example.yml](actions-importer/child-parent-example/.github/workflows/child-parent-example.yml) +- [actions-importer/child-parent-example/.github/workflows/a-.gitlab-ci.yml](actions-importer/child-parent-example/.github/workflows/a-.gitlab-ci.yml) +- [actions-importer/child-parent-example/.github/workflows/b-.gitlab-ci.yml](actions-importer/child-parent-example/.github/workflows/b-.gitlab-ci.yml) +- [actions-importer/child-parent-example/config.json](actions-importer/child-parent-example/config.json) +- [actions-importer/child-parent-example/source.yml](actions-importer/child-parent-example/source.yml) ``` Each pipeline will have a variety of files written that include: @@ -188,35 +189,36 @@ Each pipeline will have a variety of files written that include: ```csv Pipeline,Action,File path - valet/included-files-example,actions/checkout@v2,tmp/audit/valet/included-files-example/.github/workflows/included-files-example.yml - valet/terraform-example,actions/checkout@v2,tmp/audit/valet/terraform-example/.github/workflows/terraform-example.yml - valet/child-parent-example,actions/checkout@v2,tmp/audit/valet/child-parent-example/.github/workflows/child-parent-example.yml - valet/child-parent-example,./.github/workflows/a-.gitlab-ci.yml,tmp/audit/valet/child-parent-example/.github/workflows/child-parent-example.yml - valet/child-parent-example,./.github/workflows/b-.gitlab-ci.yml,tmp/audit/valet/child-parent-example/.github/workflows/child-parent-example.yml - valet/include-file-example,actions/checkout@v2,tmp/audit/valet/include-file-example/.github/workflows/include-file-example.yml - valet/basic-pipeline-example,actions/checkout@v2,tmp/audit/valet/basic-pipeline-example/.github/workflows/basic-pipeline-example.yml - valet/gatsby-example,actions/checkout@v2,tmp/audit/valet/gatsby-example/.github/workflows/gatsby-example.yml - valet/gatsby-example,actions/cache@v2,tmp/audit/valet/gatsby-example/.github/workflows/gatsby-example.yml - valet/gatsby-example,actions/upload-artifact@v2,tmp/audit/valet/gatsby-example/.github/workflows/gatsby-example.yml - valet/gatsby-example,actions/download-artifact@v2,tmp/audit/valet/gatsby-example/.github/workflows/gatsby-example.yml - valet/gatsby-example,JamesIves/github-pages-deploy-action@4.1.5,tmp/audit/valet/gatsby-example/.github/workflows/gatsby-example.yml - valet/android-example,actions/checkout@v2,tmp/audit/valet/android-example/.github/workflows/android-example.yml - valet/android-example,actions/upload-artifact@v2,tmp/audit/valet/android-example/.github/workflows/android-example.yml - valet/android-example,actions/download-artifact@v2,tmp/audit/valet/android-example/.github/workflows/android-example.yml - valet/dotnet-example,actions/checkout@v2,/data/tmp/audit/valet/dotnet-example/.github/workflows/dotnet-example.yml - valet/dotnet-example,actions/upload-artifact@v2,tmp/audit/valet/dotnet-example/.github/workflows/dotnet-example.yml - valet/dotnet-example,actions/download-artifact@v2,tmp/audit/valet/dotnet-example/.github/workflows/dotnet-example.yml - valet/node-example,actions/checkout@v2,tmp/audit/valet/node-example/.github/workflows/node-example.yml - valet/node-example,actions/cache@v2,tmp/audit/valet/node-example/.github/workflows/node-example.yml - valet/rails-example,actions/checkout@v2,tmp/audit/valet/rails-example/.github/workflows/rails-example.yml + actions-importer/included-files-example,actions/checkout@v2,tmp/audit/actions-importer/included-files-example/.github/workflows/included-files-example.yml + actions-importer/terraform-example,actions/checkout@v2,tmp/audit/actions-importer/terraform-example/.github/workflows/terraform-example.yml + actions-importer/child-parent-example,actions/checkout@v2,tmp/audit/actions-importer/child-parent-example/.github/workflows/child-parent-example.yml + actions-importer/child-parent-example,./.github/workflows/a-.gitlab-ci.yml,tmp/audit/actions-importer/child-parent-example/.github/workflows/child-parent-example.yml + actions-importer/child-parent-example,./.github/workflows/b-.gitlab-ci.yml,tmp/audit/actions-importer/child-parent-example/.github/workflows/child-parent-example.yml + actions-importer/include-file-example,actions/checkout@v2,tmp/audit/actions-importer/include-file-example/.github/workflows/include-file-example.yml + actions-importer/basic-pipeline-example,actions/checkout@v2,tmp/audit/actions-importer/basic-pipeline-example/.github/workflows/basic-pipeline-example.yml + actions-importer/gatsby-example,actions/checkout@v2,tmp/audit/actions-importer/gatsby-example/.github/workflows/gatsby-example.yml + actions-importer/gatsby-example,actions/cache@v2,tmp/audit/actions-importer/gatsby-example/.github/workflows/gatsby-example.yml + actions-importer/gatsby-example,actions/upload-artifact@v2,tmp/audit/actions-importer/gatsby-example/.github/workflows/gatsby-example.yml + actions-importer/gatsby-example,actions/download-artifact@v2,tmp/audit/actions-importer/gatsby-example/.github/workflows/gatsby-example.yml + actions-importer/gatsby-example,JamesIves/github-pages-deploy-action@4.1.5,tmp/audit/actions-importer/gatsby-example/.github/workflows/gatsby-example.yml + actions-importer/android-example,actions/checkout@v2,tmp/audit/actions-importer/android-example/.github/workflows/android-example.yml + actions-importer/android-example,actions/upload-artifact@v2,tmp/audit/actions-importer/android-example/.github/workflows/android-example.yml + actions-importer/android-example,actions/download-artifact@v2,tmp/audit/actions-importer/android-example/.github/workflows/android-example.yml + actions-importer/dotnet-example,actions/checkout@v2,/data/tmp/audit/actions-importer/dotnet-example/.github/workflows/dotnet-example.yml + actions-importer/dotnet-example,actions/upload-artifact@v2,tmp/audit/actions-importer/dotnet-example/.github/workflows/dotnet-example.yml + actions-importer/dotnet-example,actions/download-artifact@v2,tmp/audit/actions-importer/dotnet-example/.github/workflows/dotnet-example.yml + actions-importer/node-example,actions/checkout@v2,tmp/audit/actions-importer/node-example/.github/workflows/node-example.yml + actions-importer/node-example,actions/cache@v2,tmp/audit/actions-importer/node-example/.github/workflows/node-example.yml + actions-importer/rails-example,actions/checkout@v2,tmp/audit/actions-importer/rails-example/.github/workflows/rails-example.yml Pipeline,Secret,File path - valet/rails-example,${{ secrets.PASSWORD }},tmp/audit/valet/rails-example/.github/workflows/rails-example.yml + actions-importer/rails-example,${{ secrets.PASSWORD }},tmp/audit/actions-importer/rails-example/.github/workflows/rails-example.yml Pipeline,Runner,File path ``` The contents of this file can be useful in answering questions similar to the following: + - What workflows will depend on which actions? - What workflows use an action that must go through a security review? - What workflows use specific secrets? diff --git a/gitlab/3-forecast.md b/gitlab/3-forecast.md index 55119bf..5ec3b8a 100644 --- a/gitlab/3-forecast.md +++ b/gitlab/3-forecast.md @@ -12,7 +12,7 @@ In this lab you will use the `forecast` command to forecast potential GitHub Act Answer the following questions before running the `forecast` command: 1. What namespace do you want to run the forecast for? - - **valet** + - **actions-importer** 2. What is the date you want to start forecasting from? - **2022-08-02**. This date is needed as it is prior to when the data was seeded in GitLab for these labs. This value defaults to the date one week ago, however, you should use a start date that will show a representative view of typical usage. 3. Where do you want to store the results? @@ -24,7 +24,7 @@ Answer the following questions before running the `forecast` command: 2. Run the following command from the root directory: ```bash - gh actions-importer forecast gitlab --output-dir tmp/forecast --namespace valet --start-date 2022-08-02 + gh actions-importer forecast gitlab --output-dir tmp/forecast --namespace actions-importer --start-date 2022-08-02 ``` 3. The command will list all the files written to disk when the command succeeds. diff --git a/gitlab/4-dry-run.md b/gitlab/4-dry-run.md index e29b84a..4398fd8 100644 --- a/gitlab/4-dry-run.md +++ b/gitlab/4-dry-run.md @@ -16,10 +16,10 @@ You will be performing a dry run against a pipeline in your preconfigured GitLab - __basic-pipeline-example__ 2. What is the namespace for that project? - - __Valet__ + - __actions-importer__ 3. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -27,20 +27,20 @@ You will be performing a dry run against a pipeline in your preconfigured GitLab 2. Run the following command from the root directory: ```bash - gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace valet --project basic-pipeline-example + gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace actions-importer --project basic-pipeline-example ``` 3. The command will list all the files written to disk when the command succeeds. ```console - $ gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace valet --project basic-pipeline-example - [2022-09-28 19:59:55] Logs: 'tmp/dry-run/log/valet-20220928-195955.log' + $ gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace actions-importer --project basic-pipeline-example + [2022-09-28 19:59:55] Logs: 'tmp/dry-run/log/actions-importer-20220928-195955.log' [2022-09-28 19:59:56] Output file(s): - [2022-09-28 19:59:56] tmp/dry-run/valet/basic-pipeline-example/.github/workflows/basic-pipeline-example.yml + [2022-09-28 19:59:56] tmp/dry-run/actions-importer/basic-pipeline-example/.github/workflows/basic-pipeline-example.yml ``` 4. View the converted workflow: - - Find `tmp/dry-run/valet/basic-pipeline-example/.github/workflows` in the file explorer pane in your codespace. + - Find `tmp/dry-run/actions-importer/basic-pipeline-example/.github/workflows` in the file explorer pane in your codespace. - Click `basic-pipeline-example.yml` to open. ## Inspect the output files @@ -105,7 +105,7 @@ deploy_b: Converted workflow πŸ‘‡ ```yaml -name: valet/basic-pipeline-example +name: actions-importer/basic-pipeline-example on: push: workflow_dispatch: @@ -219,13 +219,13 @@ include: Run the following command from the root directory: ```bash -gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace valet --project included-files-example +gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace actions-importer --project included-files-example ``` The output of the command above can be seen below: ```yaml -name: valet/included-files-example +name: actions-importer/included-files-example on: push: pull_request: @@ -257,10 +257,10 @@ jobs: - run: echo "this is from a local file" ``` -It's important to note that Valet converted this into a single workflow without templates. This is because of fundamental differences in how GitLab templates and GitHub Actions templates (i.e. Reusable Workflows and Composite Actions) function in regards to job ordering. Unfortunately, elements of reusability will be sacrificed in order for the converted pipelines to function the same. It is likely that the output of Valet could be refactored to use [reusable workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows) at a later date. +It's important to note that GitHub Actions Importer converted this into a single workflow without templates. This is because of fundamental differences in how GitLab templates and GitHub Actions templates (i.e. Reusable Workflows and Composite Actions) function in regards to job ordering. Unfortunately, elements of reusability will be sacrificed in order for the converted pipelines to function the same. It is likely that the output of GitHub Actions Importer could be refactored to use [reusable workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows) at a later date. As an added challenge, try constructing and running the `dry-run` command yourself. Hint, you should only have to change the project name. ## Next lab -[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) +[Use custom transformers to customize GitHub Actions Importer's behavior](./5-custom-transformers.md) diff --git a/gitlab/5-custom-transformers.md b/gitlab/5-custom-transformers.md index 188b494..0341f11 100644 --- a/gitlab/5-custom-transformers.md +++ b/gitlab/5-custom-transformers.md @@ -1,6 +1,6 @@ -# Using custom transformers to customize Valet's behavior +# Using custom transformers to customize GitHub Actions Importer's behavior -In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override GitHub Actions Importer's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -18,7 +18,7 @@ In this lab you will build upon the `dry-run` command to override Valet's defaul You will be performing a `dry-run` command to inspect the workflow that is converted by default. Run the following command within the codespace terminal: ```bash -gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace valet --project terraform-example +gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace actions-importer --project terraform-example ``` The converted workflow that is generated by the above command can be seen below: @@ -27,7 +27,7 @@ The converted workflow that is generated by the above command can be seen below: Converted workflow πŸ‘‡ ```yaml -name: valet/custom-transformer +name: actions-importer/custom-transformer on: push: workflow_dispatch: @@ -87,16 +87,16 @@ transform "artifacts.terraform" do |item| end ``` -The `transform` method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in GitLab. +The `transform` method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. GitHub Actions Importer will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in GitLab. Now, we can perform a `dry-run` command with the `--custom-transformers` CLI option. The output of the `dry-run` command should look similar to this: ```console -$ gh actions-importer dry-run gitlab --output-dir tmp --namespace valet --project terraform-example --custom-transformers transformers.rb -[2022-09-28 20:29:41] Logs: 'tmp/log/valet-20220928-202941.log' +$ gh actions-importer dry-run gitlab --output-dir tmp --namespace actions-importer --project terraform-example --custom-transformers transformers.rb +[2022-09-28 20:29:41] Logs: 'tmp/log/actions-importer-20220928-202941.log' This is the item: $PLAN_JSON [2022-09-28 20:29:43] Output file(s): -[2022-09-28 20:29:43] tmp/valet/terraform-example/.github/workflows/terraform-example.yml +[2022-09-28 20:29:43] tmp/actions-importer/terraform-example/.github/workflows/terraform-example.yml ``` Now that you know the data structure of `item`, you can access the file path programmatically by editing the custom transformer to the following: @@ -115,7 +115,7 @@ end Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: ```bash -gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace valet --project terraform-example --custom-transformers transformers.rb +gh actions-importer dry-run gitlab --output-dir tmp/dry-run --namespace actions-importer --project terraform-example --custom-transformers transformers.rb ``` The converted workflow that is generated by the above command will now use the custom logic for the `artifacts.terraform` step. @@ -196,7 +196,7 @@ At this point, the file contents of `transformers.rb` should match this: -That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden GitHub Actions Importer's default behavior by customizing the conversion of: - Unknown steps - Environment variables diff --git a/gitlab/6-migrate.md b/gitlab/6-migrate.md index 90da821..83ecddf 100644 --- a/gitlab/6-migrate.md +++ b/gitlab/6-migrate.md @@ -15,7 +15,7 @@ Answer the following questions before running a `migrate` command: 1. What project do you want to migrate? - __rails-example__ 2. What is the namespace for that project? - - __Valet__ + - __actions-importer__ 3. Where do you want to store the logs? - __tmp/migrate__ 4. What is the URL for the GitHub repository to add the workflow to? @@ -26,7 +26,7 @@ Answer the following questions before running a `migrate` command: 1. Run the following `migrate` command in the codespace terminal: ```bash - gh actions-importer migrate gitlab --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --namespace valet --project rails-example + gh actions-importer migrate gitlab --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --namespace actions-importer --project rails-example ``` 2. The command will write the URL to the pull request that was created when the command succeeds. @@ -49,4 +49,4 @@ At this point, the migration has completed and you have successfully migrated a ### Next Lab -This concludes all labs for migrating GitLab pipelines to Actions with Valet! +This concludes all labs for migrating GitLab pipelines to Actions with GitHub Actions Importer! diff --git a/gitlab/readme.md b/gitlab/readme.md index abeda45..3477269 100644 --- a/gitlab/readme.md +++ b/gitlab/readme.md @@ -1,12 +1,12 @@ -# GitLab to Actions migrations powered by Valet +# GitLab to Actions migrations powered by GitHub Actions Importer -These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs that demonstrate how to use Valet to migrate GitLab pipelines to GitHub Actions. +These instructions will guide you through configuring the GitHub Codespaces environment that will be used in these labs that demonstrate how to use GitHub Actions Importer to migrate GitLab pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -- Ensure that you have created a repository using [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +- Ensure that you have created a repository using [actions/importer-labs](https://github.com/actions/importer-labs) as a template. ## Configure your codespace @@ -17,7 +17,7 @@ These steps **must** be completed prior to starting other labs. - Click `Create codespaces on main` to create the codespace. - After the codespace has initialized there will be a terminal present. -2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). +2. Verify the GitHub Actions Importer CLI is installed and working. More information on the GitHub Actions Importer extension for the official GitHub CLI can be found [here](https://github.com/github/gh-actions-importer). - Run the following command in the codespace terminal: @@ -30,11 +30,11 @@ These steps **must** be completed prior to starting other labs. ```console $ gh actions-importer version gh version 2.14.3 (2022-07-26) - gh actions-importer github/gh-valet v0.1.12 - valet-cli unknown + gh actions-importer github/gh-actions-importer v0.1.12 + actions-importer/cli unknown ``` - - If `gh actions-importer version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh actions-importer version` did not produce similar output, please refer to the troubleshooting [guide](#troubleshoot-the-actions-importer/cli). ## Bootstrap a GitLab server @@ -53,43 +53,43 @@ These steps **must** be completed prior to starting other labs. 2. Open the GitLab server in your browser and use the following credentials to authenticate: - Username: `root` - - Password: `valet-labs!` + - Password: `actions-importer-labs!` -3. Once authenticated, you should see a GitLab server with a few predefined pipelines in the `valet` group. +3. Once authenticated, you should see a GitLab server with a few predefined pipelines in the `actions-importer` group. ## Labs for GitLab -Perform the following labs to learn more about Actions migrations with Valet: +Perform the following labs to learn more about Actions migrations with GitHub Actions Importer: -1. [Configure credentials for Valet](1-configure.md) +1. [Configure credentials for GitHub Actions Importer](1-configure.md) 2. [Perform an audit on GitLab pipelines](2-audit.md) 3. [Forecast potential build runner usage](3-forecast.md) 4. [Perform a dry-run migration of a GitLab pipeline](4-dry-run.md) -5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +5. [Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) 6. [Perform a production migration of a GitLab pipeline](6-migrate.md) -## Troubleshoot the Valet CLI +## Troubleshoot the GitHub Actions Importer CLI -The CLI extension for Valet can be manually installed by following these steps: +The CLI extension for GitHub Actions Importer can be manually installed by following these steps: - Verify you are in the codespace terminal - Run this command from within the codespace terminal: ```bash - gh extension install github/gh-valet + gh extension install github/gh-actions-importer ``` - Verify the result of the install contains: ```console - $ gh extension install github/gh-valet - βœ“ Installed extension github/gh-valet + $ gh extension install github/gh-actions-importer + βœ“ Installed extension github/gh-actions-importer ``` - If you get an error similar to the image below, click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: +- Verify GitHub Actions Importer CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh actions-importer version diff --git a/jenkins/1-configure.md b/jenkins/1-configure.md index 74ba219..0fb08bb 100644 --- a/jenkins/1-configure.md +++ b/jenkins/1-configure.md @@ -1,6 +1,6 @@ -# Configure credentials for Valet +# Configure credentials for GitHub Actions Importer -In this lab, you will use the `configure` CLI command to set the required credentials and information for Valet to use when working with Jenkins and GitHub. +In this lab, you will use the `configure` CLI command to set the required credentials and information for GitHub Actions Importer to use when working with Jenkins and GitHub. You will need to complete all of the setup instructions [here](./readme.md#configure-your-codespace) prior to performing this lab. @@ -58,7 +58,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi ## Verify your environment -To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify your environment is configured correctly, run the `update` CLI command. The `update` CLI command will download the latest version of GitHub Actions Importer to your codespace. 1. In the codespace terminal run the following command: @@ -66,12 +66,12 @@ To verify your environment is configured correctly, run the `update` CLI command gh actions-importer update ``` -2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. +2. You should see a confirmation that you were logged into the GitHub Container Registry and the image was updated to the latest version. ```console $ gh actions-importer update Login Succeeded - latest: Pulling from valet-customers/valet-cli + latest: Pulling from actions-importer/cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb Status: Image is up to date for ghcr.io/actions-importer/cli:latest ghcr.io/actions-importer/cli:latest @@ -79,4 +79,4 @@ To verify your environment is configured correctly, run the `update` CLI command ### Next lab -[Perform an audit of a Jenkins server](2-audit.md#perform-an-audit-of-a-jenkins-server) +[Perform an audit of a Jenkins server](2-audit.md) diff --git a/jenkins/2-audit.md b/jenkins/2-audit.md index ff0d63c..fc5cf40 100644 --- a/jenkins/2-audit.md +++ b/jenkins/2-audit.md @@ -3,9 +3,10 @@ In this lab, you will use the `audit` command to get a high-level view of all pipelines in a Jenkins server. The `audit` command will perform the following steps: + 1. Fetch all of the projects defined in a Jenkins server. 2. Convert each pipeline to their equivalent GitHub Actions workflow. -3. Generate a report that summarizes how complete and complex of a migration is possible with Valet. +3. Generate a report that summarizes how complete and complex of a migration is possible with GitHub Actions Importer. ## Prerequisites @@ -20,7 +21,7 @@ You will be performing an audit against your preconfigured Jenkins server. Answe - In this example you will audit the entire Jenkins instance, but in the future if you wanted to configure a specific folder to be audited add the `-f ` flag to the `audit` command. 2. Where do you want to store the result? - - __tmp/audit__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/audit__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -35,7 +36,7 @@ You will be performing an audit against your preconfigured Jenkins server. Answe ```console $ gh actions-importer audit jenkins --output-dir tmp/audit - [2022-08-20 22:08:20] Logs: 'tmp/audit/log/valet-20220916-015817.log' + [2022-08-20 22:08:20] Logs: 'tmp/audit/log/actions-importer-20220916-015817.log' [2022-08-20 22:08:20] Auditing 'http://localhost:8080/' [2022-08-20 22:08:20] Output file(s):==========================================| [2022-09-28 20:08:48] tmp/audit/demo_pipeline/.github/workflows/demo_pipeline.yml @@ -70,7 +71,7 @@ The audit summary, logs, config files, jenkinsfiles, and transformed workflows w #### Pipelines -The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: +The pipeline summary section contains high level statistics regarding the conversion rate done by GitHub Actions Importer: ```md ## Pipelines @@ -99,20 +100,20 @@ Here are some key terms in the β€œPipelines” section in the above example: - __Successful__ pipelines had 100% of the pipeline constructs and individual items converted automatically to their GitHub Actions equivalent. - __Partially successful__ pipelines had all of the pipeline constructs converted, however, there were some individual items (e.g. build tasks or build triggers) that were not converted automatically to their GitHub Actions equivalent. -- __Unsupported__ pipelines are definition types that are not supported by Valet. The following Jenkins pipeline types are supported: +- __Unsupported__ pipelines are definition types that are not supported by GitHub Actions Importer. The following Jenkins pipeline types are supported: - Flow Definition - Project (declarative Jenkinsfile pipelines) - Multibranch Project - __Failed__ pipelines encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in Jenkins. - - Valet encountered an internal error when converting it. + - GitHub Actions Importer encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. -The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by Valet. +The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by GitHub Actions Importer. #### Build steps -The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. +The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by GitHub Actions Importer. ```md ### Build steps @@ -159,7 +160,7 @@ There is an equivalent breakdown of build triggers, environment variables, and o #### Manual Tasks -The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. +The manual tasks summary section presents an overview of the manual tasks that you will need to perform that GitHub Actions Importer is not able to complete automatically. ```md ### Manual tasks @@ -265,6 +266,7 @@ Each pipeline will have a variety of files written that include: ``` The contents of this file can be useful in answering questions similar to the following: + - What workflows will depend on which actions? - What workflows use an action that must go through a security review? - What workflows use specific secrets? diff --git a/jenkins/3-forecast.md b/jenkins/3-forecast.md index 26c856f..3183079 100644 --- a/jenkins/3-forecast.md +++ b/jenkins/3-forecast.md @@ -33,7 +33,7 @@ Answer the following questions before running the `forecast` command: ```console $ gh actions-importer forecast jenkins --output-dir tmp/forecast --start-date 2022-08-02 - [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/valet-20220916-021004.log' + [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/actions-importer-20220916-021004.log' [2022-08-20 22:08:20] Forecasting 'http://localhost:8080/' [2022-08-20 22:08:20] Output file(s): [2022-08-20 22:08:20] tmp/forecast/jobs/09-16-2022-02-10_jobs_0.json diff --git a/jenkins/4-dry-run.md b/jenkins/4-dry-run.md index e6a53ae..56f42c8 100644 --- a/jenkins/4-dry-run.md +++ b/jenkins/4-dry-run.md @@ -19,7 +19,7 @@ You will be performing a dry run against a pipeline in your preconfigured Jenkin - ____ 3. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory from which Valet commands are executed. + - __tmp/dry-run__. This can be any path within the working directory from which GitHub Actions Importer commands are executed. ### Steps @@ -34,7 +34,7 @@ You will be performing a dry run against a pipeline in your preconfigured Jenkin ```console $ gh actions-importer dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run - [2022-09-28 20:12:00] Logs: 'tmp/dry-run/log/valet-20220928-201200.log' + [2022-09-28 20:12:00] Logs: 'tmp/dry-run/log/actions-importer-20220928-201200.log' [2022-09-28 20:12:00] Output file(s): [2022-09-28 20:12:00] tmp/dry-run/test_pipeline/.github/workflows/test_pipeline.yml ``` @@ -140,10 +140,10 @@ These two pipelines function equivalently despite using different syntax. In thi + # value: 80 ``` -In the next lab, you'll learn how to override Valet's default behavior and customize the converted workflow that is generated. +In the next lab, you'll learn how to override GitHub Actions Importer's default behavior and customize the converted workflow that is generated. Try running the `dry-run` command for different pipelines in the Jenkins server. As a hint, you only have to change the `--source-url` CLI option. ## Next lab -[Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +[Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) diff --git a/jenkins/5-custom-transformers.md b/jenkins/5-custom-transformers.md index 6545dac..6d655d7 100644 --- a/jenkins/5-custom-transformers.md +++ b/jenkins/5-custom-transformers.md @@ -1,6 +1,6 @@ -# Use custom transformers to customize Valet's behavior +# Use custom transformers to customize GitHub Actions Importer's behavior -In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override GitHub Actions Importer's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -109,7 +109,7 @@ transform "sleep" do |item| end ``` -This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Jenkins. +This method can use any valid ruby syntax and should return a `Hash` that represents the YAML that should be generated for a given step. GitHub Actions Importer will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Jenkins. Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: @@ -133,7 +133,7 @@ Open the workflow that is generated and inspect the contents. Now the `sleep` st ## Custom transformers for a known step -You can also override Valet's default behavior. In this scenario, you may not want to use the third-party action for publishing junit test results that is used by default. Again, answer the following questions before writing a custom transformer: +You can also override GitHub Actions Importer's default behavior. In this scenario, you may not want to use the third-party action for publishing junit test results that is used by default. Again, answer the following questions before writing a custom transformer: 1. What is the "identifier" of the step to customize? - __junit__ @@ -162,7 +162,7 @@ Now, we can perform another `dry-run` command with the `--custom-transformers` C ```console $ gh actions-importer dry-run jenkins --source-url http://localhost:8080/job/test_pipeline --output-dir tmp/dry-run --custom-transformers transformers.rb -[2022-08-20 22:08:20] Logs: 'tmp/dry-run/log/valet-20220916-022628.log' +[2022-08-20 22:08:20] Logs: 'tmp/dry-run/log/actions-importer-20220916-022628.log' This is the item: {"name"=>"junit", "arguments"=>[{"key"=>"testResults", "value"=>{"isLiteral"=>true, "value"=>"**/target/*.xml"}}]} [2022-08-20 22:08:20] Output file(s): [2022-08-20 22:08:20] tmp/dry-run/test_pipeline/.github/workflows/test_pipeline.yml @@ -287,7 +287,7 @@ At this point the file contents of `transformers.rb` should match this: -That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden GitHub Actions Importer's default behavior by customizing the conversion of: - Unknown steps - Known steps diff --git a/jenkins/6-migrate.md b/jenkins/6-migrate.md index 9fcd142..8572d47 100644 --- a/jenkins/6-migrate.md +++ b/jenkins/6-migrate.md @@ -31,7 +31,7 @@ Answer the following questions before running a `migrate` command: ```console $ gh actions-importer migrate jenkins --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --source-url http://localhost:8080/job/monas_dev_work/job/monas_freestyle - [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/valet-20220916-014033.log' + [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log' [2022-08-20 22:08:20] Pull request: 'https://github.com/:owner/:repo/pull/1' ``` @@ -53,4 +53,4 @@ At this point, the migration has completed and you have successfully migrated a ### Next lab -This concludes all labs for migrating Jenkins pipelines to Actions with Valet! +This concludes all labs for migrating Jenkins pipelines to Actions with GitHub Actions Importer! diff --git a/jenkins/bootstrap/pipelines/test_freestyle_project/config.xml b/jenkins/bootstrap/pipelines/test_freestyle_project/config.xml index b2b7cab..a3a6c24 100644 --- a/jenkins/bootstrap/pipelines/test_freestyle_project/config.xml +++ b/jenkins/bootstrap/pipelines/test_freestyle_project/config.xml @@ -19,7 +19,7 @@ false - echo "hello valet!" + echo "hello GitHub Actions Importer!" sleep 70 diff --git a/jenkins/bootstrap/setup.sh b/jenkins/bootstrap/setup.sh index e843745..7efe6d2 100755 --- a/jenkins/bootstrap/setup.sh +++ b/jenkins/bootstrap/setup.sh @@ -1,6 +1,6 @@ #!/bin/bash -container_name="valet" +container_name="actions-importer" username="admin" password="password" diff --git a/jenkins/readme.md b/jenkins/readme.md index 84d87a4..1757b30 100644 --- a/jenkins/readme.md +++ b/jenkins/readme.md @@ -1,12 +1,12 @@ -# Jenkins to Actions migrations powered by Valet +# Jenkins to Actions migrations powered by GitHub Actions Importer -These instructions will guide you through configuring a GitHub Codespaces environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Jenkins pipelines to GitHub Actions. +These instructions will guide you through configuring a GitHub Codespaces environment that will be used in subsequent labs that demonstrate how to use GitHub Actions Importer to migrate Jenkins pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +1. Ensure that you have created a repository using the [actions/importer-labs](https://github.com/actions/importer-labs) as a template. ## Configure your codespace @@ -17,7 +17,7 @@ These steps **must** be completed prior to starting other labs. - Click `Create codespaces on main` to create the codespace. - After the codespace has initialized there will be a terminal present. -2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). +2. Verify the GitHub Actions Importer CLI is installed and working. More information on the GitHub Actions Importer extension for the official GitHub CLI can be found [here](https://github.com/github/gh-actions-importer). - Run the following command in the codespace's terminal: @@ -30,11 +30,11 @@ These steps **must** be completed prior to starting other labs. ```console $ gh actions-importer version gh version 2.14.3 (2022-07-26) - gh actions-importer github/gh-valet v0.1.12 - valet-cli unknown + gh actions-importer github/gh-actions-importer v0.1.12 + actions-importer/cli unknown ``` - - If `gh actions-importer version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh actions-importer version` did not produce similar output, refer to the troubleshooting [guide](#troubleshoot-the-actions-importer/cli). ## Bootstrap a Jenkins server @@ -59,37 +59,37 @@ These steps **must** be completed prior to starting other labs. ## Labs for Jenkins -Perform the following labs to learn more about Actions migrations with Valet: +Perform the following labs to learn more about Actions migrations with GitHub Actions Importer: -1. [Configure credentials for Valet](1-configure.md) +1. [Configure credentials for GitHub Actions Importer](1-configure.md) 2. [Perform an audit of a Jenkins server](2-audit.md) 3. [Forecast potential build runner usage](3-forecast.md) 4. [Perform a dry-run migration of a Jenkins pipeline](4-dry-run.md) -5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +5. [Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) 6. [Perform a production migration of a Jenkins pipeline](6-migrate.md) -## Troubleshoot the Valet CLI +## Troubleshoot the GitHub Actions Importer CLI -The CLI extension for Valet can be manually installed by following these steps: +The CLI extension for GitHub Actions Importer can be manually installed by following these steps: - Verify you are in the codespace terminal - Run this command from within the codespace terminal: ```bash - gh extension install github/gh-valet + gh extension install github/gh-actions-importer ``` - Verify the result of the install contains: ```console - $ gh extension install github/gh-valet - βœ“ Installed extension github/gh-valet + $ gh extension install github/gh-actions-importer + βœ“ Installed extension github/gh-actions-importer ``` - If you get an error similar to the image below, then click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace terminal: +- Verify GitHub Actions Importer CLI extension is installed and working by running the following command from the codespace terminal: ```bash gh actions-importer version @@ -100,9 +100,9 @@ The CLI extension for Valet can be manually installed by following these steps: Follow these steps if the Jenkins server does not start correctly after running the setup script: 1. On the left side of the codespace, navigate to the `Docker` tab. -2. Under the `Containers` tab you should see a docker container named `jenkins:valet` listed with a green play button β–Ά +2. Under the `Containers` tab you should see a docker container named `jenkins:actions-importer` listed with a green play button β–Ά -- If you see the `jenkins:valet` container, but it has a red stopped symbol next to it β–’, right-click the container and click `start`. The container should begin running again. -- If the container does not start even after trying to start it manually, right-click the `jenkins:valet` container and click the `remove` button. Then, attempt to start the Jenkins server again by following the steps [here](#bootstrap-a-jenkins-server). +- If you see the `jenkins:actions-importer` container, but it has a red stopped symbol next to it β–’, right-click the container and click `start`. The container should begin running again. +- If the container does not start even after trying to start it manually, right-click the `jenkins:actions-importer` container and click the `remove` button. Then, attempt to start the Jenkins server again by following the steps [here](#bootstrap-a-jenkins-server). ![img](https://user-images.githubusercontent.com/19557880/183770210-c0386616-656e-4fe9-9324-b410ad62c406.png) diff --git a/travis/1-configure.md b/travis/1-configure.md index 4674749..c0de57b 100644 --- a/travis/1-configure.md +++ b/travis/1-configure.md @@ -1,6 +1,6 @@ -# Configure credentials for Valet +# Configure credentials for GitHub Actions Importer -In this lab, you will use the `configure` CLI command to set the required credentials and information for Valet to use when working with Travis CI and GitHub. +In this lab, you will use the `configure` CLI command to set the required credentials and information for GitHub Actions Importer to use when working with Travis CI and GitHub. You will need to complete all of the setup instructions [here](./readme.md#configure-your-codespace) prior to performing this lab. @@ -34,7 +34,7 @@ You will need to complete all of the setup instructions [here](./readme.md#confi - At the GitHub URL prompt, enter the GitHub instance URL or press enter to accept the default value (`https://github.com`). - At the Travis CI token prompt, enter the Travis CI access token from step 2 and press enter. - At the Travis CI base url prompt, hit enter to accept the default value (`https://travis-ci.com`). - - At the Travis CI organization name, enter `valet-labs`. + - At the Travis CI organization name, enter `actions-importer-labs`. ```console $ gh actions-importer configure @@ -46,13 +46,13 @@ You will need to complete all of the setup instructions [here](./readme.md#confi βœ” Base url of the GitHub instance: https://github.com βœ” Personal access token for Travis CI: *************** βœ” Base url of the Travis CI instance: https://travis-ci.com - βœ” Travis CI organization name: valet-labs + βœ” Travis CI organization name: actions-importer-labs Environment variables successfully updated. ``` ## Verify your environment -To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of Valet to your codespace. +To verify our environment is configured correctly, we are going to run the `update` CLI command. The `update` CLI command will download the latest version of GitHub Actions Importer to your codespace. 1. In the codespace terminal run the following command: @@ -60,12 +60,12 @@ To verify our environment is configured correctly, we are going to run the `upda gh actions-importer update ``` -2. You should see a confirmation that you were logged into the GitHub Container Registry and Valet was updated to the latest version. +2. You should see a confirmation that you were logged into the GitHub Container Registry and the image was updated to the latest version. ```console $ gh actions-importer update Login Succeeded - latest: Pulling from valet-customers/valet-cli + latest: Pulling from actions-importer/cli Digest: sha256:a7d00dee8a37e25da59daeed44b1543f476b00fa2c41c47f48deeaf34a215bbb Status: Image is up to date for ghcr.io/actions-importer/cli:latest ghcr.io/actions-importer/cli:latest diff --git a/travis/2-audit.md b/travis/2-audit.md index 92f2943..a927e5f 100644 --- a/travis/2-audit.md +++ b/travis/2-audit.md @@ -6,19 +6,19 @@ The `audit` command operates by performing the following: - Fetching all of the projects defined in a Travis CI organization. - Converting each to their equivalent GitHub Actions workflow. -- Generating a report that summarizes how complete and complex of a migration is possible with Valet. +- Generating a report that summarizes how complete and complex of a migration is possible with GitHub Actions Importer. ## Prerequisites 1. Followed the steps [here](./readme.md#configure-your-codespace) to set up your Codespace environment. -2. Completed the [configure lab](./1-configure.md#configure-credentials-for-valet). +2. Completed the [configure lab](./1-configure.md). ## Perform an audit -You will be performing an audit against the **valet-labs** Travis CI organization that was created for the purposes of this lab. Your environment was configured to use this organization during the [configure lab](./1-configure.md). The remaining information needed to perform an `audit` is: +You will be performing an audit against the **actions-importer-labs** Travis CI organization that was created for the purposes of this lab. Your environment was configured to use this organization during the [configure lab](./1-configure.md). The remaining information needed to perform an `audit` is: 1. Where do we want to store the result? - - **tmp/audit**. This can be any path within the working directory that Valet commands are executed from. + - **tmp/audit**. This can be any path within the working directory that GitHub Actions Importer commands are executed from. ### Steps @@ -41,14 +41,14 @@ You will be performing an audit against the **valet-labs** Travis CI organizatio #### Pipelines -The pipeline summary section contains high level statistics regarding the conversion rate done by Valet: +The pipeline summary section contains high level statistics regarding the conversion rate done by GitHub Actions Importer: ```md # Audit summary -Summary for [Travis CI instance](https://travis-ci.com/valet-labs) +Summary for [Travis CI instance](https://travis-ci.com/actions-importer-labs) -- Valet version: **0.1.0.13539 (5bb6c723d6db3688ea0653e14bbf3c63df445bfc)** +- GitHub Actions Importer version: **0.1.0.13539 (5bb6c723d6db3688ea0653e14bbf3c63df445bfc)** - Performed at: **9/16/22 at 20:01** ## Pipelines @@ -160,35 +160,35 @@ Secrets: **1** ### Partially successful -#### valet-labs/travisci-php-example +#### actions-importer-labs/travisci-php-example -- [valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml](valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml) -- [valet-labs/travisci-php-example/config.json](valet-labs/travisci-php-example/config.json) -- [valet-labs/travisci-php-example/source.yml](valet-labs/travisci-php-example/source.yml) +- [actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml](actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml) +- [actions-importer-labs/travisci-php-example/config.json](actions-importer-labs/travisci-php-example/config.json) +- [actions-importer-labs/travisci-php-example/source.yml](actions-importer-labs/travisci-php-example/source.yml) -#### valet-labs/travisci-nodejs-example +#### actions-importer-labs/travisci-nodejs-example -- [valet-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml](valet-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml) -- [valet-labs/travisci-nodejs-example/config.json](valet-labs/travisci-nodejs-example/config.json) -- [valet-labs/travisci-nodejs-example/source.yml](valet-labs/travisci-nodejs-example/source.yml) +- [actions-importer-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml](actions-importer-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml) +- [actions-importer-labs/travisci-nodejs-example/config.json](actions-importer-labs/travisci-nodejs-example/config.json) +- [actions-importer-labs/travisci-nodejs-example/source.yml](actions-importer-labs/travisci-nodejs-example/source.yml) -#### valet-labs/travisci-ruby-example +#### actions-importer-labs/travisci-ruby-example -- [valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml](valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml) -- [valet-labs/travisci-ruby-example/config.json](valet-labs/travisci-ruby-example/config.json) -- [valet-labs/travisci-ruby-example/source.yml](valet-labs/travisci-ruby-example/source.yml) +- [actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml](actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml) +- [actions-importer-labs/travisci-ruby-example/config.json](actions-importer-labs/travisci-ruby-example/config.json) +- [actions-importer-labs/travisci-ruby-example/source.yml](actions-importer-labs/travisci-ruby-example/source.yml) -#### valet-labs/travisci-python-example +#### actions-importer-labs/travisci-python-example -- [valet-labs/travisci-python-example/.github/workflows/travisci-python-example.yml](valet-labs/travisci-python-example/.github/workflows/travisci-python-example.yml) -- [valet-labs/travisci-python-example/config.json](valet-labs/travisci-python-example/config.json) -- [valet-labs/travisci-python-example/source.yml](valet-labs/travisci-python-example/source.yml) +- [actions-importer-labs/travisci-python-example/.github/workflows/travisci-python-example.yml](actions-importer-labs/travisci-python-example/.github/workflows/travisci-python-example.yml) +- [actions-importer-labs/travisci-python-example/config.json](actions-importer-labs/travisci-python-example/config.json) +- [actions-importer-labs/travisci-python-example/source.yml](actions-importer-labs/travisci-python-example/source.yml) -#### valet-labs/travisci-deploy-example +#### actions-importer-labs/travisci-deploy-example -- [valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml](valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml) -- [valet-labs/travisci-deploy-example/config.json](valet-labs/travisci-deploy-example/config.json) -- [valet-labs/travisci-deploy-example/source.yml](valet-labs/travisci-deploy-example/source.yml) +- [actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml](actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml) +- [actions-importer-labs/travisci-deploy-example/config.json](actions-importer-labs/travisci-deploy-example/config.json) +- [actions-importer-labs/travisci-deploy-example/source.yml](actions-importer-labs/travisci-deploy-example/source.yml) ``` Here are some key terms that can appear in the β€œPipelines” section: @@ -197,14 +197,14 @@ Here are some key terms that can appear in the β€œPipelines” section: - **Partially successful** pipelines had 100% of all of the pipeline constructs converted, however, there were some individual items that were not converted automatically to their GitHub Actions equivalent. - **Failed pipelines** encountered a fatal error when being converted. This can occur for one of three reasons: - The pipeline was misconfigured and not valid in Travis CI. - - Valet encountered an internal error when converting it. + - GitHub Actions Importer encountered an internal error when converting it. - There was an unsuccessful network response, often due to invalid credentials, that caused the pipeline to be inaccessible. -The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by Valet. +The "Job types" section will summarize which types of pipelines are being used and which are supported or unsupported by GitHub Actions Importer. #### Build steps -The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by Valet. +The build steps summary section presents an overview of the individual build steps that are used across all pipelines and how many were automatically converted by GitHub Actions Importer. ```md Total: **25** @@ -254,7 +254,7 @@ There is an equivalent breakdown of build triggers, environment variables, and o #### Manual Tasks -The manual tasks summary section presents an overview of the manual tasks that you will need to perform that Valet is not able to complete automatically. +The manual tasks summary section presents an overview of the manual tasks that you will need to perform that GitHub Actions Importer is not able to complete automatically. ```md ### Manual tasks @@ -278,35 +278,35 @@ The final section of the audit report provides a manifest of all of the files th ```md ### Partially successful -#### valet-labs/travisci-php-example +#### actions-importer-labs/travisci-php-example -- [valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml](valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml) -- [valet-labs/travisci-php-example/config.json](valet-labs/travisci-php-example/config.json) -- [valet-labs/travisci-php-example/source.yml](valet-labs/travisci-php-example/source.yml) +- [actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml](actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml) +- [actions-importer-labs/travisci-php-example/config.json](actions-importer-labs/travisci-php-example/config.json) +- [actions-importer-labs/travisci-php-example/source.yml](actions-importer-labs/travisci-php-example/source.yml) -#### valet-labs/travisci-nodejs-example +#### actions-importer-labs/travisci-nodejs-example -- [valet-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml](valet-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml) -- [valet-labs/travisci-nodejs-example/config.json](valet-labs/travisci-nodejs-example/config.json) -- [valet-labs/travisci-nodejs-example/source.yml](valet-labs/travisci-nodejs-example/source.yml) +- [actions-importer-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml](actions-importer-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml) +- [actions-importer-labs/travisci-nodejs-example/config.json](actions-importer-labs/travisci-nodejs-example/config.json) +- [actions-importer-labs/travisci-nodejs-example/source.yml](actions-importer-labs/travisci-nodejs-example/source.yml) -#### valet-labs/travisci-ruby-example +#### actions-importer-labs/travisci-ruby-example -- [valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml](valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml) -- [valet-labs/travisci-ruby-example/config.json](valet-labs/travisci-ruby-example/config.json) -- [valet-labs/travisci-ruby-example/source.yml](valet-labs/travisci-ruby-example/source.yml) +- [actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml](actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml) +- [actions-importer-labs/travisci-ruby-example/config.json](actions-importer-labs/travisci-ruby-example/config.json) +- [actions-importer-labs/travisci-ruby-example/source.yml](actions-importer-labs/travisci-ruby-example/source.yml) -#### valet-labs/travisci-python-example +#### actions-importer-labs/travisci-python-example -- [valet-labs/travisci-python-example/.github/workflows/travisci-python-example.yml](valet-labs/travisci-python-example/.github/workflows/travisci-python-example.yml) -- [valet-labs/travisci-python-example/config.json](valet-labs/travisci-python-example/config.json) -- [valet-labs/travisci-python-example/source.yml](valet-labs/travisci-python-example/source.yml) +- [actions-importer-labs/travisci-python-example/.github/workflows/travisci-python-example.yml](actions-importer-labs/travisci-python-example/.github/workflows/travisci-python-example.yml) +- [actions-importer-labs/travisci-python-example/config.json](actions-importer-labs/travisci-python-example/config.json) +- [actions-importer-labs/travisci-python-example/source.yml](actions-importer-labs/travisci-python-example/source.yml) -#### valet-labs/travisci-deploy-example +#### actions-importer-labs/travisci-deploy-example -- [valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml](valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml) -- [valet-labs/travisci-deploy-example/config.json](valet-labs/travisci-deploy-example/config.json) -- [valet-labs/travisci-deploy-example/source.yml](valet-labs/travisci-deploy-example/source.yml) +- [actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml](actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml) +- [actions-importer-labs/travisci-deploy-example/config.json](actions-importer-labs/travisci-deploy-example/config.json) +- [actions-importer-labs/travisci-deploy-example/source.yml](actions-importer-labs/travisci-deploy-example/source.yml) ``` Each pipeline will have a variety of files written that include: @@ -323,23 +323,24 @@ Each pipeline will have a variety of files written that include: ```csv Pipeline,Action,File path - valet-labs/travisci-php-example,actions/checkout@v2,tmp/audit/valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml - valet-labs/travisci-php-example,shivammathur/setup-php@v2,tmp/audit/valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml - valet-labs/travisci-php-example,rectalogic/notify-irc@v1,tmp/audit/valet-labs/travisci-php-example/.github/workflows/travisci-php-example.yml - valet-labs/travisci-nodejs-example,actions/checkout@v2,tmp/audit/valet-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml - valet-labs/travisci-ruby-example,actions/checkout@v2,tmp/audit/valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml - valet-labs/travisci-ruby-example,ruby/setup-ruby@v1,tmp/audit/valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml - valet-labs/travisci-python-example,actions/checkout@v2,tmp/audit/valet-labs/travisci-python-example/.github/workflows/travisci-python-example.yml - valet-labs/travisci-deploy-example,actions/checkout@v2,tmp/audit/valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml - valet-labs/travisci-deploy-example,desiderati/github-action-pushover@v1,tmp/audit/valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml + actions-importer-labs/travisci-php-example,actions/checkout@v2,tmp/audit/actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml + actions-importer-labs/travisci-php-example,shivammathur/setup-php@v2,tmp/audit/actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml + actions-importer-labs/travisci-php-example,rectalogic/notify-irc@v1,tmp/audit/actions-importer-labs/travisci-php-example/.github/workflows/travisci-php-example.yml + actions-importer-labs/travisci-nodejs-example,actions/checkout@v2,tmp/audit/actions-importer-labs/travisci-nodejs-example/.github/workflows/travisci-nodejs-example.yml + actions-importer-labs/travisci-ruby-example,actions/checkout@v2,tmp/audit/actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml + actions-importer-labs/travisci-ruby-example,ruby/setup-ruby@v1,tmp/audit/actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml + actions-importer-labs/travisci-python-example,actions/checkout@v2,tmp/audit/actions-importer-labs/travisci-python-example/.github/workflows/travisci-python-example.yml + actions-importer-labs/travisci-deploy-example,actions/checkout@v2,tmp/audit/actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml + actions-importer-labs/travisci-deploy-example,desiderati/github-action-pushover@v1,tmp/audit/actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml Pipeline,Secret,File path - valet-labs/travisci-deploy-example,${{ secrets.PUSHOVER_USER_KEY }},tmp/audit/valet-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml + actions-importer-labs/travisci-deploy-example,${{ secrets.PUSHOVER_USER_KEY }},tmp/audit/actions-importer-labs/travisci-deploy-example/.github/workflows/travisci-deploy-example.yml Pipeline,Runner,File path ``` The contents of this file can be useful in answering questions similar to the following: + - What workflows will depend on which actions? - What workflows use an action that must go through a security review? - What workflows use specific secrets? diff --git a/travis/3-forecast.md b/travis/3-forecast.md index 65b94c1..eedc077 100644 --- a/travis/3-forecast.md +++ b/travis/3-forecast.md @@ -29,8 +29,8 @@ Answer the following questions before running the `forecast` command: ```console $ gh actions-importer forecast travis-ci --output-dir tmp/forecast --start-date 2022-09-02 - [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/valet-20220916-021004.log' - [2022-08-20 22:08:20] Forecasting 'http://travis-ci.com/valet-labs' + [2022-08-20 22:08:20] Logs: 'tmp/forecast/log/actions-importer-20220916-021004.log' + [2022-08-20 22:08:20] Forecasting 'http://travis-ci.com/actions-importer-labs' [2022-08-20 22:08:20] Output file(s): [2022-08-20 22:08:20] tmp/forecast/jobs/09-16-2022-02-10_jobs_0.json [2022-08-20 22:08:20] tmp/forecast/forecast_report.md diff --git a/travis/4-dry-run.md b/travis/4-dry-run.md index 2b3b09a..74d52f8 100644 --- a/travis/4-dry-run.md +++ b/travis/4-dry-run.md @@ -1,6 +1,6 @@ -# Perform a dry-run of a TravisCI pipeline +# Perform a dry-run of a Travis CI pipeline -In this lab you will use the `dry-run` command to convert a TravisCI pipeline to its equivalent GitHub Actions workflow. +In this lab you will use the `dry-run` command to convert a Travis CI pipeline to its equivalent GitHub Actions workflow. ## Prerequisites @@ -10,13 +10,13 @@ In this lab you will use the `dry-run` command to convert a TravisCI pipeline to ## Perform a dry run -You will be performing a dry-run against a TravisCI project. Answer the following questions before running this command: +You will be performing a dry-run against a Travis CI project. Answer the following questions before running this command: 1. What pipeline do you want to convert? - - __travisci-ruby-example__. This is one of the sample projects avaiable in the TravisCI labs-data organization. + - __travisci-ruby-example__. This is one of the sample projects available in the `actions-importer-labs` organization. 2. Where do you want to store the result? - - __tmp/dry-run__. This can be any path within the working directory that Valet commands are executed from. + - __tmp/dry-run__. This can be any path within the working directory that GitHub Actions Importer commands are executed from. ### Steps @@ -31,21 +31,21 @@ You will be performing a dry-run against a TravisCI project. Answer the followin ```console $ gh actions-importer dry-run travis-ci --travis-ci-repository "travisci-ruby-example" --output-dir tmp/dry-run - [2022-09-19 19:46:03] Logs: 'tmp/dry-run/log/valet-20220919-194603.log' + [2022-09-19 19:46:03] Logs: 'tmp/dry-run/log/actions-importer-20220919-194603.log' [2022-09-19 19:46:05] Output file(s): - [2022-09-19 19:46:05] tmp/dry-run/valet-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml + [2022-09-19 19:46:05] tmp/dry-run/actions-importer-labs/travisci-ruby-example/.github/workflows/travisci-ruby-example.yml ``` 4. View the converted workflow: - - Find `tmp/dry-run/valet-labs/travisci-ruby-example/.github/workflows` in the file explorer pane in your codespace. + - Find `tmp/dry-run/actions-importer-labs/travisci-ruby-example/.github/workflows` in the file explorer pane in your codespace. - Click `travisci-ruby-example.yml` to open. ## Inspect the output files -The files generated from the `dry-run` command represent the equivalent Actions workflow for the TravisCI project. The TravisCI configuration and converted workflow can be seen below: +The files generated from the `dry-run` command represent the equivalent Actions workflow for the Travis CI project. The Travis CI configuration and converted workflow can be seen below:
- TravisCI configuration πŸ‘‡ + Travis CI configuration πŸ‘‡ ```yaml language: ruby @@ -73,7 +73,7 @@ The files generated from the `dry-run` command represent the equivalent Actions Converted workflow πŸ‘‡ ```yaml -name: valet-labs/travisci-ruby-example +name: actions-importer-labs/travisci-ruby-example on: push: branches: @@ -121,4 +121,4 @@ Despite these two pipelines using different syntax they will function equivalent ## Next lab -[Use custom transformers to customize Valet's behavior](./5-custom-transformers.md) +[Use custom transformers to customize GitHub Actions Importer's behavior](./5-custom-transformers.md) diff --git a/travis/5-custom-transformers.md b/travis/5-custom-transformers.md index 1d791d2..3da9351 100644 --- a/travis/5-custom-transformers.md +++ b/travis/5-custom-transformers.md @@ -1,6 +1,6 @@ -# Using custom transformers to customize Valet's behavior +# Using custom transformers to customize GitHub Actions Importer's behavior -In this lab you will build upon the `dry-run` command to override Valet's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: +In this lab you will build upon the `dry-run` command to override GitHub Actions Importer's default behavior and customize the converted workflow using "custom transformers". Custom transformers can be used to: 1. Convert items that are not automatically converted. 2. Convert items that were automatically converted using different actions. @@ -27,7 +27,7 @@ The converted workflow that is generated by the above command can be seen below: Converted workflow πŸ‘‡ ```yaml -name: valet-labs/travisci-deploy-example +name: actions-importer-labs/travisci-deploy-example on: push: branches: @@ -121,7 +121,7 @@ transform "codedeploy" do |_item| end ``` -This method can use any valid ruby syntax and should return a `Hash`, or an array of `Hashes` that represent the YAML that should be generated for a given step. Valet will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Travis CI. +This method can use any valid ruby syntax and should return a `Hash`, or an array of `Hashes` that represent the YAML that should be generated for a given step. GitHub Actions Importer will use this method to convert a step with the provided identifier and will use the `item` parameter for the original values configured in Travis CI. Now you can perform another `dry-run` command and use the `--custom-transformers` CLI option to provide this custom transformer. Run the following command within your codespace terminal: @@ -237,7 +237,7 @@ runner "linux", ["new-runner", "self-hosted"]
-That's it! Congratulations, you have overridden Valet's default behavior by customizing the conversion of: +That's it! Congratulations, you have overridden GitHub Actions Importer's default behavior by customizing the conversion of: - Unknown steps - Environment variables @@ -245,4 +245,4 @@ That's it! Congratulations, you have overridden Valet's default behavior by cust ## Next lab -[Perform a production migration of a Travis CI pipeline](5-migrate.md) +[Perform a production migration of a Travis CI pipeline](6-migrate.md) diff --git a/travis/6-migrate.md b/travis/6-migrate.md index eab3863..0df3931 100644 --- a/travis/6-migrate.md +++ b/travis/6-migrate.md @@ -31,7 +31,7 @@ Answer the following questions before running a `migrate` command: ```console $ gh actions-importer migrate travis-ci --target-url https://github.com/:owner/:repo --output-dir tmp/migrate --travis-ci-repository "travisci-deploy-example" - [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/valet-20220916-014033.log' + [2022-08-20 22:08:20] Logs: 'tmp/migrate/log/actions-importer-20220916-014033.log' [2022-08-20 22:08:20] Pull request: 'https://github.com/:owner/:repo/pull/1' ``` @@ -51,4 +51,4 @@ At this point, the migration has completed and you have successfully migrated a ## Next steps -This concludes all labs for migrating Travis CI pipelines to Actions with Valet! +This concludes all labs for migrating Travis CI pipelines to Actions with GitHub Actions Importer! diff --git a/travis/readme.md b/travis/readme.md index e08d41b..f35ccf4 100644 --- a/travis/readme.md +++ b/travis/readme.md @@ -1,12 +1,12 @@ -# Travis CI to Actions migrations powered by Valet +# Travis CI to Actions migrations powered by GitHub Actions Importer -The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use Valet to migrate Travis CI pipelines to GitHub Actions. +The instructions below will guide you through configuring a GitHub Codespace environment that will be used in subsequent labs that demonstrate how to use GitHub Actions Importer to migrate Travis CI pipelines to GitHub Actions. These steps **must** be completed prior to starting other labs. ## Create your own repository for these labs -1. Ensure that you have created a repository using the [valet-customers/labs](https://github.com/valet-customers/labs) as a template. +1. Ensure that you have created a repository using the [actions/importer-labs](https://github.com/actions/importer-labs) as a template. ## Configure your Codespace @@ -17,7 +17,7 @@ These steps **must** be completed prior to starting other labs. - Click `Create codespaces on main` to create the codespace. - After the Codespace has initialized there will be a terminal present. -2. Verify the Valet CLI is installed and working. More information on the Valet extension for the official GitHub CLI can be found [here](https://github.com/github/gh-valet). +2. Verify the GitHub Actions Importer CLI is installed and working. More information on the GitHub Actions Importer extension for the official GitHub CLI can be found [here](https://github.com/github/gh-actions-importer). - Run the following command in the codespace's terminal: @@ -30,45 +30,45 @@ These steps **must** be completed prior to starting other labs. ```console $ gh actions-importer version gh version 2.14.3 (2022-07-26) - gh actions-importer github/gh-valet v0.1.12 - valet-cli unknown + gh actions-importer github/gh-actions-importer v0.1.12 + actions-importer/cli unknown ``` - - If `gh actions-importer version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-valet-cli). + - If `gh actions-importer version` did not produce similar output then please follow the troubleshooting [guide](#troubleshoot-the-actions-importer/cli). ## Labs for Travis CI -Perform the following labs to test-drive Valet +Perform the following labs to learn more about GitHub Actions migrations with GitHub Actions Importer: -1. [Configure credentials for Valet](1-configure.md) +1. [Configure credentials for GitHub Actions Importer](1-configure.md) 2. [Perform an audit of Travis CI](2-audit.md) 3. [Forecast potential build runner usage](3-forecast.md) 4. [Perform a dry-run of a Travis CI pipeline](4-dry-run.md) -5. [Use custom transformers to customize Valet's behavior](5-custom-transformers.md) +5. [Use custom transformers to customize GitHub Actions Importer's behavior](5-custom-transformers.md) 6. [Perform a production migration of a Travis CI pipeline](6-migrate.md) -## Troubleshoot the Valet CLI +## Troubleshoot the GitHub Actions Importer CLI -The CLI extension for Valet can be manually installed by following these steps: +The CLI extension for GitHub Actions Importer can be manually installed by following these steps: - Verify you are in the codespace terminal - Run this command from within the codespace's terminal: ```bash - gh extension install github/gh-valet + gh extension install github/gh-actions-importer ``` - Verify the result of the install contains: ```console - $ gh extension install github/gh-valet - βœ“ Installed extension github/gh-valet + $ gh extension install github/gh-actions-importer + βœ“ Installed extension github/gh-actions-importer ``` - If you get an error similar to the image below, then click the link in the terminal output to authorize the token. - Restart the codespace after clicking the link. ![img](https://user-images.githubusercontent.com/26442605/169588015-9414404f-82b6-4d0f-89d4-5f0e6941b029.png) -- Verify Valet CLI extension is installed and working by running the following command from the codespace's terminal: +- Verify GitHub Actions Importer CLI extension is installed and working by running the following command from the codespace's terminal: ```bash gh actions-importer version