Add support for artifact releases
[releng/global-jjb.git] / shell / release-job.sh
index eba269b..66bed66 100644 (file)
@@ -25,7 +25,7 @@ python -m pip freeze
 
 set_variables_common(){
     echo "INFO: Setting common variables"
-    if [[ -z ${LOGS_SERVER:-} ]] || [[ -z ${CDN_URL:-} ]]; then
+    if [[ -z ${LOGS_SERVER:-} ]] && [[ -z ${CDN_URL:-} ]]; then
         echo "ERROR: LOGS_SERVER or CDN_URL not defined"
         exit 1
     fi
@@ -48,6 +48,9 @@ set_variables_common(){
         release_file="None"
     fi
 
+    if [[ -z ${LOG_DIR:-} ]]; then
+        LOG_DIR=$(yq -r ".log_dir" "$release_file")
+    fi
     if [[ -n ${LOGS_SERVER:-} ]]; then
         logs_url="${LOGS_SERVER}/${NEXUS_PATH}${LOG_DIR}"
     elif [[ -n ${CDN_URL:-} ]]; then
@@ -80,7 +83,7 @@ set_variables_common(){
     # Displaying Release Information (Common variables)
     printf "\t%-30s\n" RELEASE_ENVIRONMENT_INFO:
     printf "\t%-30s %s\n" RELEASE_FILE: "$release_file"
-    printf "\t%-30s %s\n" LOGS_SERVER: "$LOGS_SERVER"
+    printf "\t%-30s %s\n" LOGS_SERVER: "${LOGS_SERVER:-None}"
     printf "\t%-30s %s\n" CDN_URL: "${CDN_URL:-None}"
     printf "\t%-30s %s\n" NEXUS_PATH: "$NEXUS_PATH"
     printf "\t%-30s %s\n" JENKINS_HOSTNAME: "$JENKINS_HOSTNAME"
@@ -146,7 +149,7 @@ set_variables_container(){
     printf "\t%-30s %s\n" CONTAINER_RELEASE_TAG: "$VERSION"
     printf "\t%-30s %s\n" CONTAINER_PULL_REGISTRY: "$CONTAINER_PULL_REGISTRY"
     printf "\t%-30s %s\n" CONTAINER_PUSH_REGISTRY: "$CONTAINER_PUSH_REGISTRY"
-    printf "\t%-30s %s\n" GERRIT_REF_TO_TAG: "$ref"
+    printf "\t%-30s %s\n" GIT_REF_TO_TAG: "$ref"
     printf "\t%-30s %s\n" GIT_TAG: "$GIT_TAG"
 }
 
@@ -209,6 +212,28 @@ set_variables_packagecloud(){
      printf "\t%-30s %s\n" PACKAGE_NAME: "$PACKAGE_NAME"
      printf "\t%-30s %s\n" LOG_DIR: "$LOG_DIR"
      printf "\t%-30s %s\n" LOGS_URL: "$logs_url"
+     printf "\t%-30s %s\n" GIT_REF_TO_TAG: "$REF"
+     printf "\t%-30s %s\n" VERSION: "$VERSION"
+     printf "\t%-30s %s\n" GIT_TAG: "$GIT_TAG"
+}
+
+set_variables_artifact(){
+     echo "INFO: Setting artifact variables"
+     if [[ -z ${VERSION:-} ]]; then
+         VERSION=$(yq -r ".version" "$release_file")
+     fi
+     if [[ -z ${GIT_TAG:-} ]]; then
+         if grep -q "git_tag" $release_file ; then
+             GIT_TAG=$(yq -r ".git_tag" "$release_file")
+         else
+             GIT_TAG="$VERSION"
+         fi
+     fi
+     if [[ -z ${REF:-} ]]; then
+         REF=$(yq -r ".ref" "$release_file")
+     fi
+
+     printf "\t%-30s\n" RELEASE_ARTIFACT_INFO:
      printf "\t%-30s %s\n" GERRIT_REF_TO_TAG: "$REF"
      printf "\t%-30s %s\n" VERSION: "$VERSION"
      printf "\t%-30s %s\n" GIT_TAG: "$GIT_TAG"
@@ -285,13 +310,19 @@ verify_packagecloud_match_release(){
 
 # sigul is only available on Centos
 # TODO: write tag-github-repo function
-tag-gerrit-repo(){
+tag-git-repo(){
     if [[ $TAG_RELEASE == false ]]; then
-       echo "INFO: Skipping gerrit repo tag"
+       echo "INFO: Skipping code repo tag"
        return
     fi
 
-    echo "INFO: tag gerrit with $GIT_TAG"
+    if [[ -z ${GERRIT_URL:-} ]]; then
+        GIT_REPO_BASE=github
+    else
+        GIT_REPO_BASE=gerrit
+    fi
+
+    echo "INFO: tag repo with $GIT_TAG"
     # Import public signing key
     gpg --import "$SIGNING_PUBKEY"
     if type=$(git cat-file -t "$GIT_TAG"); then
@@ -312,12 +343,16 @@ tag-gerrit-repo(){
         ########## Merge Part ##############
         if [[ "$JOB_NAME" =~ "merge" ]] && [[ "$DRY_RUN" = false ]]; then
             echo "INFO: Running merge, pushing tag"
-            gerrit_ssh=$(echo "$GERRIT_URL" | awk -F"/" '{print $3}')
-            git remote set-url origin ssh://"$RELEASE_USERNAME"@"$gerrit_ssh":29418/"$PROJECT"
+            if [[ $GIT_REPO_BASE == "gerrit" ]]; then
+                gerrit_ssh=$(echo "$GERRIT_URL" | awk -F"/" '{print $3}')
+                git remote set-url origin ssh://"$RELEASE_USERNAME"@"$gerrit_ssh":29418/"$PROJECT"
+                echo -e "Host $gerrit_ssh\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
+                chmod 600 ~/.ssh/config
+            else
+                git remote set-url origin "$GIT_CLONE_URL""$RELEASE_USERNAME"/"$PROJECT".git
+            fi
             git config user.name "$RELEASE_USERNAME"
             git config user.email "$RELEASE_EMAIL"
-            echo -e "Host $gerrit_ssh\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
-            chmod 600 ~/.ssh/config
             git push origin "$GIT_TAG"
         fi
     fi
@@ -386,7 +421,7 @@ container_release_file(){
 
     echo "INFO: Merge will tag ref: $ref"
     git checkout "$ref"
-    tag-gerrit-repo
+    tag-git-repo
 }
 
 maven_release_file(){
@@ -403,7 +438,7 @@ maven_release_file(){
     git fetch "$PATCH_DIR/${PROJECT//\//-}.bundle"
     git merge --ff-only FETCH_HEAD
     nexus_release
-    tag-gerrit-repo
+    tag-git-repo
 }
 
 # calls pip to download binary and source distributions from the specified index,
@@ -448,7 +483,7 @@ pypi_release_file(){
         echo "INFO: uploading $filecount distributions to repo $REPOSITORY"
         $cmd
     fi
-    tag-gerrit-repo
+    tag-git-repo
 }
 
 packagecloud_verify(){
@@ -478,7 +513,39 @@ packagecloud_promote(){
         | echo "INFO: Promoted package location: \
         https://packagecloud.io$(yq -r .package_html_url)"
     git checkout "$REF"
-    tag-gerrit-repo
+    tag-git-repo
+}
+
+artifact_release_file(){
+    echo "INFO: Processing artifact release"
+    mkdir artifacts
+    ORG=$(echo "$NEXUS_URL" | awk -F'.' '{print $2}')
+
+    for namequoted in $(yq '.artifacts[].name' $release_file); do
+        pathquoted=$(yq ".artifacts[] |select(.name==$namequoted) |.path" $release_file)
+
+        #Remove extra yaml quotes
+        name="${namequoted#\"}"
+        name="${name%\"}"
+        path="${pathquoted#\"}"
+        path="${path%\"}"
+
+        echo "$name"
+        echo "$path"
+        echo "INFO: Merge will post artifact: $name"
+        # Attempt to pull from releases to see if the artifact has been released.
+        if "${NEXUS_URL}"/content/repositories/releases/org/"${ORG}"/"${VERSION}"/"$name"; then
+            echo "INFO: $name is already released as version:$VERSION, Continuing..."
+        else
+            echo "INFO: $name not found in releases, release will be prepared. Continuing..."
+            wget "${path}"/"${name}" -o artifacts/"${name}"
+            if [[ "$JOB_NAME" =~ "merge" ]] && [[ "$DRY_RUN" = false ]]; then
+                #lftools sign sigul artifacts
+                curl -v -u <NEXUSUSER>:<NEXUSPASS> --upload-file "${NEXUS_URL}"/content/repositories/releases/org/"${ORG}"/"${VERSION}"/"${name}" \;
+            fi
+            echo "#########################"
+        fi
+    done
 }
 
 ##############################  End Function Declarations  ################################
@@ -487,12 +554,26 @@ packagecloud_promote(){
 set_variables_common
 
 # Determine the type of release:
+#   - artifact, release-artifact-schema.yaml
 #   - container, release-container-schema.yaml
 #   - maven, release-schema.yaml
 #   - pypi,  release-pypi-schema.yaml
+#   - packagecloud, release-packagecloud-schema.yaml
 
 case $DISTRIBUTION_TYPE in
 
+    artifact)
+        if $USE_RELEASE_FILE ; then
+            release_schema="release-artifact-schema.yaml"
+            echo "INFO: Fetching schema $release_schema"
+            wget -q https://raw.githubusercontent.com/lfit/releng-global-jjb/master/schema/${release_schema}
+            verify_schema
+        fi
+        set_variables_artifact
+        verify_version
+        artifact_release_file
+        ;;
+
     maven)
         if $USE_RELEASE_FILE ; then
             release_schema="release-schema.yaml"