version: 2.1 ###################################### # PIPELINE PARAMETERS ###################################### parameters: action: type: enum enum: [no_action, nightly_build, manual_build, release_build, afs_collector] default: no_action release_version: type: string default: "NO_RELEASE_VERSION_SET" ###################################### # REUSABLE COMMANDS ###################################### commands: update_config_mk: description: "Update variables in config.mk" steps: - run: name: Update Config.mk command: | export MY_WORKING_DIRECTORY=`pwd` printf -v BUILD_DATE '%(%Y%m%d)T' -1 sed -i "s/NoCall/${BUILD_DATE}/g" ${MY_WORKING_DIRECTORY}/config.mk sed -i "s/MAKE_ARGS=-j3/MAKE_ARGS=-j9/g" ${MY_WORKING_DIRECTORY}/config.mk cat ${MY_WORKING_DIRECTORY}/config.mk update_config_mk_release: description: "Update variables in config.mk for release" steps: - run: name: Update Config.mk Release command: | export MY_WORKING_DIRECTORY=`pwd` sed -i "s/FW_VERSION=\$(PRIVATE_BUILD_VERSION)-\$(GIT_COMMIT)/FW_VERSION=\$(PRIVATE_BUILD_VERSION)/g" ${MY_WORKING_DIRECTORY}/Makefile sed -i "s/NoCall/<< pipeline.parameters.release_version >>/g" ${MY_WORKING_DIRECTORY}/config.mk sed -i "s/releases\/3\/24/<< pipeline.parameters.release_version >>/g" ${MY_WORKING_DIRECTORY}/config.mk sed -i "s/MAKE_ARGS=-j3/MAKE_ARGS=-j9/g" ${MY_WORKING_DIRECTORY}/config.mk sed -i "s/develop/<< pipeline.parameters.release_version >>/g" ${MY_WORKING_DIRECTORY}/feeds.conf cat ${MY_WORKING_DIRECTORY}/config.mk ###################################### # JOBS ###################################### jobs: build: resource_class: xlarge docker: - image: arednmesh/builder steps: - checkout - update_config_mk - run: name: Build ath79/generic command: make MAINTARGET=ath79 SUBTARGET=generic no_output_timeout: 2h - run: name: Build ath79/tiny command: make MAINTARGET=ath79 SUBTARGET=tiny no_output_timeout: 1h - run: name: Build ath79/mikrotik command: make MAINTARGET=ath79 SUBTARGET=mikrotik no_output_timeout: 1h - run: name: Build ath79/mikrotik/ath10k command: make MAINTARGET=ath79 SUBTARGET=mikrotik ALTTARGET=ath10k no_output_timeout: 1h - run: name: Build ath79/mikrotik/nand command: make MAINTARGET=ath79 SUBTARGET=mikrotik ALTTARGET=nand no_output_timeout: 1h - run: name: Build ath79/nand command: make MAINTARGET=ath79 SUBTARGET=nand no_output_timeout: 1h - run: name: Build ipq40xx/generic command: make MAINTARGET=ipq40xx SUBTARGET=generic no_output_timeout: 2h - run: name: Build ipq40xx/mikrotik command: make MAINTARGET=ipq40xx SUBTARGET=mikrotik no_output_timeout: 1h - run: name: Build x64/64 command: make MAINTARGET=x86 SUBTARGET=64 no_output_timeout: 2h - run: name: Build ramips/mt7621 command: make MAINTARGET=ramips SUBTARGET=mt7621 no_output_timeout: 2h - run: name: Compress build files command: tar -cjf ~/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} -C ${MY_WORKING_DIRECTORY}/${ARTIFACTS_DIR} . - run: name: Deploy Files command: scp -P ${SSH_PORT} -o StrictHostKeyChecking=no ~/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} ${SSH_USER}@${SSH_HOST2}:${TARGET_DIR} build_release: resource_class: xlarge docker: - image: arednmesh/builder steps: - checkout - update_config_mk_release - run: name: Build ath79/generic command: make MAINTARGET=ath79 SUBTARGET=generic no_output_timeout: 2h - run: name: Build ath79/tiny command: make MAINTARGET=ath79 SUBTARGET=tiny no_output_timeout: 1h - run: name: Build ath79/mikrotik command: make MAINTARGET=ath79 SUBTARGET=mikrotik no_output_timeout: 1h - run: name: Build ath79/mikrotik/ath10k command: make MAINTARGET=ath79 SUBTARGET=mikrotik ALTTARGET=ath10k no_output_timeout: 1h - run: name: Build ath79/mikrotik/nand command: make MAINTARGET=ath79 SUBTARGET=mikrotik ALTTARGET=nand no_output_timeout: 1h - run: name: Build ath79/nand command: make MAINTARGET=ath79 SUBTARGET=nand no_output_timeout: 1h - run: name: Build ipq40xx/generic command: make MAINTARGET=ipq40xx SUBTARGET=generic no_output_timeout: 2h - run: name: Build ipq40xx/mikrotik command: make MAINTARGET=ipq40xx SUBTARGET=mikrotik no_output_timeout: 1h - run: name: Build x64/64 command: make MAINTARGET=x86 SUBTARGET=64 no_output_timeout: 2h - run: name: Build ramips/mt7621 command: make MAINTARGET=ramips SUBTARGET=mt7621 no_output_timeout: 2h - run: name: Compress build files command: tar -cjf ~/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} -C ${MY_WORKING_DIRECTORY}/${ARTIFACTS_DIR} . - run: name: Deploy Files command: scp -P ${SSH_PORT} -o StrictHostKeyChecking=no ~/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} ${SSH_USER}@${SSH_HOST2}:${TARGET_DIR} check2build: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Retrieve last build info and check command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c ' ~/needs2build.sh ${CIRCLE_PROJECT_USERNAME} ${CIRCLE_PROJECT_REPONAME} ${CIRCLE_BRANCH} ${CIRCLE_SHA1}'" - run: name: Check2build failure (build not needed) when: on_fail command: circleci-agent step halt save_build_info: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Save last build info command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c ' echo ${CIRCLE_SHA1} > ~/build_info/${CIRCLE_PROJECT_USERNAME}_${CIRCLE_PROJECT_REPONAME}_${CIRCLE_BRANCH}'" process_artifacts_nightly: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Untar Files command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'tar -xjf ${TARGET_DIR}/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} -C ${TARGET_DIR}'" - run: name: Empty nightly dir command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'rm -rf ${NIGHTLY_DIR}'" - run: name: Create nightly dir command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mkdir -p ${NIGHTLY_DIR}'" - run: name: Move targets command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mv ${TARGET_DIR}/targets ${NIGHTLY_DIR}'" - run: name: Move packages command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mv ${TARGET_DIR}/packages ${NIGHTLY_DIR}'" process_artifacts_release: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Untar Files command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'tar -xjf ${TARGET_DIR}/${CIRCLE_BRANCH}_${ARTIFACTS_FILE} -C ${TARGET_DIR}'" changelog_nightly: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Generate changelog.md command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c \"github_changelog_generator -u ${CIRCLE_PROJECT_USERNAME} -p ${CIRCLE_PROJECT_REPONAME} -t ${GITHUB_TOKEN} --bug-labels __ignore__ --enhancement-labels 'enhancement,Enhancement,bug,Bug,new ui feature request,new ui,new hardware support' --enhancement-label '**Bug fixes and Enhancements:**' --no-issues-wo-labels\"" - run: name: Move changelog command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mv ~/CHANGELOG.md ${NIGHTLY_DIR}'" readme_nightly: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Fetch README.md command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'wget https://raw.githubusercontent.com/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_BRANCH}/README.md'" - run: name: Move README.md command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mv ~/README.md ${NIGHTLY_DIR}/readme.md'" - run: name: Fetch SUPPORTED_DEVICES.md command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'wget https://raw.githubusercontent.com/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_BRANCH}/SUPPORTED_DEVICES.md'" - run: name: Move SUPPORTED_DEVICES.md command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c 'mv ~/SUPPORTED_DEVICES.md ${NIGHTLY_DIR}/SUPPORTED_DEVICES.md'" afs_collector: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Run AFS collector command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "sh -c '${DOWNLOADS_DOCROOT}/afs/misc/collect.py ${DOWNLOADS_DOCROOT} ${DOWNLOADS_DOCROOT}/afs/www'" post_to_slack: machine: image: ubuntu-2004:2023.02.1 steps: - run: name: Post to Slack command: ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST2} "./post-nightly.sh $(printf '%(%Y%m%d)T')-$(echo ${CIRCLE_SHA1} | cut -c '-7')" no_action: machine: image: ubuntu-2004:2023.02.1 steps: - run: echo "No action needed" ###################################### # Workflows ###################################### workflows: no_action_default: when: equal: [ no_action, << pipeline.parameters.action >> ] jobs: - no_action nightly_build: when: equal: [ nightly_build, << pipeline.parameters.action >> ] jobs: - check2build - build: requires: - check2build - process_artifacts_nightly: requires: - build - readme_nightly: requires: - process_artifacts_nightly - changelog_nightly: requires: - process_artifacts_nightly - afs_collector: requires: - process_artifacts_nightly - save_build_info: requires: - process_artifacts_nightly - post_to_slack: requires: - afs_collector manual_build: when: equal: [ manual_build, << pipeline.parameters.action >> ] jobs: - build - process_artifacts_nightly: requires: - build - readme_nightly: requires: - process_artifacts_nightly - changelog_nightly: requires: - process_artifacts_nightly - afs_collector: requires: - process_artifacts_nightly - save_build_info: requires: - process_artifacts_nightly release_build: when: equal: [ release_build, << pipeline.parameters.action >> ] jobs: - build_release - process_artifacts_release: requires: - build_release - readme_nightly: requires: - process_artifacts_release - changelog_nightly: requires: - process_artifacts_release - afs_collector: requires: - process_artifacts_release - save_build_info: requires: - process_artifacts_release afs_collector_workflow: when: equal: [ afs_collector, << pipeline.parameters.action >> ] jobs: - afs_collector