//When setting up this pipeline, please enable SCM branch to '*/Main'

pipeline {
    agent none
    options {
     skipDefaultCheckout()
     buildDiscarder(logRotator(numToKeepStr: '2', artifactNumToKeepStr: '1'))
    }
    stages {
        stage('BuildAndTest') {
            matrix {
                agent {
                    label "AlpinePKG-Builder && ${Arch}"
                }
                axes {
                    axis {
                        name 'Arch'
                        values 'amd64', 'aarch64'
                    }
                }
                stages {
                    stage('Prepair') {
                        steps {
                            echo "Prepairing on ${Arch}"
                            cleanWs()
                            // Checkout the repository
                            dir('AlpinePackages') {
                                checkout scm
                            }
                            
                            sh 'if [ ! -L out ];then ln -s ~/packages/AlpinePackages ./out;fi'
                            
                            script{
                                def PkgArchs = ['x86_64', 'aarch64', 'armhf','armv7']
                                def PackageList = sh script: "cd AlpinePackages && ls -d */ | tr -d '/'", returnStdout: true
                                def NativeArch  = sh script: "cat /etc/apk/arch | tr -d '\n'", returnStdout: true
                                env.NativeArch = NativeArch
                                def NativeArchNormalized = sh script: '''
                                    	case "$NativeArch" in
                                            x86 | i[3456]86 | x86_64) printf 'x86';;
                                            armhf | armv[4-9] | aarch64 ) printf 'arm';;
                                            *) printf "$1";;
                                        esac
                                ''', returnStdout: true

                                

                                for(PkgArch in PkgArchs){
                                    env.NativeArchNormalized = NativeArchNormalized
                                    env.PkgArch = PkgArch
                                    
                                    def PkgArchNormalized = sh script: '''
                                    	case "$PkgArch" in
                                            x86 | i[3456]86 | x86_64) printf 'x86';;
                                            armhf | armv[4-9] | aarch64 ) printf 'arm';;
                                            *) printf "$1";;
                                        esac
                                    ''', returnStdout: true

                                   
                                     if("${NativeArch}" == "${PkgArch}") { 
                                        println("Building ${PkgArch}(${PkgArchNormalized}) Native on ${NativeArch}(${NativeArchNormalized})")
                                        
                                        sh '''
                                            rm -rf /home/jenkins/packages/AlpinePackages/$PkgArch
                                            doas apk update
                                        '''

                                        for(Package in  PackageList.split()) { 
                                            env.Package = Package
                                            env.PkgArch =  PkgArch
                                            stage("Build ${Package} on ${PkgArch}") {
                                                catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') {
                                                sh '''
                                                cd  $WORKSPACE/AlpinePackages/$Package
                                                abuild clean
                                                abuild cleancache
                                                #abuild cleanpkg
                                                abuild -r
                                                '''
                                                }
                                            }
                                        }
                                    } else if("${NativeArchNormalized}" == "${PkgArchNormalized}") {  
                                      println("Building ${PkgArch} ${PkgArch}(${PkgArchNormalized}) Chrooted on ${NativeArch}(${NativeArchNormalized})")
                                      sh '''
                                      rm -rf /chroot/$PkgArch/home/jenkins/packages/AlpinePackages/$PkgArch
                                      rm -rf /chroot/$PkgArch/home/jenkins/AlpinePackages
                                      cp -r -p $WORKSPACE/AlpinePackages /chroot/$PkgArch/home/jenkins/AlpinePackages
                                      doas chroot /chroot/$PkgArch  /sbin/apk update

                                      echo '#!/bin/ash
                                      cd  /home/jenkins/AlpinePackages/$1
                                      doas -u jenkins abuild clean
                                      doas -u jenkins abuild cleancache
                                      #doas -u jenkins abuild cleanpkg
                                      doas -u jenkins abuild -r
                                      ' > /chroot/$PkgArch/home/jenkins/RunBuild.sh

                                      chmod +x /chroot/$PkgArch/home/jenkins/RunBuild.sh
                                      '''

                                        for(Package in  PackageList.split()) { 
                                            env.Package = Package
                                            env.PkgArch =  PkgArch
                                            stage("Build ${Package} on ${PkgArch}") {
                                                catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') {
                                                sh 'doas chroot /chroot/$PkgArch  /home/jenkins/RunBuild.sh $Package'
                                                }
                                            }
                                        }


                                    } else{
                                        println("Skipping ${PkgArch}(${PkgArchNormalized}) on ${NativeArch}(${NativeArchNormalized})")
                                    }
                                }

                                stage("Collecting packages form ${NativeArchNormalized}") {
                                    archiveArtifacts allowEmptyArchive: true, artifacts: 'out/**/*.apk', onlyIfSuccessful: true
                                }
                                
                                stage("Uploading packages to repo form ${NativeArchNormalized}") {
                                    withCredentials([usernamePassword(credentialsId: 'GiteaPKGPUploadAuth', usernameVariable: 'UploadUsername', passwordVariable: 'UploadPassword')]) {
                                        sh '''
                                            AlpineRelease=v$(awk -F= '$1=="VERSION_ID" { print $2 ;}' /etc/os-release | cut -d"." -f 1,2)
                                            for apkFile in $(find -L ~/packages -name '*.apk');
                                            do
                                                echo "Uploading $apkFile"
                                                curl --user $UploadUsername:$UploadPassword --upload-file $apkFile https://git.bprieshof.nl/api/packages/brammp/alpine/$AlpineRelease/pkgs
                                            done;
                                        '''
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}