Skip to content
This repository was archived by the owner on Mar 11, 2024. It is now read-only.

Commit c539b65

Browse files
Bot Updating Templated Files
1 parent a2cae14 commit c539b65

File tree

1 file changed

+131
-12
lines changed

1 file changed

+131
-12
lines changed

Jenkinsfile

Lines changed: 131 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pipeline {
1616
GITHUB_TOKEN=credentials('498b4638-2d02-4ce5-832d-8a57d01d97ab')
1717
GITLAB_TOKEN=credentials('b6f0f1dd-6952-4cf6-95d1-9c06380283f0')
1818
GITLAB_NAMESPACE=credentials('gitlab-namespace-id')
19+
SCARF_TOKEN=credentials('scarf_api_key')
1920
BUILD_VERSION_ARG = 'OS'
2021
LS_USER = 'linuxserver'
2122
LS_REPO = 'docker-readme-sync'
@@ -49,7 +50,7 @@ pipeline {
4950
env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT
5051
env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
5152
env.PULL_REQUEST = env.CHANGE_ID
52-
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.md ./.github/ISSUE_TEMPLATE/issue.feature.md ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/stale.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
53+
env.TEMPLATED_FILES = 'Jenkinsfile README.md LICENSE .editorconfig ./.github/CONTRIBUTING.md ./.github/FUNDING.yml ./.github/ISSUE_TEMPLATE/config.yml ./.github/ISSUE_TEMPLATE/issue.bug.md ./.github/ISSUE_TEMPLATE/issue.feature.md ./.github/PULL_REQUEST_TEMPLATE.md ./.github/workflows/external_trigger_scheduler.yml ./.github/workflows/greetings.yml ./.github/workflows/package_trigger_scheduler.yml ./.github/workflows/stale.yml ./.github/workflows/external_trigger.yml ./.github/workflows/package_trigger.yml'
5354
}
5455
script{
5556
env.LS_RELEASE_NUMBER = sh(
@@ -108,6 +109,30 @@ pipeline {
108109
env.EXT_RELEASE_CLEAN = sh(
109110
script: '''echo ${EXT_RELEASE} | sed 's/[~,%@+;:/]//g' ''',
110111
returnStdout: true).trim()
112+
113+
def semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)\.(\d+)/
114+
if (semver.find()) {
115+
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${semver[0][3]}"
116+
} else {
117+
semver = env.EXT_RELEASE_CLEAN =~ /(\d+)\.(\d+)(?:\.(\d+))?(.*)/
118+
if (semver.find()) {
119+
if (semver[0][3]) {
120+
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${semver[0][3]}"
121+
} else if (!semver[0][3] && !semver[0][4]) {
122+
env.SEMVER = "${semver[0][1]}.${semver[0][2]}.${(new Date()).format('YYYYMMdd')}"
123+
}
124+
}
125+
}
126+
127+
if (env.SEMVER != null) {
128+
if (BRANCH_NAME != "master" && BRANCH_NAME != "main") {
129+
env.SEMVER = "${env.SEMVER}-${BRANCH_NAME}"
130+
}
131+
println("SEMVER: ${env.SEMVER}")
132+
} else {
133+
println("No SEMVER detected")
134+
}
135+
111136
}
112137
}
113138
}
@@ -122,6 +147,7 @@ pipeline {
122147
env.IMAGE = env.DOCKERHUB_IMAGE
123148
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/' + env.CONTAINER_NAME
124149
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/' + env.CONTAINER_NAME
150+
env.QUAYIMAGE = 'quay.io/linuxserver.io/' + env.CONTAINER_NAME
125151
if (env.MULTIARCH == 'true') {
126152
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-ls' + env.LS_TAG_NUMBER
127153
} else {
@@ -144,6 +170,7 @@ pipeline {
144170
env.IMAGE = env.DEV_DOCKERHUB_IMAGE
145171
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lsiodev-' + env.CONTAINER_NAME
146172
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lsiodev-' + env.CONTAINER_NAME
173+
env.QUAYIMAGE = 'quay.io/linuxserver.io/lsiodev-' + env.CONTAINER_NAME
147174
if (env.MULTIARCH == 'true') {
148175
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
149176
} else {
@@ -166,6 +193,7 @@ pipeline {
166193
env.IMAGE = env.PR_DOCKERHUB_IMAGE
167194
env.GITHUBIMAGE = 'ghcr.io/' + env.LS_USER + '/lspipepr-' + env.CONTAINER_NAME
168195
env.GITLABIMAGE = 'registry.gitlab.com/linuxserver.io/' + env.LS_REPO + '/lspipepr-' + env.CONTAINER_NAME
196+
env.QUAYIMAGE = 'quay.io/linuxserver.io/lspipepr-' + env.CONTAINER_NAME
169197
if (env.MULTIARCH == 'true') {
170198
env.CI_TAGS = 'amd64-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v7-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE_CLEAN + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
171199
} else {
@@ -252,7 +280,6 @@ pipeline {
252280
git clone https://github.com/${LS_USER}/${LS_REPO}.git ${TEMPDIR}/repo/${LS_REPO}
253281
cd ${TEMPDIR}/repo/${LS_REPO}
254282
git checkout -f master
255-
cd ${TEMPDIR}/docker-${CONTAINER_NAME}
256283
for i in ${TEMPLATES_TO_DELETE}; do
257284
git rm "${i}"
258285
done
@@ -343,13 +370,45 @@ pipeline {
343370
"visibility":"public"}' '''
344371
}
345372
}
373+
/* #######################
374+
Scarf.sh package registry
375+
####################### */
376+
// Add package to Scarf.sh and set permissions
377+
stage("Scarf.sh package registry"){
378+
when {
379+
branch "master"
380+
environment name: 'EXIT_STATUS', value: ''
381+
}
382+
steps{
383+
sh '''#! /bin/bash
384+
set -e
385+
PACKAGE_UUID=$(curl -X GET -H "Authorization: Bearer ${SCARF_TOKEN}" https://scarf.sh/api/v1/organizations/linuxserver-ci/packages | jq -r '.[] | select(.name=="linuxserver/readme-sync") | .uuid')
386+
if [ -z "${PACKAGE_UUID}" ]; then
387+
echo "Adding package to Scarf.sh"
388+
curl -sX POST https://scarf.sh/api/v1/organizations/linuxserver-ci/packages \
389+
-H "Authorization: Bearer ${SCARF_TOKEN}" \
390+
-H "Content-Type: application/json" \
391+
-d '{"name":"linuxserver/readme-sync",\
392+
"shortDescription":"example description",\
393+
"libraryType":"docker",\
394+
"website":"https://github.com/linuxserver/docker-readme-sync",\
395+
"backendUrl":"https://ghcr.io/linuxserver/readme-sync",\
396+
"publicUrl":"https://lscr.io/linuxserver/readme-sync"}' || :
397+
else
398+
echo "Package already exists on Scarf.sh"
399+
fi
400+
'''
401+
}
402+
}
346403
/* ###############
347404
Build Container
348405
############### */
349406
// Build Docker container for push to LS Repo
350407
stage('Build-Single') {
351408
when {
352-
environment name: 'MULTIARCH', value: 'false'
409+
expression {
410+
env.MULTIARCH == 'false' || params.PACKAGE_CHECK == 'true'
411+
}
353412
environment name: 'EXIT_STATUS', value: ''
354413
}
355414
steps {
@@ -374,7 +433,10 @@ pipeline {
374433
// Build MultiArch Docker containers for push to LS Repo
375434
stage('Build-Multi') {
376435
when {
377-
environment name: 'MULTIARCH', value: 'true'
436+
allOf {
437+
environment name: 'MULTIARCH', value: 'true'
438+
expression { params.PACKAGE_CHECK == 'false' }
439+
}
378440
environment name: 'EXIT_STATUS', value: ''
379441
}
380442
parallel {
@@ -479,7 +541,7 @@ pipeline {
479541
sh '''#! /bin/bash
480542
set -e
481543
TEMPDIR=$(mktemp -d)
482-
if [ "${MULTIARCH}" == "true" ]; then
544+
if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
483545
LOCAL_CONTAINER=${IMAGE}:amd64-${META_TAG}
484546
else
485547
LOCAL_CONTAINER=${IMAGE}:${META_TAG}
@@ -494,6 +556,15 @@ pipeline {
494556
apt list -qq --installed | sed "s#/.*now ##g" | cut -d" " -f1 > /tmp/package_versions.txt && \
495557
sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
496558
chmod 777 /tmp/package_versions.txt'
559+
elif [ "${DIST_IMAGE}" == "fedora" ]; then
560+
docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
561+
rpm -qa > /tmp/package_versions.txt && \
562+
sort -o /tmp/package_versions.txt /tmp/package_versions.txt && \
563+
chmod 777 /tmp/package_versions.txt'
564+
elif [ "${DIST_IMAGE}" == "arch" ]; then
565+
docker run --rm --entrypoint '/bin/sh' -v ${TEMPDIR}:/tmp ${LOCAL_CONTAINER} -c '\
566+
pacman -Q > /tmp/package_versions.txt && \
567+
chmod 777 /tmp/package_versions.txt'
497568
fi
498569
NEW_PACKAGE_TAG=$(md5sum ${TEMPDIR}/package_versions.txt | cut -c1-8 )
499570
echo "Package tag sha from current packages in buit container is ${NEW_PACKAGE_TAG} comparing to old ${PACKAGE_TAG} from github"
@@ -531,7 +602,7 @@ pipeline {
531602
steps {
532603
sh '''#! /bin/bash
533604
echo "Packages were updated. Cleaning up the image and exiting."
534-
if [ "${MULTIARCH}" == "true" ]; then
605+
if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
535606
docker rmi ${IMAGE}:amd64-${META_TAG}
536607
else
537608
docker rmi ${IMAGE}:${META_TAG}
@@ -555,7 +626,7 @@ pipeline {
555626
steps {
556627
sh '''#! /bin/bash
557628
echo "There are no package updates. Cleaning up the image and exiting."
558-
if [ "${MULTIARCH}" == "true" ]; then
629+
if [ "${MULTIARCH}" == "true" ] && [ "${PACKAGE_CHECK}" == "false" ]; then
559630
docker rmi ${IMAGE}:amd64-${META_TAG}
560631
else
561632
docker rmi ${IMAGE}:${META_TAG}
@@ -610,7 +681,7 @@ pipeline {
610681
-e DO_REGION="ams3" \
611682
-e DO_BUCKET="lsio-ci" \
612683
-t ghcr.io/linuxserver/ci:latest \
613-
python /ci/ci.py'''
684+
python3 test_build.py'''
614685
}
615686
}
616687
}
@@ -630,6 +701,12 @@ pipeline {
630701
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
631702
usernameVariable: 'DOCKERUSER',
632703
passwordVariable: 'DOCKERPASS'
704+
],
705+
[
706+
$class: 'UsernamePasswordMultiBinding',
707+
credentialsId: 'Quay.io-Robot',
708+
usernameVariable: 'QUAYUSER',
709+
passwordVariable: 'QUAYPASS'
633710
]
634711
]) {
635712
retry(5) {
@@ -638,22 +715,32 @@ pipeline {
638715
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
639716
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
640717
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
641-
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do
718+
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
719+
for PUSHIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
642720
docker tag ${IMAGE}:${META_TAG} ${PUSHIMAGE}:${META_TAG}
643721
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:latest
644722
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${EXT_RELEASE_TAG}
723+
if [ -n "${SEMVER}" ]; then
724+
docker tag ${PUSHIMAGE}:${META_TAG} ${PUSHIMAGE}:${SEMVER}
725+
fi
645726
docker push ${PUSHIMAGE}:latest
646727
docker push ${PUSHIMAGE}:${META_TAG}
647728
docker push ${PUSHIMAGE}:${EXT_RELEASE_TAG}
729+
if [ -n "${SEMVER}" ]; then
730+
docker push ${PUSHIMAGE}:${SEMVER}
731+
fi
648732
done
649733
'''
650734
}
651735
sh '''#! /bin/bash
652-
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do
736+
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
653737
docker rmi \
654738
${DELETEIMAGE}:${META_TAG} \
655739
${DELETEIMAGE}:${EXT_RELEASE_TAG} \
656740
${DELETEIMAGE}:latest || :
741+
if [ -n "${SEMVER}" ]; then
742+
docker rmi ${DELETEIMAGE}:${SEMVER} || :
743+
fi
657744
done
658745
'''
659746
}
@@ -672,6 +759,12 @@ pipeline {
672759
credentialsId: '3f9ba4d5-100d-45b0-a3c4-633fd6061207',
673760
usernameVariable: 'DOCKERUSER',
674761
passwordVariable: 'DOCKERPASS'
762+
],
763+
[
764+
$class: 'UsernamePasswordMultiBinding',
765+
credentialsId: 'Quay.io-Robot',
766+
usernameVariable: 'QUAYUSER',
767+
passwordVariable: 'QUAYPASS'
675768
]
676769
]) {
677770
retry(5) {
@@ -680,13 +773,14 @@ pipeline {
680773
echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
681774
echo $GITHUB_TOKEN | docker login ghcr.io -u LinuxServer-CI --password-stdin
682775
echo $GITLAB_TOKEN | docker login registry.gitlab.com -u LinuxServer.io --password-stdin
776+
echo $QUAYPASS | docker login quay.io -u $QUAYUSER --password-stdin
683777
if [ "${CI}" == "false" ]; then
684778
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER}
685779
docker pull ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER}
686780
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm32v7-${META_TAG}
687781
docker tag ghcr.io/linuxserver/lsiodev-buildcache:arm64v8-${COMMIT_SHA}-${BUILD_NUMBER} ${IMAGE}:arm64v8-${META_TAG}
688782
fi
689-
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}"; do
783+
for MANIFESTIMAGE in "${IMAGE}" "${GITLABIMAGE}" "${GITHUBIMAGE}" "${QUAYIMAGE}"; do
690784
docker tag ${IMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${META_TAG}
691785
docker tag ${IMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${META_TAG}
692786
docker tag ${IMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${META_TAG}
@@ -696,6 +790,11 @@ pipeline {
696790
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
697791
docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG}
698792
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
793+
if [ -n "${SEMVER}" ]; then
794+
docker tag ${MANIFESTIMAGE}:amd64-${META_TAG} ${MANIFESTIMAGE}:amd64-${SEMVER}
795+
docker tag ${MANIFESTIMAGE}:arm32v7-${META_TAG} ${MANIFESTIMAGE}:arm32v7-${SEMVER}
796+
docker tag ${MANIFESTIMAGE}:arm64v8-${META_TAG} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
797+
fi
699798
docker push ${MANIFESTIMAGE}:amd64-${META_TAG}
700799
docker push ${MANIFESTIMAGE}:arm32v7-${META_TAG}
701800
docker push ${MANIFESTIMAGE}:arm64v8-${META_TAG}
@@ -705,6 +804,11 @@ pipeline {
705804
docker push ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG}
706805
docker push ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG}
707806
docker push ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
807+
if [ -n "${SEMVER}" ]; then
808+
docker push ${MANIFESTIMAGE}:amd64-${SEMVER}
809+
docker push ${MANIFESTIMAGE}:arm32v7-${SEMVER}
810+
docker push ${MANIFESTIMAGE}:arm64v8-${SEMVER}
811+
fi
708812
docker manifest push --purge ${MANIFESTIMAGE}:latest || :
709813
docker manifest create ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:amd64-latest ${MANIFESTIMAGE}:arm32v7-latest ${MANIFESTIMAGE}:arm64v8-latest
710814
docker manifest annotate ${MANIFESTIMAGE}:latest ${MANIFESTIMAGE}:arm32v7-latest --os linux --arch arm
@@ -717,14 +821,23 @@ pipeline {
717821
docker manifest create ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:amd64-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG}
718822
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm32v7-${EXT_RELEASE_TAG} --os linux --arch arm
719823
docker manifest annotate ${MANIFESTIMAGE}:${EXT_RELEASE_TAG} ${MANIFESTIMAGE}:arm64v8-${EXT_RELEASE_TAG} --os linux --arch arm64 --variant v8
824+
if [ -n "${SEMVER}" ]; then
825+
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER} || :
826+
docker manifest create ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:amd64-${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER}
827+
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm32v7-${SEMVER} --os linux --arch arm
828+
docker manifest annotate ${MANIFESTIMAGE}:${SEMVER} ${MANIFESTIMAGE}:arm64v8-${SEMVER} --os linux --arch arm64 --variant v8
829+
fi
720830
docker manifest push --purge ${MANIFESTIMAGE}:latest
721831
docker manifest push --purge ${MANIFESTIMAGE}:${META_TAG}
722832
docker manifest push --purge ${MANIFESTIMAGE}:${EXT_RELEASE_TAG}
833+
if [ -n "${SEMVER}" ]; then
834+
docker manifest push --purge ${MANIFESTIMAGE}:${SEMVER}
835+
fi
723836
done
724837
'''
725838
}
726839
sh '''#! /bin/bash
727-
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${IMAGE}"; do
840+
for DELETEIMAGE in "${GITHUBIMAGE}" "${GITLABIMAGE}" "${QUAYIMAGE}" "${IMAGE}"; do
728841
docker rmi \
729842
${DELETEIMAGE}:amd64-${META_TAG} \
730843
${DELETEIMAGE}:amd64-latest \
@@ -735,6 +848,12 @@ pipeline {
735848
${DELETEIMAGE}:arm64v8-${META_TAG} \
736849
${DELETEIMAGE}:arm64v8-latest \
737850
${DELETEIMAGE}:arm64v8-${EXT_RELEASE_TAG} || :
851+
if [ -n "${SEMVER}" ]; then
852+
docker rmi \
853+
${DELETEIMAGE}:amd64-${SEMVER} \
854+
${DELETEIMAGE}:arm32v7-${SEMVER} \
855+
${DELETEIMAGE}:arm64v8-${SEMVER} || :
856+
fi
738857
done
739858
docker rmi \
740859
ghcr.io/linuxserver/lsiodev-buildcache:arm32v7-${COMMIT_SHA}-${BUILD_NUMBER} \

0 commit comments

Comments
 (0)