commit of ci tests #50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| name: CI/CD for Nix Dotfiles | |
| on: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| branches: | |
| - main | |
| jobs: | |
| build-docker-image: | |
| if: | | |
| github.event_name == 'push' || github.event_name == 'pull_request' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| packages: write | |
| outputs: | |
| image_name: ${{ steps.build.outputs.image_name }} | |
| build_ran: "true" | |
| steps: | |
| - name: Check out repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Check for file changes | |
| id: check_files | |
| run: | | |
| MODIFIED_FILES=$(git diff --name-only HEAD^ HEAD | \ | |
| grep -E 'nix_test_env/Dockerfile|nix_test_env/docker_entrypoint.sh') | |
| if [ -n "$MODIFIED_FILES" ]; then | |
| echo "build_ran=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "build_ran=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Build docker image | |
| if: steps.check_files.outputs.build_ran == 'true' | |
| id: build | |
| run: | | |
| IMAGE_NAME="nix-test-env:$(git rev-parse --short HEAD)" | |
| docker build -t ${IMAGE_NAME} -f ./nix_test_env/Dockerfile . | |
| echo "image_name=${IMAGE_NAME}" >> $GITHUB_OUTPUT | |
| - name: Log in and push Docker image to GHCR | |
| if: steps.check_files.outputs.build_ran == 'true' | |
| run: | | |
| echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u \ | |
| ${{ github.actor }} --password-stdin | |
| IMAGE_ID="ghcr.io/${{ github.repository }}/nix-test-env" | |
| COMMIT_TAG="${IMAGE_ID}:$(git rev-parse --short HEAD)" | |
| docker tag ${{ steps.build.outputs.image_name }} $COMMIT_TAG | |
| LATEST_TAG="${IMAGE_ID}:latest" | |
| docker tag ${{ steps.build.outputs.image_name }} $LATEST_TAG | |
| docker push $COMMIT_TAG | |
| docker push $LATEST_TAG | |
| tests: | |
| runs-on: ubuntu-latest | |
| if: | | |
| (github.event_name == 'push' || github.event_name == 'pull_request') && | |
| (needs.build-docker-image.outputs.build_ran == 'true' || | |
| needs.build-docker-image.outputs.build_ran == '') | |
| steps: | |
| - name: Check out repository | |
| uses: actions/checkout@v4 | |
| - name: Pull image with fallback in GHCR | |
| id: docker_pull | |
| run: | | |
| IMAGE_ID="ghcr.io/${{ github.repository }}/nix-test-env" | |
| COMMIT_TAG="${IMAGE_ID}:$(git rev-parse --short HEAD)" | |
| LATEST_TAG="${IMAGE_ID}:latest" | |
| echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u \ | |
| ${{ github.actor }} --password-stdin | |
| if docker pull $COMMIT_TAG; then | |
| echo "Successfully pulled commit-specific image: $COMMIT_TAG" | |
| echo "image_to_test=$COMMIT_TAG" >> $GITHUB_OUTPUT | |
| else | |
| echo "Commit-specific image not found. Falling back to latest." | |
| docker pull $LATEST_TAG | |
| echo "image_to_test=$LATEST_TAG" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Run container | |
| id: container | |
| run: | | |
| CONTAINER_NAME="nix-test-container" | |
| IMAGE_TO_TEST="${{ steps.docker_pull.outputs.image_to_test }}" | |
| echo "Running tests on image: $IMAGE_TO_TEST" | |
| docker run --name $CONTAINER_NAME \ | |
| -v ./nix_tests:/app/tests -d \ | |
| $IMAGE_TO_TEST tail -f /dev/null | |
| echo "container_name=$CONTAINER_NAME" >> $GITHUB_OUTPUT | |
| - name: Run all tests in container | |
| run: | | |
| docker exec ${{ steps.container.outputs.container_name }} \ | |
| /usr/local/bin/docker_entrypoint.sh \ | |
| /app/tests/run_all.sh | |
| - name: Clean up container | |
| if: always() | |
| run: docker rm -f ${{ steps.container.outputs.container_name }} |