-
Notifications
You must be signed in to change notification settings - Fork 208
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable multi-arch build for cilium-cli image #2782
base: main
Are you sure you want to change the base?
Conversation
Commits 42d8aa8, ed8ea68 do not match "Signed-off-by". Please follow instructions provided in https://docs.cilium.io/en/stable/contributing/development/contributing_guide/#developer-s-certificate-of-origin |
ed8ea68
to
0b948bf
Compare
0b948bf
to
e06aa0d
Compare
e06aa0d
to
2bf1e74
Compare
2bf1e74
to
ed22c94
Compare
ed22c94
to
8b4242d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@michi-covalent @tklauser with the merge of cilium-cli into cilium/cilium it's becoming confusing to where contributors can submit their changes for cilium-cli.
# when bumping to a new version analyze the new version for security issues | ||
# then use crane to lookup the digest of that version so we are immutable | ||
# crane digest tonistiigi/xx:1.5.0 | ||
FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0@sha256:0c6a569797744e45955f39d4f7538ac344bfb7ebf0a54006a0a4297b153ccf0f AS xx |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this really necessary? It shouldn't be since we cross compile cilium without tonistiigi/xx as an example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is required within Docker, to compile with CGO_ENABLED=0. Don't recall the exact reason, I think it was related to alpine based builds (muslc, vs glibc).
I also use some buildx features that allow caching and parallel builds for all the supported platforms to have a speedy and optimized build.
I contributed similar to the Spire project couple of years ago.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In essence the tool does following and is basically a small little wrapper.
https://github.com/tonistiigi/xx?tab=readme-ov-file#go--cgo
It wraps the go command by setting some variables accordingly based on the buildx args.
Saves a lot of plumbing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
re-requested review from andre. let's see what he says 🙏
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can still use the caches without using this dependency. Personally, I would prefer to not have any wrappers on official builds.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this isn't related to the caching only. It is also to set the go flags accordingly for crosscompile based on the TARGETPLATFORM and TARGETARCH which is a buildx feature.
It is used here https://github.com/cilium/cilium-cli/pull/2782/files#diff-dd2c0eb6ea5cfc6c4bd4eac30934e2d5746747af48fef6da689e85b752f39557R19
Without that we would have to do all the plumbing for that in the RUN statement. I'm not a fan of reinventing the wheel :)
Yes, now I'm confused 😕 Should I create such PR on the cilium repo? Maybe this repo has to be archived? Let me know how to proceed. |
sorry for the delay, we build release artifacts from this repo. assuming we want to build this docker image for each release tag, this is the right repo for this pull request. @marcofranssen let's limit this pull request to Dockerfile changes only. once it gets approved & merged, i'll make necessary changes to github workflows. |
8b4242d
to
1a22c85
Compare
Did another rebase to get branch fully in sync with upstream |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM overall, only one feedback regarding when to push to the non-CI repo.
pinging @aanm for re-review 🏓
@@ -57,10 +60,10 @@ jobs: | |||
ref: ${{ steps.tag.outputs.tag }} | |||
|
|||
# main branch or tag pushes | |||
- name: CI Build ${{ matrix.name }} | |||
- name: Build ${{ matrix.name }} | |||
if: ${{ github.event_name != 'pull_request_target' }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
let's run step only on tag push, not branch push. https://quay.io/repository/cilium/cilium-cli?tab=tags should only contain released images 🙏
if: ${{ github.event_name != 'pull_request_target' }} | |
if: ${{ github.ref_type == 'tag' }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@michi-covalent maybe github.ref_type == 'tag' && github.event_name == 'tag'
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was never changed. Happy to change it, but didn't want to modify the current pipeline behavior.
Let me know and I can perform the update.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not even sure if you want to change it, because this would allow the release of the image on merges to main using the commit hash.
So changing this would change the existing behavior as that step output is used during the Build here https://github.com/cilium/cilium-cli/pull/2782/files#diff-d0a3d6684c78a148cbf0725d5fe8b5aab6431da05b698a82c9e015516f3020baR99
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the latest workflow file looks good to me. just wanted to make sure we don't push to quay.io/cilium/cilium-cli on push to main branch 🚀🙏
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm don't we still end up pushing to quay.io/cilium/cilium-cli repo on push to main?
cilium-cli/.github/workflows/images.yaml
Lines 64 to 77 in f996cce
# main branch or tag pushes | |
- name: Build ${{ matrix.name }} | |
if: ${{ github.event_name != 'pull_request_target' }} | |
uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0 | |
id: docker_build_main | |
with: | |
context: . | |
file: ${{ matrix.dockerfile }} | |
target: ${{ matrix.name }} | |
platforms: ${{ matrix.platforms }} | |
push: true | |
tags: | | |
quay.io/${{ github.repository_owner }}/${{ matrix.name }}:latest | |
quay.io/${{ github.repository_owner }}/${{ matrix.name }}:${{ steps.tag.outputs.tag }} |
i suggest keeping this pull request for changing Dockerfile only. let's forcus on getting Dockerfile change merged in this PR. @tklauser and i will set up a release image workflow. we need to create a separate github environment anyways.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we'll do something like this for the release image workflow once the Dockerfile change gets merged => c6cfc8b
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@michi-covalent the separete github env is already created based on earlier feedback.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i didn't mean to update the workflow file to refer to a release environment. i need to configure a github environment for this repo and make sure that it works.
let's limit the scope of this pull request to the Dockerfile change 🙏
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Without the workflow it won't work right. Hence #2782 (comment)
The Github environment you have to configure basically needs to match the name here https://github.com/cilium/cilium-cli/pull/2782/files#diff-d0a3d6684c78a148cbf0725d5fe8b5aab6431da05b698a82c9e015516f3020baR31
Guess the only thing you need to do is configure the secrets for publishing the image int there.
Why don't you add the environment, (give it a different name to your desires) and then we update it here in the workflow.
I'm not fully getting the problem with the workflow here. Basically all required to use a different gh-env is in place. You only need to add the secret to it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@michi-covalent We recently changed the cilium-cli Dockerfile in cilium/cilium to add support for multi-arch. Can't we replace cilium/cilium-cli Dockerfile with the on we have in cilium/cilium?
@marcofranssen sorry for taking so much time to review the PR. I needed some time to think about it.
@@ -57,10 +60,10 @@ jobs: | |||
ref: ${{ steps.tag.outputs.tag }} | |||
|
|||
# main branch or tag pushes | |||
- name: CI Build ${{ matrix.name }} | |||
- name: Build ${{ matrix.name }} | |||
if: ${{ github.event_name != 'pull_request_target' }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@michi-covalent maybe github.ref_type == 'tag' && github.event_name == 'tag'
?
# when bumping to a new version analyze the new version for security issues | ||
# then use crane to lookup the digest of that version so we are immutable | ||
# crane digest tonistiigi/xx:1.5.0 | ||
FROM --platform=$BUILDPLATFORM tonistiigi/xx:1.5.0@sha256:0c6a569797744e45955f39d4f7538ac344bfb7ebf0a54006a0a4297b153ccf0f AS xx |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can still use the caches without using this dependency. Personally, I would prefer to not have any wrappers on official builds.
|
||
# cilium-cli-ci is based on ubuntu with cloud CLIs | ||
FROM ubuntu:24.04@sha256:99c35190e22d294cdace2783ac55effc69d32896daaa265f0bbedbcde4fbe3e5 AS cilium-cli-ci | ||
ENTRYPOINT [] | ||
LABEL maintainer="[email protected]" | ||
WORKDIR /root/app | ||
COPY --from=builder /go/src/github.com/cilium/cilium-cli/cilium /usr/local/bin/cilium | ||
COPY --link --from=builder /go/src/github.com/cilium/cilium-cli/cilium /usr/local/bin/cilium | ||
|
||
# Install cloud CLIs. Based on these instructions: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to https://github.com/cilium/cilium/blob/78b2e1a189bccd7c863715d3f7708f8fdab1cf59/cilium-cli/Dockerfile, I don't think this will work because, for example, awscli, downloaded on line 53, is for x86_64 only.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can tell you it does work.
The ci image is only build for amd64. If you want to add arm64 support for that image I'm happy to another PR for that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What I meant was that it will not work for arm64 because of the binary downloaded on line 53. The build will work but the resulting image will not work for arm64.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let me state it differently, because we are not building this image for arm64 in the workflow, it won't be a problem until we change that in the workflow.
For now this PR only focusses on building the cilium image in both architectures, the ci image will stay with amd64 support only.
0a6057e
to
e5221c1
Compare
Rebased PR again to resolve the merge conflict. |
Commit b9d0135 does not match "Signed-off-by". Please follow instructions provided in https://docs.cilium.io/en/stable/contributing/development/contributing_guide/#developer-s-certificate-of-origin |
b9d0135
to
553f2d9
Compare
Commit 553f2d9 does not match "Signed-off-by". Please follow instructions provided in https://docs.cilium.io/en/stable/contributing/development/contributing_guide/#developer-s-certificate-of-origin |
Signed-off-by: Marco Franssen <[email protected]>
Signed-off-by: Marco Franssen <[email protected]>
553f2d9
to
f996cce
Compare
Commit 553f2d9 does not match "Signed-off-by". Please follow instructions provided in https://docs.cilium.io/en/stable/contributing/development/contributing_guide/#developer-s-certificate-of-origin |
Rebased once more and signed off the one commit I forgot about. |
reminder for @tklauser and myself: set up |
ping @cilium/ci-structure for review 🚀🙏 edit: never mind, i requested to update this PR to only modify Dockerfile 👍 #2782 (comment) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, can't we replace cilium/cilium-cli Dockerfile with the on we have in cilium/cilium? It seems this remains unanswered.
|
||
# cilium-cli-ci is based on ubuntu with cloud CLIs | ||
FROM ubuntu:24.04@sha256:99c35190e22d294cdace2783ac55effc69d32896daaa265f0bbedbcde4fbe3e5 AS cilium-cli-ci | ||
ENTRYPOINT [] | ||
LABEL maintainer="[email protected]" | ||
WORKDIR /root/app | ||
COPY --from=builder /go/src/github.com/cilium/cilium-cli/cilium /usr/local/bin/cilium | ||
COPY --link --from=builder /go/src/github.com/cilium/cilium-cli/cilium /usr/local/bin/cilium | ||
|
||
# Install cloud CLIs. Based on these instructions: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What I meant was that it will not work for arm64 because of the binary downloaded on line 53. The build will work but the resulting image will not work for arm64.
What should I do to get this merged? I adjusted the workflow to use a separate GH environment for the release image? Went trough the open conversations but not sure how to progress now. I feel all required changes are in. |
There are still two open questions from @aanm which AFAICT haven't been addressed or answered: |
In a previous PR I contributed this was also already the question. It seems that is something to be figured out within the cilium repo owners. In my previous PR it was decided to continue using this repo until a decision is made. Would be great if we can unblock this PR and move forward and figure out the other part in a follow-up. |
I feel one was already answered, but gave it another shot with different wording. The other one seems to be unrelated to this PR. It was already a discussion on a previous PR and there it was decided to not hold back community contribution while the cilium team figures it out internally on how and when to make that change. |
This PR builds on top of #2842
It also includes the cilium-cli target to the build using multi-arch.
In the PR we levarage some buildx features like --cache and --link to improve the speed of builds for multi-arch.
Resolves #2780