Skip to content
Snippets Groups Projects
Commit aba08400 authored by Emmanuel Bruno's avatar Emmanuel Bruno
Browse files

adds utils installer.

parent 27d65004
Branches
No related tags found
No related merge requests found
.idea
#!/bin/bash #!/usr/bin/env bash
_B_TITLE='\033[0;33m' _B_TITLE='\033[0;33m'
_E_TITLE='\033[0;0m' _E_TITLE='\033[0;0m'
VAGRANT_VERSION=2.3.3 _create_config() (
TERRAFORM_VERSION=1.3.6 # Create or update default config file
DOCKER_CLIENT_VERSION=20.10.19 mkdir -p "${HOME}/.ci-wrappers/"
DOCKER_COMPOSE_VERSION=2.13.0 cat >!"${HOME}/.ci-wrappers/config" <<END
CI_VAGRANT_VERSION=2.3.4
CI_TERRAFORM_VERSION=1.3.6
CI_DOCKER_CLIENT_VERSION=20.10.19
CI_DOCKER_COMPOSE_VERSION=2.13.0
CI_GH_CLI_VERSION=2.20.2
MAVEN_DEFAULT_IMAGE="brunoe/maven:3.8.6-eclipse-temurin-17" CI_MAVEN_DEFAULT_IMAGE="brunoe/maven:3.8.6-eclipse-temurin-17"
JAVA_DEFAULT_ARCHETYPE_GROUPID="fr.univtln.bruno.demos.archetypes" CI_JAVA_DEFAULT_ARCHETYPE_GROUPID="fr.univtln.bruno.demos.archetypes"
JAVA_DEFAULT_ARCHETYPE_ARTIFACTID="demomavenarchetype" CI_JAVA_DEFAULT_ARCHETYPE_ARTIFACTID="demomavenarchetype"
JAVA_DEFAULT_ARCHETYPE_VERSION="1.1-SNAPSHOT" CI_JAVA_DEFAULT_ARCHETYPE_VERSION="1.1-SNAPSHOT"
export CI_WRAPPERS_HOME="\${CI_WRAPPERS_HOME:-\${HOME}/.ci-wrappers}"
export DOCKER_CONFIG="\$CI_WRAPPERS_HOME/.docker"
END
)
_create_config
_init() {
_create_config
source "${HOME}/.ci-wrappers/config"
}
ci-wrappers-usage() { ci-wrappers-usage() {
echo "install-dockerclient-vagrant-terraform\n\t installs a docker client, vagant and terraform in ${HOME}/bin" printf 'install-dockerclient-vagrant-terraform\n\t installs a docker client, vagant and terraform in %s/bin\n'"${HOME}"
echo "new-java-project [projectname]\n\t create a new java+maven project ready for CI" printf "new-java-project [projectname]\n\t create a new java+maven project ready for CI\n"
echo "docker-wrapper" echo "docker-wrapper"
echo "docker-wrapper-build" echo "docker-wrapper-build"
echo "docker-wrapper-build-all" echo "docker-wrapper-build-all"
...@@ -24,41 +41,63 @@ ci-wrappers-usage() { ...@@ -24,41 +41,63 @@ ci-wrappers-usage() {
echo "docker-sonar-analysis" echo "docker-sonar-analysis"
} }
install-dockerclient-vagrant-terraform() { install-ci-software() {
mkdir -p ${HOME}/bin && _init
dockerCurrentVersion=$(docker --version|cut -d " " -f 3|tr -d ',')
if [ -f ${HOME}/bin/docker ]; then if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
curl -sL https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_CLIENT_VERSION}.tgz | mkdir -p "${CI_WRAPPERS_HOME}"/bin
tar --directory=${HOME}/bin/ --strip-components=1 -zx docker/docker && #Ensure that tools are in PATH
chmod +x ${HOME}/bin/docker [[ ":$PATH:" != *":${CI_WRAPPERS_HOME}/bin:"* ]] && PATH="${CI_WRAPPERS_HOME}/bin:${PATH}"
_version_gh() ("${CI_WRAPPERS_HOME}"/bin/gh --version | head -n 1 | cut -d ' ' -f 3)
if [ ! -f "${CI_WRAPPERS_HOME}"/bin/gh ] || [ "$(_version_gh)" != "${CI_GH_CLI_VERSION}" ]; then
echo "Installing gh client ${CI_GH_CLI_VERSION}" &&
curl -sL "https://github.com/cli/cli/releases/download/v${CI_GH_CLI_VERSION}/gh_${CI_GH_CLI_VERSION}_linux_amd64.tar.gz" |
tar --directory="${CI_WRAPPERS_HOME}/bin/" --strip-components=2 -zx "gh_${CI_GH_CLI_VERSION}_linux_amd64/bin/gh" &&
chmod +x "${CI_WRAPPERS_HOME}/bin/gh"
else else
echo "docker client already installed" echo "GitHub CLI already installed : $(_version_gh)"
fi fi
if [ -f ${HOME}/.docker/cli-plugins/docker-compose ]; then
mkdir -p ${HOME}/.docker/cli-plugins/ && _version_docker() ("${CI_WRAPPERS_HOME}"/bin/docker --version | cut -d " " -f 3 | tr -d ',')
curl -SL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64 -o ${HOME}/.docker/cli-plugins/docker-compose && if [ ! -f "${CI_WRAPPERS_HOME}"/bin/docker ] || [ "$(_version_docker)" != "${CI_DOCKER_CLIENT_VERSION}" ]; then
chmod +x ${HOME}/.docker/cli-plugins/docker-compose echo "Installing docker client ${CI_DOCKER_CLIENT_VERSION}"
curl -sL "https://download.docker.com/linux/static/stable/x86_64/docker-${CI_DOCKER_CLIENT_VERSION}.tgz" |
tar --directory="${CI_WRAPPERS_HOME}/bin/" --strip-components=1 -zx docker/docker &&
chmod +x "${CI_WRAPPERS_HOME}/bin/docker"
else else
echo "docker compose already installed" echo "docker client already installed $(_version_docker)"
fi fi
_version_dockercompose() ("${DOCKER_CONFIG}"/cli-plugins/docker-compose --version | sed 's/^[^0-9]*\([0-9][0-9\.]*\)[^0-9]*$/\1/g')
if [ -f ${HOME}/bin/vagrant ]; then if [ ! -f "${CI_WRAPPERS_HOME}"/.docker/cli-plugins/docker-compose ] || [ "$(_version_dockercompose)" != "${CI_DOCKER_COMPOSE_VERSION}" ]; then
export PATH=${HOME}/bin:$PATH && echo "Installing docker compose plugin ${CI_DOCKER_COMPOSE_VERSION}"
wget -qO- https://releases.hashicorp.com/vagrant/${vagrant_VAGRANT_VERSION}/${vagrant_VAGRANT_VERSION}_linux_amd64.zip | gunzip - \ mkdir -p "${CI_WRAPPERS_HOME}"/.docker/cli-plugins/ &&
>${HOME}/bin/vagrant && curl -sL "https://github.com/docker/compose/releases/download/v${CI_DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64" \
chmod +x ${HOME}/bin/vagrant -o "${DOCKER_CONFIG}"/cli-plugins/docker-compose &&
chmod +x "${DOCKER_CONFIG}"/cli-plugins/docker-compose
else else
echo "vagrant already installed" echo "Docker compose plugin already installed $(_version_dockercompose)"
fi fi
if [ -f ${HOME}/bin/terraform ]; then
export PATH=${HOME}/bin:$PATH && _version_vagrant() ("${CI_WRAPPERS_HOME}"/bin/vagrant --version | sed 's/^[^0-9]*\([0-9][0-9\.]*\)[^0-9]*$/\1/g')
wget -qO- https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip | gunzip - \ if [ ! -f "${CI_WRAPPERS_HOME}"/bin/vagrant ] || [ "$(_version_vagrant)" != "${CI_VAGRANT_VERSION}" ]; then
>${HOME}/bin/terraform && echo "Installing vagrant ${CI_VAGRANT_VERSION}"
chmod +x ${HOME}/bin/terraform curl -sL "https://releases.hashicorp.com/vagrant/${CI_VAGRANT_VERSION}/vagrant_${CI_VAGRANT_VERSION}_linux_amd64.zip" |
gunzip - >"${CI_WRAPPERS_HOME}/bin/vagrant" &&
chmod +x "${CI_WRAPPERS_HOME}/bin/vagrant"
else else
echo "terraform already installed" echo "Vagrant already installed $(_version_vagrant)"
fi fi
_version_terraform() ("${CI_WRAPPERS_HOME}"/bin/terraform --version | head -n 1 | sed 's/^[^0-9]*\([0-9][0-9\.]*\)[^0-9]*$/\1/g')
if [ ! -f "${CI_WRAPPERS_HOME}"/bin/terraform ] || [ "$(_version_terraform)" != "${CI_TERRAFORM_VERSION}" ]; then
echo "Installing terraform ${CI_TERRAFORM_VERSION}"
curl -sL "https://releases.hashicorp.com/terraform/${CI_TERRAFORM_VERSION}/terraform_${CI_TERRAFORM_VERSION}_linux_amd64.zip" |
gunzip - >"${CI_WRAPPERS_HOME}/bin/terraform" &&
chmod +x "${CI_WRAPPERS_HOME}"/bin/terraform
else
echo "Terraform already installed $(_version_terraform)"
fi
} }
provision-docker-engine() { provision-docker-engine() {
...@@ -66,29 +105,19 @@ provision-docker-engine() { ...@@ -66,29 +105,19 @@ provision-docker-engine() {
} }
_moveVBoxDefaultFolder() { _moveVBoxDefaultFolder() {
targetdirectory=${1:-/scratch/${USER}} targetDirectory=${1:-/scratch/${USER}}
VBoxManage list systemproperties | grep "Current default machine folder:" && VBoxManage list systemproperties | grep "Current default machine folder:" &&
mkdir -p ${targetirectory} && mkdir -p "${targetDirectory}" &&
vboxmanage setproperty machinefolder ${targetirectory}/VirtualBox\ VMs && vboxmanage setproperty machinefolder "${targetDirectory}"/VirtualBox\ VMs &&
echo -n "New " && VBoxManage list systemproperties | grep "Default machine folder:" echo -n "New " && VBoxManage list systemproperties | grep "Default machine folder:"
} }
_check_needed_software() {
for c in docker vagrant; do
if [ -x "$(command -v ${c})" ]; then
echo $c not found
else
echo $c found
fi
done
}
_check_needed_variables() { _check_needed_variables() {
_check_variables GITHUBLOGIN GITHUBTOKEN GITHUB_ORG SONAR_URL SONAR_TOKEN _check_variables GITHUBLOGIN GITHUBTOKEN GITHUB_ORG SONAR_URL SONAR_TOKEN
} }
_check_variables() { _check_variables() {
if [ -n "$ZSH_VERSION" ]; then emulate -L bash; fi if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
for varname in "$@"; do for varname in "$@"; do
v="${!varname}" v="${!varname}"
if [ ! -n "${v-unset}" ]; then if [ ! -n "${v-unset}" ]; then
...@@ -101,7 +130,7 @@ _check_variables() { ...@@ -101,7 +130,7 @@ _check_variables() {
# This utility function computes the image name and tag from the project directory and the git branch. # This utility function computes the image name and tag from the project directory and the git branch.
_docker_env() { _docker_env() {
DOCKER_REPO_NAME=${GITHUB_ORG} DOCKER_REPO_NAME=${GITHUB_ORG}
IMAGE_NAME=$(echo ${PWD##*/} | tr '[:upper:]' '[:lower:]') IMAGE_NAME=$(echo "${PWD##*/}" | tr '[:upper:]' '[:lower:]')
IMAGE_TAG=$(git rev-parse --abbrev-ref HEAD) IMAGE_TAG=$(git rev-parse --abbrev-ref HEAD)
DOCKER_TARGET=${DOCKER_TARGET:-finalJLinkAlpine} DOCKER_TARGET=${DOCKER_TARGET:-finalJLinkAlpine}
DOCKER_FULL_IMAGE_NAME="$DOCKER_REPO_NAME/$IMAGE_NAME:$IMAGE_TAG-$DOCKER_TARGET" DOCKER_FULL_IMAGE_NAME="$DOCKER_REPO_NAME/$IMAGE_NAME:$IMAGE_TAG-$DOCKER_TARGET"
...@@ -171,24 +200,23 @@ docker-mvn() ( ...@@ -171,24 +200,23 @@ docker-mvn() (
_docker_env _docker_env
docker run \ docker run \
--env IMAGE_NAME="$IMAGE_NAME" \ --env IMAGE_NAME="$IMAGE_NAME" \
--env GITHUB_LOGIN="$GITHUB_LOGIN" \ --env GITHUB_LOGIN="$GITHUBLOGIN" \
--env GITHUB_TOKEN="$GITHUB_TOKEN" \ --env GITHUB_TOKEN="$GITHUBTOKEN" \
--env SONAR_URL="$SONAR_URL" \ --env SONAR_URL="$SONAR_URL" \
--env SONAR_TOKEN="$SONAR_TOKEN" \ --env SONAR_TOKEN="$SONAR_TOKEN" \
--env SONAR_URL="$SONAR_URL" \ --env SONAR_URL="$SONAR_URL" \
--env SONAR_TOKEN="$SONAR_TOKEN" \ --env SONAR_TOKEN="$SONAR_TOKEN" \
--env S6_LOGGING=1 \ --env S6_LOGGING=1 \
--env S6_BEHAVIOUR_IF_STAGE2_FAILS \ --env S6_BEHAVIOUR_IF_STAGE2_FAILS \
--volume ${HOME}/.m2:/home/user/.m2 \ --volume "${HOME}/.m2":"/home/user/.m2" \
--volume ${HOME}/.ssh:/home/user/.ssh \ --volume "${HOME}/.ssh":"/home/user/.ssh" \
--volume ${HOME}/.gitconfig:/home/user/.gitconfig \ --volume "${HOME}/.gitconfig":"/home/user/.gitconfig" \
--volume "$ --volume "$(pwd)":"/usr/src/mymaven" \
}(pwd)":/usr/src/mymaven \
--workdir /usr/src/mymaven \ --workdir /usr/src/mymaven \
--rm \ --rm \
--env PUID=$(id -u) -e PGID=$(id -g) \ --env PUID="$(id -u)" -e PGID="$(id -g)" \
--env MAVEN_CONFIG=/home/user/.m2 \ --env MAVEN_CONFIG=/home/user/.m2 \
"${MAVEN_IMAGE:-${MAVEN_DEFAULT_IMAGE}}" \ "${MAVEN_IMAGE:-${CI_MAVEN_DEFAULT_IMAGE}}" \
runuser --user user \ runuser --user user \
--group user \ --group user \
-- mvn --errors --threads 1C --color always --strict-checksums \ -- mvn --errors --threads 1C --color always --strict-checksums \
...@@ -198,82 +226,85 @@ docker-mvn() ( ...@@ -198,82 +226,85 @@ docker-mvn() (
docker-sonar-analysis() ( docker-sonar-analysis() (
docker-mvn -P jacoco,sonar \ docker-mvn -P jacoco,sonar \
-Dsonar.branch.name=$(git rev-parse --abbrev-ref HEAD | tr / _) \ -Dsonar.branch.name="$(git rev-parse --abbrev-ref HEAD | tr / _)" \
verify sonar:sonar verify sonar:sonar
) )
new-java-project() ( new-java-project() (
printf "${_B_TITLE}Creating Java project ${_E_TITLE}"
if [[ ! $# -eq 2 ]]; then if [[ ! $# -eq 2 ]]; then
echo "Usage: $0 <projectname> <groupid>" echo "Usage: $0 <projectname> <groupid> [version]"
exit 1 exit 1
fi fi
_init
PROJECT_NAME=$(echo "$1" | tr '[:upper:]' '[:lower:]')
GROUP_ID=$(echo "$2" | tr '[:upper:]' '[:lower:]')
VERSION="${3:-1.0-SNAPSHOT}"
printf "${_B_TITLE}Creating Java project${_E_TITLE}\n"
printf "\t Archetype : ${CI_JAVA_DEFAULT_ARCHETYPE_GROUPID}:${CI_JAVA_DEFAULT_ARCHETYPE_ARTIFACTID}:${CI_JAVA_DEFAULT_ARCHETYPE_VERSION}\n"
printf "\t Artefact : ${GROUP_ID}:${PROJECT_NAME}:${VERSION}\n"
_check_variables GITHUBLOGIN GITHUBORG GITHUBTOKEN _check_variables GITHUBLOGIN GITHUBORG GITHUBTOKEN
printf "${_B_TITLE}$1 with groupId $2${_E_TITLE}\n"
printf "${_B_TITLE} calling maven archetype${_E_TITLE}\n"
mvn --quiet --color=always --batch-mode archetype:generate \ mvn --quiet --color=always --batch-mode archetype:generate \
-DarchetypeGroupId=${JAVA_DEFAULT_ARCHETYPE_GROUPID} \ -DarchetypeGroupId="${CI_JAVA_DEFAULT_ARCHETYPE_GROUPID}" \
-DarchetypeArtifactId=${JAVA_DEFAULT_ARCHETYPE_ARTIFACTID} \ -DarchetypeArtifactId="${CI_JAVA_DEFAULT_ARCHETYPE_ARTIFACTID}" \
-DarchetypeVersion=${JAVA_DEFAULT_ARCHETYPE_VERSION} \ -DarchetypeVersion="${CI_JAVA_DEFAULT_ARCHETYPE_VERSION}" \
-DgithubAccount=${GITHUBORG} \ -DgithubAccount="${GITHUBORG}" \
-DgroupId=${2} \ -DgroupId="${GROUP_ID}" \
-DartifactId=${1} \ -DartifactId="${PROJECT_NAME}" \
-Dversion=1.0-SNAPSHOT && -Dversion="${VERSION}" &&
cd ${1} && cd "${PROJECT_NAME}" &&
printf "${_B_TITLE} Gitflow init${_E_TITLE}\n" && printf "${_B_TITLE} Gitflow init${_E_TITLE}\n" &&
git flow init -d && git add . && git commit -m "sets initial release." && git flow init -d && git add . && git commit --quiet -m "sets initial release." &&
printf "${_B_TITLE} gh-pages branch creation${_E_TITLE}\n" && printf "${_B_TITLE} gh-pages branch creation${_E_TITLE}\n" &&
git checkout --orphan gh-pages && git checkout --orphan gh-pages &&
git rm -rf . && touch index.html && git rm -rf --quiet . && touch index.html &&
git add . && git add . &&
git commit -m "sets initial empty site." && git commit --quiet -m "sets initial empty site." &&
git checkout develop && git checkout develop &&
printf "${_B_TITLE} GitHub reposirory creation${_E_TITLE}\n" && printf "${_B_TITLE} GitHub reposirory creation${_E_TITLE}\n" &&
gh repo create ${GITHUBORG}/${PWD##*/} --disable-wiki --private --source=. && gh repo create "${GITHUBORG}/${PWD##*/}" --disable-wiki --private --source=. &&
printf "${_B_TITLE} Generate a default deploy key${_E_TITLE}\n" && printf "${_B_TITLE} Generate a default deploy key${_E_TITLE}\n" &&
_generate_and_install_new_deploy_key ${GITHUBORG} ${1} && _generate_and_install_new_deploy_key "${GITHUBORG}" "${PROJECT_NAME}" &&
git push origin --mirror && git push origin --mirror --quiet &&
gh repo view --web gh repo view --web
) )
_generate_and_install_new_deploy_key() ( _generate_and_install_new_deploy_key() (
tmpKeydir=$(mktemp --directory /tmp/ci-wrappers.XXXXXX) tmpKeydir=$(mktemp --directory /tmp/ci-wrappers.XXXXXX)
ssh-keygen -q -t ed25519 -C "git@github.com:${1}/${2}.git" -N "" -f ${tmpKeydir}/key ssh-keygen -q -t ed25519 -C "git@github.com:${1}/${2}.git" -N "" -f "${tmpKeydir}/key"
gh repo deploy-key add --allow-write "${tmpKeydir}/key.pub" gh repo deploy-key add --allow-write "${tmpKeydir}/key.pub"
gh secret set SSH_PRIVATE_KEY <"${tmpKeydir}/key" gh secret set SSH_PRIVATE_KEY <"${tmpKeydir}/key"
rm -rf tmpKeydir rm -rf tmpKeydir
) )
# runner name # create a github hosted runner in a container for the current repo
github-runner-repo() ( github-runner-repo() (
local workdir="$(mktemp --directory /tmp/ghrunner-${GITHUBORG}-${PWD##*/}.XXXXXX)" local workdir
docker run -d --restart always \ workdir=$(mktemp --directory "/tmp/ghrunner-${GITHUBORG}_${PWD##*/}_XXXXXX")
docker run -d --restart always --name ghrunner_$(echo "$workdir" | cut -d '-' -f 2) \
-e REPO_URL="https://github.com/${GITHUBORG}/${PWD##*/}" \ -e REPO_URL="https://github.com/${GITHUBORG}/${PWD##*/}" \
-e RUNNER_NAME_PREFIX="${GITHUBORG}-${PWD##*/}-runner" \ -e RUNNER_NAME_PREFIX="${GITHUBORG}-${PWD##*/}-runner" \
-e ACCESS_TOKEN=${GITHUBTOKEN} \ -e ACCESS_TOKEN="${GITHUBTOKEN}" \
-e RUNNER_WORKDIR="${workdir}" \ -e RUNNER_WORKDIR="${workdir}" \
-v /var/run/docker.sock:/var/run/docker.sock \ -v /var/run/docker.sock:/var/run/docker.sock \
-v "${workdir}":"${workdir}" \ -v "${workdir}":"${workdir}" \
myoung34/github-runner:latest myoung34/github-runner:latest
# -e RUNNER_GROUP="my-group" \
# -e DISABLE_AUTO_UPDATE="true" \
# -e ORG_NAME="${GITHUBORG}" \
#-e LABELS="my-label,other-label" \
) )
# create a github hosted runner in a container for the org in $GITHUBORG
github-runner-org() ( github-runner-org() (
local workdir="$(mktemp --directory /tmp/ghrunner-org.XXXXXX)" local workdir
docker run -d --restart always \ workdir=$(mktemp --directory "/tmp/ghrunner-${GITHUBORG}_XXXXXX")
docker run -d --restart always --name ghrunner_$(echo "$workdir" | cut -d '-' -f 2) \
-e REPO_URL="https://github.com/${GITHUBORG}/${PWD##*/}" \ -e REPO_URL="https://github.com/${GITHUBORG}/${PWD##*/}" \
-e RUNNER_NAME_PREFIX="${GITHUBORG}-${PWD##*/}-runner" \ -e RUNNER_NAME_PREFIX="${GITHUBORG}-${PWD##*/}-runner" \
-e ACCESS_TOKEN=${GITHUBTOKEN} \ -e ACCESS_TOKEN="${GITHUBTOKEN}" \
-e RUNNER_WORKDIR="${workdir}" \ -e RUNNER_WORKDIR="${workdir}" \
-v /var/run/docker.sock:/var/run/docker.sock \ -v /var/run/docker.sock:/var/run/docker.sock \
-v "${workdir}":"${workdir}" \ -v "${workdir}":"${workdir}" \
-e RUNNER_SCOPE="org" \ -e RUNNER_SCOPE="org" \
-e ORG_NAME="${GITHUBORG}" \ -e ORG_NAME="${GITHUBORG}" \
myoung34/github-runner:latest myoung34/github-runner:latest
# -e DISABLE_AUTO_UPDATE="true" \
#-e LABELS="my-label,other-label" \
# -e RUNNER_GROUP="my-group" \
) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment