Package: gcix
gcix - Write your GitLab CI pipelines in X languagesThe complete documentation is found athttps://docs.gcix.devThe GitLab CI X Library (gcix) is a library to create dynamic pipelines for GitLab CI.With thegcixyou can write your GitLab CI pipelines in multiple languages.Supported languagesTypescript/JavaScript (native)PythonA simple pipeline could look like......this inTypescriptimport{Pipeline,Job}from"gcix"constpipeline=newPipeline()constjob=newJob({stage:"build",scripts:["docker build ."]})pipeline.addChildren({jobsOrJobCollections:[job]})pipeline.writeYaml()...this inPythonfromgcipimportPipeline,Jobpipeline=Pipeline()job=Job(stage="build",scripts=["docker build ."])pipeline.add_children(jobs_or_job_collections=[job])pipeline.write_yaml()IntroThegcixis a rewrite of thegcip, the reason behind the rewrite is, that I wanted to learn Typescript, and give
developers the choice to use the language they are familiar with. This is because I chose Typescript and a tool calledjsiimade byAWS.jsiitranslates the different language API's to typescript. The user which uses Python is using Pythons syntax, behind the scenes they are getting
translated to Typescript.ExamplesFor a more complex and real world example, just check out our projects.gitlab-ci.ts. The.gitlab-ci.tsis the written example of a workinggcixin Typescript. The Typescript code is getting rendered and stored as an artifact in the pipeline seegenerated yaml file.Thegcixis using the GitLab feature ofdynamic child pipelines. First the.gitlab-ci.tsgenerates the common GitLab CI yaml file which is then started as child pipeline. To get the generated pipeline it is necessary to invoke the.gitlab-ci.tswithts-node. To get an idea of adynamic child pipelinessetup, you can have a look into.gitlab-ci.yml.Creating your pipelines inany supported programming languagecode allows you all the features of that language, like:re-use code (DRY - Don't repeat yourself)use variables, control flow (if-then-else, loops, ...), complex data structures, input/output, error handling, ...programming paradigms like object-oriented or functional programminguse 3rd party libraries in your pipelinestest driven development of pipelines with Jest(Typescript), pytest(Python)...package management and distribution of your pipeline code... anything you can imagine to do with Python codeDocumentationPlease read theUser Documentationto get a quick introduction into most
features of thegcix.You can consult theAPI Referenceto get an overview of all classes and methods
and a deeper view into their parameters.For more information on how to create your own library based ongcix, please read theDeveloper Documentationto learn about good practices and conventions.Why pipelines as code?There has been a really good discussion onHacker Newsaboutconfiguration vs code.
Comments stating that when struggling around with the limitations of static configuration we start writing pipelines as code, until we hassle
around with complex code and start re-writing complex pipelines in static configuration and so forth.It is absolutely right that pipelines as code are not new and have lots of drawbacks. Chances are good that you have the one guru in you company
loving this project and is writing weird pipelines that nobody else understands. Also comments state that pipelines are those basic things that
build and test your code and shouldn't be in code too, because then you might have a pipeline that build and test your pipeline code.All those statements are quite true. However all those statements could be applied to static configuration. We started this project because of
GitLab CI yaml files growing over thousands of lines. We tried to implement some logic with clunky rule sets. We tried to re-use code with yaml templates.
We tried to write predefined pipelines by using includes. We started to write bash scripts that do bulk loads of work within a job. All in all
those felt like a bad workaround, while having in mind how much cleaner this might be, writing our pipelines in code. That is why we started
this project and since using it with great success.However it is absolutely important to understand thegcixas a supplement and not as a substitution to GitLab CI yaml files. As long you are fine
with having a couple of jobs you could easily describe in static configuration, just do it. If you feel that you can't manage the complexity of
you static yaml configuration and started to build lots of helper scripts, you could consider writing your pipelines in code. This considerations
should include, if the pipeline code you write is definitely an advantage over the static scripts you had before - and not just for you but also
for your colleagues and the company you are writing the code for.Thegcixshould be a choice - not a standard.ThanksFirst of all, I have to thankThomas Steinbachhe created theGitLab CI Python Library (gcip)and started a great journey with GitLab CI pipelines as code.
Another thank you goes to theDB Systel GmbH.Authorgcixwas created byDaniel von Eßenin 2023.LicenseThe content of this repository is licensed under theApache 2.0 license.CopyrightDaniel von Eßen