summaryrefslogtreecommitdiff
path: root/bin/build-packages
blob: 859069f31be270c4a15515e1c138a9890cb15b36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/bash

# build packages one by one, then upload the binary package to the repository server
# Details:
#  https://github.com/archlinux32/builder/wiki/Build-system#build-packages

# TODOs:
#  use different build commands for different repositories - do we need this actually?
#  send logs of failed builds
#  handle failed uploads to the build master

. "${0%/*}/../conf/default.conf"

while true; do

  package="$(
    ssh \
      -i "${master_build_server_identity}" \
      -p "${master_build_server_port}" \
      "${master_build_server_user}@${master_build_server}" \
      'get-assignment'
  )"

  case $? in

    #  0: ok, I gave you an assignment
    0)
      repository="${package##* }"
      package="${package% *}"
      mod_git_revision="${package##* }"
      package="${package% *}"
      git_revision="${package##* }"
      package="${package% *}"

      # Update git repositories (official packages, community packages and the repository of package customizations).

      for repo in "${repo_paths[@]}"; do
        git -C "${repo}" clean -df
        git -C "${repo}" reset --hard
        git -C "${repo}" checkout master
        git -C "${repo}" pull
      done

      git -C "${repo_paths["$(find_repository_with_commit "${git_revision}")"]}" checkout "${git_revision}" &> /dev/null
      git -C "${repo_paths["archlinux32"]}" checkout "${mod_git_revision}" &> /dev/null

      PKGBUILD="$(find_pkgbuild "${package}" "${repository}")"

      if [ ! -r "${PKGBUILD}" ]; then
        echo "can't find PKGBUILD to package '${package}' from repository '${repository}': '${PKGBUILD}'"
        exit 1
      fi

      cd "${PKGBUILD%/*}"
      success=false
      for parameters in '' '-c'; do
        rm -f *.pkg.tar.xz
        if staging-i686-build ${parameters}; then
        # build successful
          ls -1 *.pkg.tar.xz | \
            xargs -rn1 gpg --detach-sign
          tar -c *.pkg.tar.xz{,.sig} | \
            ssh \
              -i "${master_build_server_identity}" \
              -p "${master_build_server_port}" \
              "${master_build_server_user}@${master_build_server}" \
              'return-assignment' "${package}" "${git_revision}" "${mod_git_revision}" "${repository}"
          success=true
          break
        fi
      done

      if ! ${success}; then
        ssh \
          -i "${master_build_server_identity}" \
          -p "${master_build_server_port}" \
          "${master_build_server_user}@${master_build_server}" \
          'return-assignment' "${package}" "${git_revision}" "${mod_git_revision}" "${repository}" 'ERROR'
      fi

echo 'This is the end.'
exit 0

      continue

    ;;

    #  1: come back (shortly) later - I was running already
    1)
      sleep $[15+$RANDOM%30]
      continue
    ;;

    #  2: come back later - there are still packages to be built,
    #     but currently none has all its dependencies ready
    2)
      sleep $[60+$RANDOM%30]
      continue
    ;;

    #  3: come back after the next run of get-package-updates - currently
    #     there are no pending packages
    3)

      >&2 echo 'Done. No more packages left to build.'
      exit 0

    ;;

    #  4: come back, when you've done your work - you hit the limit on
    #     maximum allowed parallel jobs per ip
    4)

      >&2 echo 'ERROR: There are too many parallel builds running on this machine.'
      exit 1

    ;;

    *)

      >&2 echo "ERROR: Unknown exit code $?."
      exit 1

    ;;

  esac

done