Jaypore CI

> Jaypore CI: Minimal, Offline, Local CI system.
Log | Files | Refs | README

commit dac9f0d1ed8f3430a82ab1e2eb926c002f027f45
parent f3c3070c0f5b1b6df91d4d8ff08d76fec00782fc
Author: arjoonn <arjoonn@noreply.localhost>
Date:   Mon, 13 Mar 2023 04:03:23 +0000

Update curl setup to work with pipe (!57)

Branch auto created by JayporeCI

```jayporeci
╔ 🟢 : JayporeCI       [sha ae2e80e6a1]
┏━ build-and-test
┃
┃ 🟢 : JciEnv          [86697eeb]   0:18
┃ 🟢 : Jci             [6bb12c9e]   0:22            ❮-- ['JciEnv']
┃ 🟢 : black           [7ed4c97c]   0: 0            ❮-- ['JciEnv']
┃ 🟢 : pylint          [f2bd2fbb]   0: 8            ❮-- ['JciEnv']
┃ 🟢 : pytest          [7c01ee55]   0:25 Cov: 91%   ❮-- ['JciEnv']
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏━ Publish
┃
┃ 🟢 : DockerHubJci    [40b75f9d]   1:41
┃ 🟢 : DockerHubJcienv [cd232906]   1:57
┃ 🟢 : PublishDocs     [6674502c]   0:42
┃ 🟢 : PublishPypi     [4a2de141]   0: 6 v0.2.23
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
```

Co-authored-by: arjoonn sharma <arjoonn.94@gmail.com>
Co-authored-by: demo <demo@example.com>
Reviewed-on: https://gitea.midpathsoftware.com/midpath/jaypore_ci/pulls/57

Diffstat:
MREADME.md | 3++-
Mcicd/pre-push.sh | 1+
Mdocs/source/index.rst | 9+++++----
Mjaypore_ci/remotes/email.py | 21++++++++++++++++++---
Mpyproject.toml | 2+-
Asecrets/bin/age | 0
Asecrets/bin/age-keygen | 0
Asecrets/bin/sops | 0
Msecrets/ci.enc | 24++++++++++--------------
Msetup.sh | 43+++++++++++++++++++++++++++++++++++--------
10 files changed, 72 insertions(+), 31 deletions(-)

diff --git a/README.md b/README.md @@ -1,5 +1,6 @@ # ![JayporeCI](docs/source/_static/logo80.png) Jaypore CI + Documentation is at : https://www.jayporeci.in ## If you are reading this on github @@ -10,5 +11,5 @@ Documentation is at : https://www.jayporeci.in ## Usage -- Install : `curl https://www.jayporeci.in/setup.sh | bash` +- Install : `curl https://www.jayporeci.in/setup.sh > setup.sh && bash setup.sh -y` - Trigger : `git push origin` diff --git a/cicd/pre-push.sh b/cicd/pre-push.sh @@ -12,6 +12,7 @@ run() { echo "ENV : '$ENV' -> Sourcing from secrets" source /jaypore_ci/repo/secrets/bin/set_env.sh $ENV fi + env | awk -F\= '{print $1}' cp -r /jaypore_ci/repo/. /jaypore_ci/run cd /jaypore_ci/run/ git clean -fdx diff --git a/docs/source/index.rst b/docs/source/index.rst @@ -35,8 +35,9 @@ repository so if you want you can do this manually also. .. code-block:: console - cd ~/myrepository - curl https://www.jayporeci.in/setup.sh | bash + $ cd ~/myrepository + $ curl https://www.jayporeci.in/setup.sh > setup.sh + $ bash setup.sh -y **Or** you can manually install it. The names are convention, you can call your @@ -156,8 +157,8 @@ Pipeline config is specified at the job level. -Secrets and env variables -************************* +Secrets and environment variables +********************************* 1. JayporeCI uses [SOPS](https://github.com/mozilla/sops) to manage environment variables and secrets. - We add `secrets/<env_name>.enc` to store secrets. diff --git a/jaypore_ci/remotes/email.py b/jaypore_ci/remotes/email.py @@ -47,6 +47,20 @@ class Email(Remote): # pylint: disable=too-many-instance-attributes pass # Do something + :param host: What smtp host to use. + :param port: Smtp port to use. + :param addr: Smtp address to use for login. + :param password: Smtp password to use for login. + :param email_to: Which address the email should go to. + :param email_from: Which address should be the sender of this email. + :param subject: The subject line of the email. + :param only_on_failure: If set to True, a single email will be sent when + the pipeline fails. In all other cases no email is + sent. + :param publish_interval: Determines the delay in sending another email when + we are sending multiple email updates in a single + email thread. If `only_on_failure` is set, this + option is ignored. """ @classmethod @@ -81,7 +95,7 @@ class Email(Remote): # pylint: disable=too-many-instance-attributes email_to: str, email_from: str, subject: str, - continuous_updates: bool = False, + only_on_failure: bool = False, publish_interval: int = 30, **kwargs, ): # pylint: disable=too-many-arguments @@ -96,7 +110,7 @@ class Email(Remote): # pylint: disable=too-many-instance-attributes self.subject = subject self.timeout = 10 self.publish_interval = publish_interval - self.continuous_updates = continuous_updates + self.only_on_failure = only_on_failure # --- self.__smtp__ = None self.__last_published_at__ = None @@ -129,7 +143,8 @@ class Email(Remote): # pylint: disable=too-many-instance-attributes if ( self.__last_published_at__ is not None and (time.time() - self.__last_published_at__) < self.publish_interval - ) or (not self.continuous_updates and status not in ("success", "failure")): + and status not in ("success", "failure") + ) or (self.only_on_failure and status != "failure"): return if self.__last_report__ == report: return diff --git a/pyproject.toml b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "jaypore_ci" -version = "0.2.22" +version = "0.2.23" description = "" authors = ["arjoonn sharma <arjoonn.94@gmail.com>"] homepage = "https://www.jayporeci.in/" diff --git a/secrets/bin/age b/secrets/bin/age Binary files differ. diff --git a/secrets/bin/age-keygen b/secrets/bin/age-keygen Binary files differ. diff --git a/secrets/bin/sops b/secrets/bin/sops Binary files differ. diff --git a/secrets/ci.enc b/secrets/ci.enc @@ -1,16 +1,12 @@ -JAYPORE_DOCKER_USER=ENC[AES256_GCM,data:oC92MBM2hA==,iv:1GAxCOZZv0XsiX3PY3vYHnG9J8mcCwJDgNsPdvvRKFQ=,tag:v8AywYAOzvjRtWqlDBeM0g==,type:str] -JAYPORE_DOCKER_PWD=ENC[AES256_GCM,data:CYOp9N93tnQIK+8CmMld/8loFErRvaP9BIaneUTDmgiAutpv,iv:ZIKzJaUogjGcbvophgeNw8CZvTDIBHuVaHq3ichAb9U=,tag:Sg0M8f4Nb7xWdMgwm27e7Q==,type:str] -JAYPORE_NETLIFY_TOKEN=ENC[AES256_GCM,data:6UpWZ0ZWLKraLs1tP3wz7JbAA7nqu+afOtigAQv7FaYS8aTuM3/ozieayQ==,iv:AJXlNpKYHcg8Nh1fAop58MBmV0s/gmjxazuXtWLQqyE=,tag:91hPgDWAWYuTmnZ+Coo2Og==,type:str] -JAYPORE_NETLIFY_SITEID=ENC[AES256_GCM,data:z4QaJ4xUM490WViYv4Acau//pkjgWCQ7kNfW3g4qASw6qLR8,iv:IPhuWvBWZxtYiL5XtQFEnR6RxOiezvc2hISdgLaBzp8=,tag:Yb8jMn2n6HK4ybqgsZNR9Q==,type:str] -JAYPORE_PYPI_TOKEN=ENC[AES256_GCM,data:FPk9CBTboAi2H0afgWtV59IHLOC8xx3WxhN/gIzTcC+lSlXsCyyM1Zio63aWlfufBk4FJcJhpFopVVpijRGzHCpHgC/hYyUKwBO6wenNktM9Ul8LRkQJk7KVvn5cLjAS6yK/vutr3/SHXkzgef3B7EL1J8jjRjDpQQvadDyLPOf20eduWnpwp5fQa6y/KdwhDW36Z6GEzNLbUeevGeeIaidYTVTPacbIEcKh04OUGc5URro8oFv7cBzmR6srxFyqrHNJZtG1ZhZwuPVPneLj+ck=,iv:ujxVdymiIHlUCQEByVVuQqKmCvWA0P7hnxQ73vKnknk=,tag:ih1WgEOTcQmeIxtd80XFYg==,type:str] -JAYPORE_GITEA_TOKEN=ENC[AES256_GCM,data:qQuApRUUZ5GygKg13HoddtlQY20+0yrptaCtUYHMFEl793tXvA+4XQ==,iv:QwHIUQ+5OpGxzCf8aA9bq1hLtUNaKZdAU/5TWPSmlCU=,tag:LUTvMn1EZybQUHscCIKAew==,type:str] -JAYPORE_EMAIL_ADDR=ENC[AES256_GCM,data:xkTmiw==,iv:m8XmWl41mv10DMwc7d3oOWMOxnQf2/6VtK5T2Gws49U=,tag:sJeT0maZP61rphdpa0VOng==,type:str] -JAYPORE_EMAIL_PASSWORD=ENC[AES256_GCM,data:eyPc/Q==,iv:uj6drBxAobrtKgF9VXDJdWCMTX57YOu5WFW7wQIWzFk=,tag:3uAljYsvCQhZ7/FZQQHjXw==,type:str] -JAYPORE_EMAIL_TO=ENC[AES256_GCM,data:yEy5Lw==,iv:mij/qk1P/q/VzWSSE7NW5RGsO7Fpgxof0A0pm4aqYmQ=,tag:clf/3fybvqFTGZj/fOCrSA==,type:str] -JAYPORE_EMAIL_FROM=ENC[AES256_GCM,data:YSoI7Q==,iv:6celjipnC9rNPKAb++hpY4x1TEW1ul/jnUtP6m8EyFE=,tag:6MvYSoPkCerpRhn+jSsd0Q==,type:str] +JAYPORE_DOCKER_USER=ENC[AES256_GCM,data:/gSnrYanww==,iv:YbbR8Qm9iTPXzGHGcFZc4xPXtY6xevMKvfEk6eJlu8U=,tag:CLDG3dfo1PyODydiOB6nVQ==,type:str] +JAYPORE_DOCKER_PWD=ENC[AES256_GCM,data:DyWhzveKJpqYzjLmB64zDKGi6JgV1QUgOji51xBgv/NKY4fa,iv:jQBAu0nxL2TebfXXSp9VcQdaklKg0mDbTDcuVXKs7Io=,tag:zLLr5yLyguvdvYfb9XlvpA==,type:str] +JAYPORE_NETLIFY_TOKEN=ENC[AES256_GCM,data:hhWA9DznqJoKafoWn3gcer/aDUrl+IMItpnHH6kC27bT9gbV3cBAgXxvmQ==,iv:2t74vUHDZuJ+hFGY7reo8g0zoW/2HCJwgx4HNWfeI74=,tag:avaxuRztESg0IDGpNyE2pw==,type:str] +JAYPORE_NETLIFY_SITEID=ENC[AES256_GCM,data:XkpP7xVfkm+Lg8F0YS8pIxbCWRYzAfPPq/0mobmPARcF5pas,iv:7O+W0MOvkL/tPZ0L0EAKV83wZcIkvwRicAvXWnaygfA=,tag:/vZc0tSEnXS5ryOzAVrLlw==,type:str] +JAYPORE_PYPI_TOKEN=ENC[AES256_GCM,data:Wzu3wIfwNnr+8n+fUhKSRGQqxFhCy0lDkuF03rBC/1BPjDkhxcFWnPSi7Vn3KCukO6UcfV3Mwc/e2AaEGqhsYx1t9dLU732VcKADtrnksBtqmVDeFKyipAQX8oveIPVj6CmhA1T6UHH8DrEgDhhJ4Sh4NvXg+zRsgD0LztgNdkLW1UaCqAfP7qeCdgLhdKYijkPspcU+36H6pKaQSXg1zbIHAkjS2L89JbmWZ0Y4jRitxkJx9rdm2lsOGXHtlHYWQBU/OGg50At5tFH7qoIE6ks=,iv:f+Q5GB9+FfGBH9XnphAe28sHaVrsW5fIYIwRnBQkUpo=,tag:k2alnsZl9vmffZYwsngKIg==,type:str] +JAYPORE_GITEA_TOKEN=ENC[AES256_GCM,data:DSjy+nvSnWwGNAVed420XX+FoqfqECWGdrLsf7EEzDbZ/Cn2FtDLmQ==,iv:tHdNbhXD2gLThSaSX2VG5cOVJGrxZ12JQ9BC/L7ntDU=,tag:TBpGcFKnCed/lm9FDf0OgQ==,type:str] +sops_mac=ENC[AES256_GCM,data:dyEnTlv/6w0NJ1zCTMoiitQXjEKMoXKJyadg1uyVNgw/AwsHx483a251nDuMcGAsKzetMzml2CVA9FeNP9n71CdHzyKYKAy1nSUKAhdg1MJyVhW93xnvfm5Wsq4R6KRTMU0ZWz2M1nixgPssRzOZb37VWMp8uVjdMfxG8Q+DsfY=,iv:6fuVGFk8gC+dFus+m4R03RyvRzA3/R+QF33QYA+EKxY=,tag:QUhvrMdr4WZjZ85Ttj6bqQ==,type:str] +sops_unencrypted_suffix=_unencrypted sops_version=3.7.3 -sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxeDRPY1RjanBseFVWcVdW\nZWlFaUk3dnQyUmYzck5iUTc1Z0RvMHZyamtnCnU0aUI0cHo3a2FuRERyV0pkc05x\nWnBseURYK0xFcWxnTklmRzdoQ3BoencKLS0tIFhMUk44dDhweEpTNnJWNGZqWWRS\nclVEOTZUYllmMVBBdjkvZjVtVkVHcHMKonS5h3nfmAYNwz7zPTd0eA+eC7MffKTC\nXfPDIveZrpFJLz0YDdPiFD2sORFlTZog8bitzhgY1MZwQNqE8iZQjw==\n-----END AGE ENCRYPTED FILE-----\n +sops_age__list_0__map_enc=-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxSVlDWmk2RGFVeXJObDVW\nMmNTZ0E4OGpieXV4M3VITysrUis2YnpzRVVVCklFWTNNa3VkaFdMbDVOZGRHUHgy\nNnltNkJkZ0FmdkNMR2dmaEJVSWZoRzgKLS0tIDQ2clJoKzYxamh6NkxEOWRVd2hi\nVHE1am96M1BzT0RxeHd2V2xYSSt5OFkKQH/3MqOW+2vAJHeeERfpAc2o6i3xmQI1\nGKT1ghplWIPJIvnxmPEiqMfbzrN8Rl7kTtXQvjVAFQLU2VNBeE0prw==\n-----END AGE ENCRYPTED FILE-----\n sops_age__list_0__map_recipient=age1u0zd477nnqqausg4vtxl3laxz73t5tgt9qw8enmpeeadcmes3eusw3v3m9 -sops_lastmodified=2023-02-19T07:33:53Z -sops_mac=ENC[AES256_GCM,data:J8cqAfeAMvwA8DvtwiPbCjlUllOdgZUcgExK8HENtXhBBLEmaznI2tfB7tF2CSMLg+y9lLL8pmqQQRMr6JMCEbSSetRb0yvV2T1r9gpe5fZ5dd65gD8i1OXeAivqeeaRf8H7cGrb7wnWLn564fq26J6JR8LKahjj6+rzpawXzig=,iv:TDDm8g0bSCNSHWH+brQPUSvC1QHsl/gQ6l1JnVftxXo=,tag:eRRUTYH1+XIB/GinN7HWvQ==,type:str] -sops_unencrypted_suffix=_unencrypted +sops_lastmodified=2023-03-10T04:04:50Z diff --git a/setup.sh b/setup.sh @@ -2,6 +2,34 @@ set -o errexit set -o nounset set -o pipefail +ASSUME_YES="no" +while getopts ":y" opt; do + case $opt in + y) + ASSUME_YES="yes" + ;; + esac +done +echo "ASSUME YES: $ASSUME_YES" + +should_continue (){ + if [[ "$ASSUME_YES" = "yes" ]] + then + return 0 + fi + # --- + read -r -p "Continue? [Y/n] " response + if [[ "$response" = "" ]] + then + return 0 + fi + if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + then + return 0 + fi + return 1 +} + main (){ REPO_ROOT=$(git rev-parse --show-toplevel) LOCAL_HOOK=$(echo $REPO_ROOT/.git/hooks/pre-push) @@ -13,8 +41,7 @@ main (){ echo "Installing in repo: $REPO_ROOT" echo "Creating folder for cicd: $REPO_ROOT/$CICD_ROOT" # ----------------== - read -r -p "Should we continue? [Y/n] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + if should_continue; then echo "Creating cicd.py and pre-push.sh" else @@ -32,13 +59,13 @@ EOF chmod u+x $REPO_ROOT/cicd/pre-push.sh # ----------------== ENV_PREFIX='' - read -r -p "Do you want to create 'secrets' folder for environment variables? [Y/n] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + echo "Creating 'secrets' folder for environment variables." + if should_continue then mkdir -p secrets/bin PATH="$REPO_ROOT/secrets/bin:$PATH" - read -r -p "Do you want to download age/sops binaries? [Y/n] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + echo "Downloading age/sops binaries" + if should_continue then echo "Downloading age/ binaries" wget --quiet -O $HOME/.local/bin/age http://www.jayporeci.in/bin/age & @@ -57,8 +84,8 @@ EOF echo "Creating new age-key at: $REPO_ROOT/secrets/ci.key" age-keygen > $REPO_ROOT/secrets/ci.key echo "You can now use (bash secrets/bin/edit_env.sh ci) to edit environment variables." - read -r -p "Do you want to edit_env now? [Y/n] " response - if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]] + echo "Editing secrets now" + if should_continue then (bash $REPO_ROOT/secrets/bin/edit_env.sh ci) fi