#!/usr/bin/env groovy library 'status-jenkins-lib@v1.8.7' pipeline { agent { label params.AGENT_LABEL } parameters { string( name: 'NIX_CACHE_HOST', description: 'FQDN of Nix binary cache host.', defaultValue: params.NIX_CACHE_HOST ?: 'cache-01.do-ams3.nix.ci.statusim.net' ) string( name: 'NIX_CACHE_USER', description: 'Username for Nix binary cache host.', defaultValue: params.NIX_CACHE_USER ?: 'nix-cache' ) } environment { /* See nix/README.md */ NIX_IGNORE_SYMLINK_STORE = 1 /* we source .bash_profile to be able to use nix-store */ NIX_SSHOPTS = "-oStrictHostKeyChecking=no" NIX_CONF_DIR = "${env.WORKSPACE}/nix" NIX_STORE_CMD = '/nix/var/nix/profiles/default/bin/nix-store' NIX_SSH_REMOTE = "ssh://${params.NIX_CACHE_USER}@${params.NIX_CACHE_HOST}?remote-program=${env.NIX_STORE_CMD}" } options { timestamps() disableConcurrentBuilds() /* Prevent Jenkins jobs from running forever */ timeout(time: 120, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '20', daysToKeepStr: '30', )) } stages { stage('Setup') { steps { script { nix.shell('nix-env -i openssh', sandbox: false, pure: false) /* some build targets don't build on MacOS */ os = sh(script: 'uname', returnStdout: true).trim() arch = sh(script: 'arch', returnStdout: true).trim() } } } stage('Build status-go') { steps { script { def platforms = ['mobile.android', 'mobile.ios', 'library'] if (os != 'Darwin') { platforms.removeAll { it == 'mobile.ios' } } /* FIXME: "'x86_64-darwin' with features {} is required to build" */ if (arch == 'arm64') { platforms.removeAll { it == 'mobile.android' } } platforms.each { platform -> /* Allow for Android builds on Apple ARM. */ env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, platform) nix.build( attr: "targets.status-go.${platform}", sandbox: false, link: false ) } } } } stage('Build android jsbundle') { steps { script { /* Build/fetch deps required for jsbundle build. */ nix.build( attr: 'targets.mobile.jsbundle', sandbox: false, pure: false, link: false ) } } } stage('Build android deps') { steps { script { /* Allow for Android builds on Apple ARM. */ env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, 'android') /* Build/fetch deps required to build android release. */ nix.build( attr: 'targets.mobile.android.build.buildInputs', sandbox: false, pure: false, link: false ) } } } stage('Build nix shell deps') { steps { script { def shells = ['android', 'ios', 'fastlane', 'keytool', 'clojure', 'gradle'] if (os != 'Darwin') { shells.removeAll { it == 'ios' } } /* FIXME: "'x86_64-darwin' with features {} is required to build" */ if (arch == 'arm64') { shells.removeAll { it == 'android' } } /* Build/fetch deps required to start default Nix shell. */ shells.each { shell -> /* Allow for Android builds on Apple ARM. */ env.NIXPKGS_SYSTEM_OVERRIDE = nixSysOverride(os, arch, shell) nix.build( attr: "shells.${shell}.buildInputs", sandbox: false, link: false ) } } } } stage('Upload') { steps { script { sshagent(credentials: ['nix-cache-ssh']) { nix.shell(""" find /nix/store/ -mindepth 1 -maxdepth 1 -type d \ -not -name '*.links' -and -not -name '*-status-mobile-*' \ | xargs nix copy --to ${NIX_SSH_REMOTE} """, pure: false ) } } } } } post { always { script { nix.shell('nix-store --optimize', pure: false) nix.shell('nix/scripts/clean.sh', pure: false) } } } } def nixSysOverride(os, arch, target='android') { return ( os == 'Darwin' && arch == 'arm64' && target =~ /.*android$/ ) ? 'x86_64-darwin' : '' }