diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index e6b63ae93..ad5083f6f 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -5,21 +5,24 @@ on: workflow_dispatch: pull_request: paths-ignore: - - '.github/workflows/build_test_publish.yml' - - 'docker/**' + - '.github/workflows/publish_latest.yml' + - '.github/workflows/publish_release.yml' - 'doc/**' - 'CHANGELOG.rst' push: paths-ignore: - - '.github/workflows/build_test_publish.yml' - - 'docker/**' + - '.github/workflows/publish_latest.yml' + - '.github/workflows/publish_release.yml' - 'doc/**' - 'CHANGELOG.rst' jobs: build-and-test: - runs-on: ubuntu-latest + permissions: + contents: read + packages: write + pull-requests: write strategy: fail-fast: false @@ -34,24 +37,73 @@ jobs: ] cyclus_tag: [ latest, + stable, ] - - container: - image: ghcr.io/cyclus/cyclus_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cyclus:${{matrix.cyclus_tag}} steps: + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout Cycamore - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Build Cycamore - run: | - python install.py --prefix=/root/.local --cyclus-root=/root/.local -j 2 --build-type=Release --core-version 99999.99999 + id: build-cycamore + continue-on-error: true + uses: docker/build-push-action@v5 + with: + file: docker/Dockerfile + cache-from: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache + cache-to: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache,mode=max + tags: ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-image-cache + push: true + build-args: | + pkg_mgr=${{ matrix.pkg_mgr }} + ubuntu_version=${{ matrix.ubuntu_versions }} + cyclus_tag=${{ matrix.cyclus_tag }} + + - name: Checkout Cymetric + if: ${{ github.event_name == 'pull_request' && steps.build-cycamore.outcome == 'success' }} + uses: actions/checkout@v4 + with: + repository: cyclus/cymetric + path: ${{ github.workspace }}/cymetric - - name: Cycamore Unit Tests - run: | - cycamore_unit_tests + - name: Build and Test Cymetric + if: ${{ github.event_name == 'pull_request' && steps.build-cycamore.outcome == 'success' }} + id: build-cymetric + continue-on-error: true + uses: docker/build-push-action@v5 + with: + context: ${{ github.workspace }}/cymetric + file: ${{ github.workspace }}/cymetric/docker/Dockerfile + cache-from: type=registry,ref=ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:ci-layer-cache + cache-to: type=registry,ref=ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:ci-layer-cache,mode=max + tags: ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:ci-image-cache + push: true + build-args: | + pkg_mgr=${{ matrix.pkg_mgr }} + ubuntu_version=${{ matrix.ubuntu_versions }} + cycamore_tag=ci-image-cache@${{ steps.build-cycamore.outputs.digest }} - - name: Cycamore Python Tests - run: | - export PYTHONPATH=$(find /root/.local/lib -type d -name 'python*.*' -print -quit)/site-packages - cd tests && python -m pytest + - name: PR Comment + if: ${{ github.event_name == 'pull_request' }} + uses: thollander/actions-comment-pull-request@v2 + with: + comment_tag: ${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}_${{ matrix.cyclus_tag }} + message: | + ## Build statuses using cyclus_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}:${{ matrix.cyclus_tag }} + - Cycamore: ${{steps.build-cycamore.outcome == 'success' && '*Success* :white_check_mark:' || + steps.build-cycamore.outcome == 'failure' && '**Failure** :x:' || + '**Skipped due to upstream failure** :warning:'}} + - Cymetric: ${{steps.build-cymetric.outcome == 'success' && '*Success* :white_check_mark:' || + steps.build-cymetric.outcome == 'failure' && '**Failure** :x:' || + '**Skipped due to upstream failure** :warning:'}} diff --git a/.github/workflows/build_test_publish.yml b/.github/workflows/build_test_publish.yml deleted file mode 100644 index fedd23c67..000000000 --- a/.github/workflows/build_test_publish.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Build and Publish Cycamore Images - -on: - # allows us to run workflows manually - workflow_dispatch: - pull_request: - paths: - - '.github/workflows/build_test_publish.yml' - - 'docker/**' - push: - branches: - - main - -jobs: - build-dependency-and-test-img: - runs-on: ubuntu-latest - - strategy: - matrix: - ubuntu_versions : [ - 20.04, - 22.04, - ] - pkg_mgr : [ - apt, - conda, - ] - - name: Installing Dependencies, Building Cycamore and Running Tests - steps: - - name: default environment - run: | - echo "tag-latest-on-default=false" >> "$GITHUB_ENV" - - - name: condition on trigger parameters - if: ${{ github.repository_owner == 'cyclus' && github.ref == 'refs/heads/main' }} - run: | - echo "tag-latest-on-default=true" >> "$GITHUB_ENV" - - - name: Log in to the Container registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Multi-Stage Build Action - uses: firehed/multistage-docker-build-action@v1 - with: - repository: ghcr.io/${{ github.repository_owner }}/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }} - stages: cycamore - server-stage: cycamore-test - quiet: false - parallel: true - tag-latest-on-default: ${{ env.tag-latest-on-default }} - dockerfile: docker/Dockerfile - build-args: pkg_mgr=${{ matrix.pkg_mgr }}, ubuntu_version=${{ matrix.ubuntu_versions }} \ No newline at end of file diff --git a/.github/workflows/changelog_test.yml b/.github/workflows/changelog_test.yml index 32cfe8671..9698acb8f 100644 --- a/.github/workflows/changelog_test.yml +++ b/.github/workflows/changelog_test.yml @@ -22,7 +22,7 @@ jobs: git --version - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - run: | git config --global --add safe.directory ${GITHUB_WORKSPACE} diff --git a/.github/workflows/publish_latest.yml b/.github/workflows/publish_latest.yml new file mode 100644 index 000000000..44c3e6d67 --- /dev/null +++ b/.github/workflows/publish_latest.yml @@ -0,0 +1,89 @@ +name: Publish Latest Cycamore + +on: + # allows us to run workflows manually + workflow_dispatch: + pull_request: + paths: + - '.github/workflows/publish_latest.yml' + push: + branches: + - main + +jobs: + build-dependency-and-test-img: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + matrix: + ubuntu_versions : [ + 20.04, + 22.04, + ] + pkg_mgr : [ + apt, + conda, + ] + + name: Build, Test, Publish + steps: + - name: Tag as ci-image-cache + run: | + echo "tag=ci-image-cache" >> "$GITHUB_ENV" + + - name: Tag as latest + if: ${{ github.repository_owner == 'cyclus' && github.ref == 'refs/heads/main' }} + run: | + echo "tag=latest" >> "$GITHUB_ENV" + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and Test Cycamore + id: build-cycamore + uses: docker/build-push-action@v5 + with: + cache-from: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache + cache-to: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache,mode=max + file: docker/Dockerfile + push: true + tags: ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:${{ env.tag }} + build-args: | + pkg_mgr=${{ matrix.pkg_mgr }} + ubuntu_version=${{ matrix.ubuntu_versions }} + cyclus_tag=latest + + - name: Checkout Cymetric + uses: actions/checkout@v4 + with: + repository: cyclus/cymetric + path: ${{ github.workspace }}/cymetric + + - name: Build and Test Cymetric + continue-on-error: true + uses: docker/build-push-action@v5 + with: + context: ${{ github.workspace }}/cymetric + file: ${{ github.workspace }}/cymetric/docker/Dockerfile + cache-from: type=registry,ref=ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:ci-layer-cache + cache-to: type=registry,ref=ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:ci-layer-cache,mode=max + tags: ghcr.io/cyclus/cymetric_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cymetric:${{ env.tag }} + push: true + build-args: | + pkg_mgr=${{ matrix.pkg_mgr }} + ubuntu_version=${{ matrix.ubuntu_versions }} + cycamore_tag=${{ env.tag }}@${{ steps.build-cycamore.outputs.digest }} + \ No newline at end of file diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml new file mode 100644 index 000000000..e1ab28891 --- /dev/null +++ b/.github/workflows/publish_release.yml @@ -0,0 +1,65 @@ +name: Publish Stable Cycamore + +on: + release: + types: [released] + +jobs: + build-and-test-for-release: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + strategy: + fail-fast: false + matrix: + ubuntu_versions : [ + 20.04, + 22.04, + ] + pkg_mgr : [ + apt, + conda + ] + + name: Build, Test, Publish + steps: + - name: Tag as ci-image-cache + run: | + echo "version_tag=ci-image-cache" >> "$GITHUB_ENV" + echo "stable_tag=ci-image-cache" >> "$GITHUB_ENV" + + - name: Tag as stable + if: ${{ github.repository_owner == 'cyclus' }} + run: | + echo "version_tag=${{ github.ref_name }}" >> "$GITHUB_ENV" + echo "stable_tag=stable" >> "$GITHUB_ENV" + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Checkout Cycamore + uses: actions/checkout@v4 + + - name: Build, Test, and Push Cycamore + uses: docker/build-push-action@v5 + with: + cache-from: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache + cache-to: type=registry,ref=ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:ci-layer-cache,mode=max + file: docker/Dockerfile + push: true + tags: | + ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:${{ env.version_tag }} + ghcr.io/cyclus/cycamore_${{ matrix.ubuntu_versions }}_${{ matrix.pkg_mgr }}/cycamore:${{ env.stable_tag }} + build-args: | + pkg_mgr=${{ matrix.pkg_mgr }} + ubuntu_version=${{ matrix.ubuntu_versions }} + cyclus_tag=stable diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ad902a555..b991df2c6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,7 +5,8 @@ cycamore Change Log .. current developments **Added:** -* GitHub workflows for building/testing on a PR and push to `main` (#549, #564) +* GitHub workflow for publishing images on release (#573) +* GitHub workflows for building/testing on a PR and push to `main` (#549, #564, #573) * Add functionality for random behavior on the size (#550) and frequency (#565) of a sink * GitHub workflow to check that the CHANGELOG has been updated (#562) * Added inventory policies to Storage through the material buy policy (#574) diff --git a/docker/Dockerfile b/docker/Dockerfile index 8d2d33952..8682a7c59 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,16 +1,17 @@ ARG pkg_mgr=apt ARG ubuntu_version=22.04 +ARG cyclus_tag=stable -FROM ghcr.io/cyclus/cyclus_${ubuntu_version}_${pkg_mgr}/cyclus as cycamore +FROM ghcr.io/cyclus/cyclus_${ubuntu_version}_${pkg_mgr}/cyclus:${cyclus_tag} as cycamore ARG make_cores=2 COPY . /cycamore WORKDIR /cycamore -RUN python install.py -j ${make_cores} --build-type=Release --core-version 99999.99999 +RUN python install.py -j ${make_cores} --build-type=Release --core-version 999999.999999 FROM cycamore as cycamore-test RUN cycamore_unit_tests -FROM cycamore as cycamore-pytest -RUN cd tests && python -m pytest +FROM cycamore-test as cycamore-pytest +RUN cd tests && python -m pytest \ No newline at end of file