|
1 | | -name: build |
| 1 | +name: Build Bitcoin Core Docker Images |
2 | 2 |
|
3 | 3 | on: |
4 | | - workflow_dispatch: |
5 | 4 | pull_request: |
6 | 5 | paths: |
7 | | - - '27.2/**' |
8 | | - - '28.2/**' |
9 | | - - '29.0/**' |
10 | | - - '29.1rc2/**' |
| 6 | + - '29.1/**' |
11 | 7 | - '30.0rc1/**' |
| 8 | + - 'common.nix' |
| 9 | + - 'shasums.nix' |
| 10 | + - 'flake.nix' |
| 11 | + - 'justfile' |
| 12 | + push: |
| 13 | + tags: |
| 14 | + - 'v*' |
| 15 | + workflow_dispatch: |
12 | 16 |
|
13 | 17 | jobs: |
14 | 18 | build: |
| 19 | + name: Build ${{ matrix.version }} |
15 | 20 | runs-on: ubuntu-latest |
16 | 21 | strategy: |
17 | 22 | matrix: |
18 | | - version: |
19 | | - - '29.1/alpine' |
20 | | - - '29.1' |
21 | | - fail-fast: true |
| 23 | + version: ['29.1', '30.0rc1'] |
| 24 | + fail-fast: false |
| 25 | + env: |
| 26 | + USERNAME: bitcoin |
22 | 27 | steps: |
23 | 28 | - name: Checkout |
24 | 29 | uses: actions/checkout@v4 |
25 | | - - name: Set up QEMU |
26 | | - uses: docker/setup-qemu-action@v3 |
27 | | - - name: Set up Docker Buildx |
28 | | - uses: docker/setup-buildx-action@v3 |
29 | | - |
30 | | - - name: Prepare Docker build |
31 | | - id: prepare |
32 | | - run: | |
33 | | - BITCOIN_VERSION=${{matrix.version}} |
34 | | - echo "Processing: $BITCOIN_VERSION" |
35 | | -
|
36 | | - # Check if the version ends with /alpine |
37 | | - if [[ $BITCOIN_VERSION == */alpine ]]; then |
38 | | - ALPINE=true |
39 | | - BITCOIN_VERSION=${BITCOIN_VERSION%/alpine} |
40 | | - else |
41 | | - ALPINE=false |
42 | | - fi |
43 | | -
|
44 | | - # Check if the version contains rc* |
45 | | - if [[ $BITCOIN_VERSION == *rc* ]]; then |
46 | | - RC=$(echo "$BITCOIN_VERSION" | grep -oP 'rc\d+') |
47 | | - BITCOIN_VERSION=${BITCOIN_VERSION%rc*} |
48 | | - else |
49 | | - RC="" |
50 | | - fi |
51 | | -
|
52 | | - LATEST_BITCOIN_MAJOR_VERSION=$(find . -maxdepth 1 -type d -not -path '*/\.*' -not -path '*/deprecated' -not -name '*rc*' -not -name 'master' | sort -V | tail -n 1 | cut -c 3- ) |
53 | | - PLATFORMS="linux/amd64" |
54 | | - PUSH=false |
55 | | - REPO=bitcoin/bitcoin |
56 | | - TAGS=() |
57 | | -
|
58 | | - # Split the extracted version into major, minor and patch variables |
59 | | - IFS='.' read -r MAJOR MINOR PATCH <<< "$BITCOIN_VERSION" |
60 | | -
|
61 | | - # Output the extracted version parts |
62 | | - echo "Major Version: $MAJOR" |
63 | | - echo "Minor Version: $MINOR" |
64 | | - echo "Patch Version: ${PATCH:-0}" |
65 | | - echo "RC: $RC" |
66 | | - echo "Latest major version: $LATEST_BITCOIN_MAJOR_VERSION" |
67 | 30 |
|
68 | | - # Add primary tags |
69 | | - if ! $ALPINE; then |
70 | | - # Non-alpine |
71 | | - if [[ -n "$RC" ]]; then |
72 | | - if [[ -n "$PATCH" && "$PATCH" -ne 0 ]]; then |
73 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}.${PATCH}${RC}") |
74 | | - else |
75 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}${RC}") |
76 | | - fi |
77 | | - elif [[ -n "$PATCH" && "$PATCH" -ne 0 ]]; then |
78 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}.${PATCH}") |
79 | | - TAGS+=("$REPO:${MAJOR}") |
80 | | - else |
81 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}") |
82 | | - TAGS+=("$REPO:${MAJOR}") |
83 | | - fi |
84 | | - else |
85 | | - # Alpine |
86 | | - if [[ -n "$RC" ]]; then |
87 | | - if [[ -n "$PATCH" && "$PATCH" -ne 0 ]]; then |
88 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}.${PATCH}${RC}-alpine") |
89 | | - else |
90 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}${RC}-alpine") |
91 | | - fi |
92 | | - elif [[ -n "$PATCH" && "$PATCH" -ne 0 ]]; then |
93 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}.${PATCH}-alpine") |
94 | | - TAGS+=("$REPO:${MAJOR}-alpine") |
95 | | - else |
96 | | - TAGS+=("$REPO:${MAJOR}.${MINOR}-alpine") |
97 | | - TAGS+=("$REPO:${MAJOR}-alpine") |
98 | | - fi |
99 | | - fi |
100 | | -
|
101 | | - # Create the stripped version including patch if it exists |
102 | | - if [[ -n "$PATCH" && "$PATCH" -ne 0 ]]; then |
103 | | - STRIPPED_VERSION="$MAJOR.$MINOR.$PATCH" |
104 | | - else |
105 | | - STRIPPED_VERSION="$MAJOR.$MINOR" |
106 | | - fi |
107 | | - echo "Stripped version: $STRIPPED_VERSION" |
108 | | -
|
109 | | - # Add any "latest" tags if not a release candidate |
110 | | - LATEST_MAJOR=$(echo "$LATEST_BITCOIN_MAJOR_VERSION" | awk -F. '{print $1}') |
111 | | - LATEST_MINOR=$(echo "$LATEST_BITCOIN_MAJOR_VERSION" | awk -F. '{print $2}') |
112 | | - LATEST_PATCH=$(echo "$LATEST_BITCOIN_MAJOR_VERSION" | awk -F. '{print $3}') |
113 | | -
|
114 | | - if [[ -z "$RC" && ("$MAJOR" -gt "$LATEST_MAJOR" || ("$MAJOR" -eq "$LATEST_MAJOR" && "$MINOR" -gt "$LATEST_MINOR") || ("$MAJOR" -eq "$LATEST_MAJOR" && "$MINOR" -eq "$LATEST_MINOR" && "${PATCH:-0}" -ge "${LATEST_PATCH:-0}")) ]]; then |
115 | | - if ! $ALPINE; then |
116 | | - echo "Version ${MAJOR}.${MINOR}.${PATCH} >= ${LATEST_BITCOIN_MAJOR_VERSION}, tagging as 'latest'" |
117 | | - TAGS+=("$REPO:latest") |
118 | | - TAGS+=("$REPO:${MAJOR}") |
119 | | - else |
120 | | - echo "Version ${MAJOR}.${MINOR}.${PATCH} >= ${LATEST_BITCOIN_MAJOR_VERSION}, tagging as 'alpine'" |
121 | | - TAGS+=("$REPO:alpine") |
122 | | - TAGS+=("$REPO:${MAJOR}-alpine") |
123 | | - fi |
124 | | - fi |
| 31 | + - name: Install Nix |
| 32 | + uses: cachix/install-nix-action@v31 |
| 33 | + with: |
| 34 | + nix_path: nixpkgs=channel:nixos-unstable |
| 35 | + github_access_token: ${{ secrets.GITHUB_TOKEN }} |
125 | 36 |
|
126 | | - if [[ $GITHUB_REF == "refs/heads/master" ]]; then |
127 | | - PUSH=true |
128 | | - fi |
| 37 | + - name: Setup Cachix |
| 38 | + uses: cachix/cachix-action@v15 |
| 39 | + with: |
| 40 | + name: bitcoin-core-docker |
| 41 | + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" |
129 | 42 |
|
130 | | - if ! $ALPINE; then |
131 | | - PLATFORMS="linux/amd64,linux/arm64,linux/arm/v7" |
132 | | - fi |
| 43 | + - uses: extractions/setup-just@v3 |
133 | 44 |
|
134 | | - echo "build_date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" | tee -a $GITHUB_OUTPUT |
135 | | - echo "docker_platforms=${PLATFORMS}" | tee -a $GITHUB_OUTPUT |
136 | | - echo "docker_username=bitcoin" | tee -a $GITHUB_OUTPUT |
137 | | - echo "push=${PUSH}" | tee -a $GITHUB_OUTPUT |
138 | | - echo "tags=${TAGS[@]}" | tee -a $GITHUB_OUTPUT |
| 45 | + - name: Set up Docker Buildx |
| 46 | + uses: docker/setup-buildx-action@v3 |
139 | 47 |
|
140 | | - - name: Login into Docker Hub |
| 48 | + - name: Login to Docker Hub |
| 49 | + if: startsWith(github.ref, 'refs/tags/v') |
141 | 50 | uses: docker/login-action@v3 |
142 | | - if: ${{ steps.prepare.outputs.push == 'true' }} |
143 | 51 | with: |
144 | | - username: ${{ steps.prepare.outputs.docker_username }} |
| 52 | + username: ${{ env.USERNAME }} |
145 | 53 | password: ${{ secrets.DOCKER_HUB_PASSWORD }} |
146 | 54 |
|
147 | | - - name: Build Docker image |
| 55 | + - name: Build images |
148 | 56 | run: | |
149 | | - TAGS=(${{ steps.prepare.outputs.tags }}) |
150 | | -
|
151 | | - echo "Build date: ${{ steps.prepare.outputs.build_date }}" |
152 | | - echo "Docker platform: ${{ steps.prepare.outputs.docker_platforms }}" |
153 | | - echo "Push: ${{ steps.prepare.outputs.push }}" |
154 | | - echo "Tags: ${{ steps.prepare.outputs.tags }}" |
| 57 | + just build-all ${{ matrix.version }} |
155 | 58 |
|
156 | | - echo docker buildx build --platform ${{ steps.prepare.outputs.docker_platforms }} \ |
157 | | - --output "type=image,push=${{steps.prepare.outputs.push}}" \ |
158 | | - --progress=plain \ |
159 | | - --build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \ |
160 | | - --build-arg "VCS_REF=${GITHUB_SHA::8}" \ |
161 | | - $(printf "%s" "${TAGS[@]/#/ --tag }" ) \ |
162 | | - ${{ matrix.version }}/ |
163 | | -
|
164 | | - docker buildx build --platform ${{ steps.prepare.outputs.docker_platforms }} \ |
165 | | - --output "type=image,push=${{steps.prepare.outputs.push}}" \ |
166 | | - --progress=plain \ |
167 | | - --build-arg "BUILD_DATE=${{ steps.prepare.outputs.build_date }}" \ |
168 | | - --build-arg "VCS_REF=${GITHUB_SHA::8}" \ |
169 | | - $(printf "%s" "${TAGS[@]/#/ --tag }" ) \ |
170 | | - ${{ matrix.version }}/ |
| 59 | + - name: Push images |
| 60 | + if: startsWith(github.ref, 'refs/tags/v') |
| 61 | + run: | |
| 62 | + just push ${{ matrix.version }} docker.io/${{ env.USERNAME }} |
0 commit comments